You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@mynewt.apache.org by "Christopher Collins (JIRA)" <ji...@apache.org> on 2017/06/09 00:30:18 UTC

[jira] [Updated] (MYNEWT-364) Don't use bash scripts

     [ https://issues.apache.org/jira/browse/MYNEWT-364?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Christopher Collins updated MYNEWT-364:
---------------------------------------
    Fix Version/s:     (was: v1_1_0_rel)

> Don't use bash scripts
> ----------------------
>
>                 Key: MYNEWT-364
>                 URL: https://issues.apache.org/jira/browse/MYNEWT-364
>             Project: Mynewt
>          Issue Type: Bug
>      Security Level: Public(Viewable by anyone) 
>          Components: Newt
>    Affects Versions: v0_9_0
>         Environment: Ubuntu 14.10 using the Docker version of newt
>            Reporter: Tim
>            Assignee: Christopher Collins
>
> The download and debug scripts are currently written using Bash. That is unfortunate because Bash is very error-prone and scripts tend to be buggy. Also, it makes distribution on Windows much harder.
> You're already using Go, I'd suggest rewriting them using that. Alternatives are Python, Powershell, Lua, etc.
> I've rewritten nrf52_download.sh in Go (below; compiled but not tested). It was very easy, and is only 7 lines longer (due to extra error checking/reporting).
> The main downside is the size - 2.7 MB, but it can be reduced to 523 kB by stripping debug symbols and compressing it with upx. I think that is reasonable for now. You can combine debug and download scripts for further savings if necessary.
> {code}
> // Licensed to the Apache Software Foundation (ASF) under one
> // or more contributor license agreements.  See the NOTICE file
> // distributed with this work for additional information
> // regarding copyright ownership.  The ASF licenses this file
> // to you under the Apache License, Version 2.0 (the
> // "License"); you may not use this file except in compliance
> // with the License.  You may obtain a copy of the License at
> //
> //   http://www.apache.org/licenses/LICENSE-2.0
> //
> // Unless required by applicable law or agreed to in writing,
> // software distributed under the License is distributed on an
> // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
> // KIND, either express or implied.  See the License for the
> // specific language governing permissions and limitations
> // under the License.
> package main
> import (
> 	"fmt"
> 	"io/ioutil"
> 	"log"
> 	"os"
> 	"os/exec"
> 	"strings"
> )
> func main() {
> 	if len(os.Args) == 1 {
> 		log.Fatalf(`
> Usage: {} <bsp_directory_path> <binary> [features...]
>   - bsp_directory_path is absolute path to hw/bsp/bsp_name
>   - binary is the path to prefix to target binary, .elf.bin appended to this
>     name is the raw binary format of the binary.
>   - features are the target features. So you can have e.g. different
>     flash offset for bootloader 'feature')
> `, os.Args[0])
> 	}
> 	if len(os.Args) < 3 {
> 		log.Fatal("Need binary to download")
> 	}
> 	// Look for 'bootloader' from 3rd arg onwards (in the features)
> 	isBootloader := false
> 	if len(os.Args) > 3 {
> 		for i := range os.Args[3:] {
> 			if os.Args[i] == "bootloader" {
> 				isBootloader = true
> 			}
> 		}
> 	}
> 	basename := os.Args[2]
> 	flashOffset := 0x8000
> 	filename := basename + ".img"
> 	if isBootloader {
> 		flashOffset = 0
> 		filename = basename + ".elf.bin"
> 	}
> 	gdbCmdFile := ".gdb_cmds"
> 	log.Printf("Downloading %s to %#x", filename, flashOffset)
> 	// XXX for some reason JLinkExe overwrites flash at offset 0 when
> 	// downloading somewhere in the flash. So need to figure out how to tell it
> 	// not to do that, or report failure if gdb fails to write this file
> 	gdbCmds := fmt.Sprintf(`
> shell /bin/sh -c 'trap \"\" 2;JLinkGDBServer -device nRF52 -speed 4000 -if SWD -port 3333 -singlerun' & 
> target remote localhost:3333
> restore %s binary %#x
> quit
> `, filename, flashOffset)
> 	err := ioutil.WriteFile(gdbCmdFile, []byte(gdbCmds), 0664)
> 	if err != nil {
> 		log.Fatalf("Error writing to %s: %v", gdbCmdFile, err)
> 	}
> 	defer os.Remove(gdbCmdFile)
> 	msgs, err := exec.Command("arm-none-eabi-gdb", "-x", gdbCmdFile).CombinedOutput()
> 	ioutil.WriteFile(".gdb_out", msgs, 0664)
> 	if err != nil {
> 		log.Fatalf("Error running gdb: %v", err)
> 	}
> 	smsgs := string(msgs)
> 	if strings.Contains(smsgs, "error") ||
> 		strings.Contains(smsgs, "failed") ||
> 		strings.Contains(smsgs, "unknown / supported") ||
> 		strings.Contains(smsgs, "No such file or directory") {
> 		os.Exit(1)
> 	}
> }
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)