[メモ] apache mynewt: Windowsでビルド



## 概要
- Windowsで。
- フォルダーパスの仕切り文字で問題が。。
    - `\` => `/` とりあえず置換。
- `-Dhogehoge=\"barbar\"`というとこでも問題が。
    - `/"`=>`\"`に戻す。


## 手順
### Windows向けツールのインストール (スペース` `の入らないフォルダへ)
- [git for Windows](https://git-for-windows.github.io/) => `C:\Tools\Git`
- [golang](https://golang.org/dl/ ) => `C:\Go` にインストール
- [gcc4.9ベースのARMクロスコンパイラ(arm-none-eabi)](https://launchpad.net/gcc-arm-embedded/4.9/4.9-2015-q3-update ) => `C:\Tools\arm_none_eabi\ `にインストール
- [SRecord For Windows](http://sourceforge.net/projects/srecord/files/srecord-win32/)から、`1.64` > `srecord-1.64-win32.zip`をダウンロード、`srec_cat.exe`を取得して、どこかPATHの通ったところにおいておく。(`C:\Tools\arm_none_eabi\bin`とかにいれちゃう？)

\# 今回使用したもの: [Git-2.9.2-64-bit.exe](https://github.com/git-for-windows/git/releases/download/v2.9.2.windows.1/Git-2.9.2-64-bit.exe)、[go1.6.3.windows-amd64.msi](https://storage.googleapis.com/golang/go1.6.3.windows-amd64.msi)、[gcc-arm-none-eabi-4_9-2015q3-20150921-win32.exe](https://launchpad.net/gcc-arm-embedded/4.9/4.9-2015-q3-update/+download/gcc-arm-none-eabi-4_9-2015q3-20150921-win32.exe)

### ファイルの準備とパッチ当て

1. Git Bash起動<br>![mynewt_win01.png](https://qiita-image-store.s3.amazonaws.com/0/75594/a53739c5-94d6-9b84-e178-e71a91ea6c9e.png)

2. 以下、実行

    ```bash:以下こぴぺ
# HOMEはおそらく、C:\Users\<User名>
echo $HOME
cd $HOME
mkdir -p dev/go 
cd $HOME/dev/go
export GOPATH=`pwd`
export PATH=$GOPATH/bin:$PATH
#
#
go get mynewt.apache.org/newt/...
#
cd src/mynewt.apache.org/newt/newt/
```

3. パッチを当てて、
`vi vendor/mynewt.apache.org/newt/util/util.go`

    ```go:vendor/mynewt.apache.org/newt/util/util.go
    log.Debug(cmdStr)
    //#mt08:以下2行追加..
    cmdStr = strings.Replace(cmdStr, "\\", "/", -1)
    cmdStr = strings.Replace(cmdStr, "/\"", "\\\"", -1)

    cmd := exec.Command("sh", "-c", cmdStr)
```

    `vi vendor/mynewt.apache.org/newt/util/util.go`

    ```go:cli/project_cmds.go
...
    //"os"  #コメントアウト
.
.
.
    //#mt08:Shellでrmを呼ぶことで対応
    //if err := os.RemoveAll(newDir + "/" + "/.git/"); err != nil {
    if _, err := util.ShellCommand("rm -rf "+ newDir + "/.git/"); err != nil {
        NewtUsage(cmd, err)
    }
...
```
4. `newt`をビルドする

    ```bash
cd $HOME/dev/go/src/mynewt.apache.org/newt/newt
go install
```

### ビルド: BLENanoのLチカ
- あとは [[メモ] mynewt:BLENanoでLチカ](http://qiita.com/mt08/items/60757f717c7b17e80cd3)とおなじ。

    ```bash
cd $HOME/dev
rm -rfv myproj
#
newt new myproj
cd myproj
#
#vi project.yml
# `project.yml`の`0-latest` => `0.0.0`に変更することで、developブランチから持ってくる.
sed -i 's/0-latest/0.0.0/' project.yml
#
newt install -v
# ファイルは、nrf51dkから持ってくる..そうしないとリンクエラーになる..
cd repos/apache-mynewt-core/hw/bsp/nrf51-blenano/
cp -v ../nrf51dk/*.ld ./.
cp -v ../nrf51dk/src/*.c ./src
cp -v ../nrf51dk/include/bsp/*.h ./include/bsp/
#
# vi include/bsp/bsp.h
## - include/bsp/bsp.h___21から19に変更。
## //#define LED_BLINK_PIN   (21)
## #define LED_BLINK_PIN   (19)
sed -i 's/(21)/(19)/' include/bsp/bsp.h
#
#
cd $HOME/dev/myproj
#
# ターゲット作成.
#Lチカ アプリ.
newt target create blink_blenano
newt target set blink_blenano app=apps/blinky
newt target set blink_blenano bsp=@apache-mynewt-core/hw/bsp/nrf51-blenano
newt target set blink_blenano build_profile=debug
# ブート.
newt target create blenano_boot
newt target set  blenano_boot app=@apache-mynewt-core/apps/boot
newt target set  blenano_boot bsp=@apache-mynewt-core/hw/bsp/nrf51-blenano
newt target set  blenano_boot build_profile=optimized
# 確認.
newt target show
# ビルド
newt build blenano_boot
newt build blink_blenano
# 署名?して、イメージ作成
newt create-image blink_blenano 1.0.0
#
# HEX イメージ作成.
srec_cat bin/blenano_boot/apps/boot/boot.elf.bin -binary  -offset=0x0 -o boot.hex -intel
srec_cat bin/blink_blenano/apps/blinky/blinky.img -binary  -offset=0x8000 -o img.hex -intel
srec_cat boot.hex -intel img.hex -intel -o img_OUT.HEX -intel --line-length=44
```

- => `img_OUT.HEX` を焼く。。 (修正されてなければ、5秒毎に点灯・消灯)


# その他
- なんか、重たいと感じて、タスクマネージャみたら、(ゾンビの)`newt`がフルに動いていた..
- OsTickのパッチ。あとで検討

    ```c:hw/mcu/nordic/nrf51xxx/hal_os_tick.c
    void
os_tick_init(uint32_t os_ticks_per_sec, int prio)
{
        uint32_t ctx;
        uint32_t mask;

    //
    os_ticks_per_sec *=8; //##mt08:2016-07-2x ぱっち... 約一秒くらいになった。
    //
        assert(RTC_FREQ % os_ticks_per_sec == 0);

        lastocmp = 0;
        timer_ticks_per_ostick = RTC_FREQ / os_ticks_per_sec;
...
```
    - 120回の os_time_delay(1000) が、ストップウォッチ(実時間)約117秒だった。
    - 32.768kHZのXtalがのってる => 32768kHz
    - 1msecを32クロックとしてないか？(0.768は誤差???)
    - (32000/32768) * 120 => 117.1875 ... むむむ??


- サンプルアプリのビルド
    - `myproj/repos/apache-mynewt-core/hw/bsp/nrf51-blenano/nrf51dk.ld` の FLASHのサイズ(LENGTH)をおおきくしとく。<br>=>
    `FLASH (rx) : ORIGIN = 0x00008000, LENGTH = 0x2b800`

    ```bash:bletiny
newt target create bletiny_blenano
newt target set bletiny_blenano app=@apache-mynewt-core/apps/bletiny
newt target set bletiny_blenano bsp=@apache-mynewt-core/hw/bsp/nrf51-blenano
newt target set bletiny_blenano build_profile=debug
#
newt build bletiny_blenano
#
newt create-image bletiny_blenano 1.0.0
# HEX イメージ作成.
srec_cat bin/blenano_boot/apps/boot/boot.elf.bin -binary  -offset=0x0 -o boot.hex -intel
srec_cat bin/bletiny_blenano/apps/bletiny/bletiny.img -binary  -offset=0x8000 -o img.hex -intel
srec_cat boot.hex -intel img.hex -intel -o img_OUT.HEX -intel --line-length=44
```

    ```bash:bleuart
newt target create bleuart_blenano
newt target set bleuart_blenano app=@apache-mynewt-core/apps/bleuart
newt target set bleuart_blenano bsp=@apache-mynewt-core/hw/bsp/nrf51-blenano
newt target set bleuart_blenano build_profile=debug
#
newt build bleuart_blenano
#
newt create-image bleuart_blenano 1.0.0
# HEX イメージ作成.
srec_cat bin/blenano_boot/apps/boot/boot.elf.bin -binary  -offset=0x0 -o boot.hex -intel
srec_cat bin/bleuart_blenano/apps/bleuart/bleuart.img -binary  -offset=0x8000 -o img.hex -intel
srec_cat boot.hex -intel img.hex -intel -o img_OUT.HEX -intel --line-length=44
```