2016年02月26日

Arduino/Genuino 101 の追加メモ 2016/02

Arduino/Genuino 101 の追加メモ 2016/02
前回,コンパイルができないと書いていたが,
つい最近Genuino101(=Arduino101)のコンパイラとライブラリのダウンロードができたので
コンパイルだけやってみた時のメモ。
使用OSはWindows10。

* ダウンロードと設定
(1) Arduino1.6.7をダウンロード
    https://www.arduino.cc/en/Main/Software
    適当に解凍する。
(2) arduino.exeでIDEを起動,
(3) 「ツール」-「マイコンボード」で「ボードマネージャ」で「Intel Curie Boards by Intel version」を
    探して「More info」をクリックでインストールする。
(4) 「ツール」-「マイコンボード」で 「Arduino 101」を選択して適当にBlink.ino等をコンパイルする。

* コンパイル結果ファイル群を得る
(1) AruinoIDEを終了します。これ大事。
(2) 以下の一行をエクプローラのアドレスバーにコピペしてエンターキーを押すと,
    %UserProfile%\AppData\Local\Arduino15\preferences.txt
    が編集可能になるので以下の一行をどこでもいいので追加します。
    build.path=build
    保存して終了します。
(3) ArduinoIDEを起動してもう一度Blink.ino等をコンパイルします。
(4) すると,arduino.exeがあるフォルダ直下に「build」フォルダができて,
    *.bin, *.elf, *.hex, *.map など
    おもしろそうなものが一式生成されています。:D

* 逆アセンブラファイルを得る
elfファイルがあるのでobjdumpにかけてみるとシンボル情報がstripされていて
もうひとつインパクトがないので,
以下に示す「arc-asm-list.bat」というファイルをarduino.exeと同じフォルダに置いてダブルクリックします。
すると同じフォルダに例えば「ARC-blink.ino.lst」という逆アセンブラファイルが得られます。
asm-list-arduino-v02-201602.zip
arc-asm-list.bat   --- Arduino101/Genuino101用(ARCマイコン用)
arm-asm-list.bat   --- ArduinoDue/Zero用(ARMマイコン用)
avr-asm-list.bat   --- ArduinoUNO/etc.用(AVRマイコン用)
の3つがパックされています。
例えばそれぞれ識別子としてリストファイルの先頭にARC-,ARM-,AVR-が付加されます。

 >arc-asm-list.bat
[ファイル名]

ELF file name = "build\blink.ino.elf"
Scketch  name = blink.ino
List file name= blink.ino.lst

[再リンク中...]

""C:\Users\[user]\AppData\Local\Arduino15\packages\Intel\tools\arc-elf32\1.6.4+1.0/bin/arc-elf32-gcc" -nostartfiles -nodefaultlibs -nostdlib -static -Wl,-X -Wl,-N -Wl,-mARCv2EM -Wl,-marcelf -Wl,--gc-sections "-TC:\Users\[user]\AppData\Local\Arduino15\packages\Intel\hardware\arc32\1.0.4\variants\arduino_101/linker_scripts/flash.ld" "-Wl,-Map,build/blink.ino.map" -o "build/blink.ino.elf" "-Lbuild" "-LC:\Users\[user]\AppData\Local\Arduino15\packages\Intel\hardware\arc32\1.0.4\variants\arduino_101" -Wl,--whole-archive "-larc32drv_arduino101" -Wl,--no-whole-archive -Wl,--start-group "-larc32drv_arduino101" -lc -lm -lgcc "build\sketch\blink.ino.cpp.o" "build\core\variant.cpp.o" "build/core\core.a""

[リストファイルを生成]

"C:\Users\[user]\AppData\Local\Arduino15\packages\Intel\tools\arc-elf32\1.6.4+1.0/bin\arc-elf32-objdump -h -dS  "build\blink.ino.elf" > "blink.ino.lst""

[サイズ情報]
   text    data     bss     dec     hex filename
  14644    3172   12672   30488    7718 build\Blink.ino.elf

[終了]
これがARCコアの逆アセンブルリスト。
 void variantAdcInit(void)
{
400373a0:    fc 1c c8 b6                 st.a       fp,[sp,-4]
400373a4:    9b 43                       mov_s      fp,sp
    uint32_t creg;
    uint32_t saved;

    /* read creg slave to get current Power Mode */
    creg = READ_ARC_REG(AR_IO_CREG_SLV0_OBSR);
400373a6:    2a 20 80 0f 01 80 80 80     lr         r0,[0x80018080]

    /* perform power up to "Normal mode w/o calibration" cycle if not already there */
    if( (creg & ADC_MODE_MASK) != ADC_NORMAL_WO_CALIB){
400373ae:    c2 b8                       bmsk_s     r0,r0,2
400373b0:    35 08 11 01                 brne       r0,4,400373e4 

        interrupt_unlock(saved);
        /* Poll CREG Slave 0 for Power Mode status = requested status */
        while ( ((creg = READ_ARC_REG(AR_IO_CREG_SLV0_OBSR)) & 0x8) == 0);
    }

    WRITE_ARC_REG(ADC_CLK_ENABLE | ADC_INT_DSB, ADC_CTRL);
400373b4:    c3 40 01 80 03 50           mov_s      r0,0x80015003
400373ba:    2b 26 00 70 00 00 04 0f     sr         0xf04,[r0]
    WRITE_ARC_REG(ADC_CONFIG_SETUP, ADC_SET);
400373c2:    c3 40 01 80 00 50           mov_s      r0,0x80015000
400373c8:    2b 26 00 70 00 00 0b 00     sr         11,[r0]
    WRITE_ARC_REG(ADC_CLOCK_RATIO &ADC_CLK_RATIO_MASK, ADC_DIVSEQSTAT);
400373d0:    c3 40 01 80 01 50           mov_s      r0,0x80015001
400373d6:    2b 26 00 70 00 00 20 00     sr         32,[r0]

}
400373de:    e0 7f                       j_s.d      [blink]
400373e0:    04 14 1b 34                 ld.ab      fp,[sp,4]
* コンパイラやライブラリのありか 以下をエクプローラのアドレスバーにコピペしてエンターキーを押すと, %UserProfile%\AppData\Local\Arduino15\packages\Intel そのなかに必要なものが一式ある感じです。 リンカスクリプトやスタートアップコードやライブリコード等,必要そうなものがあり, ライセンスはLGPLやBSDだったりします。 * あれ? Intel i386じゃないの?! で,どうも勘違いしていたようで, Aruino101でユーザがコンパイル/アップロードして使うマイコンは ARCプロセッサ でした。 (OO) http://www.synopsys.com/jp2/IP/ProcessorIP/ARCProcessors/Pages/default.aspx https://en.wikipedia.org/wiki/ARC_%28processor%29 * コードサイズがデカイ? 以前使っていた多倍長演算のベンチマークコードがあって,これをAruduino UNOで コンパイルすると Flash 4980バイトでした。 これをArduino101でコンパイルすると, Flash 57Kバイトでした。 いじめでしょうか? orz orz リストファイルをみると浮動小数演算とprintf関連のライブラリがくっついてきて結構大きくなった感じ。 それでもまだ130KBバイト以上残っているので気にしないことにしようかな。 xD ちなみにprint文をカットしてみると,
 [サイズ情報]
   text    data     bss     dec     hex filename
  15988    3168   12744   31900    7c9c build\bench_muls.ino.elf
57KB - 16KB = 41KB というこでprint系のオーバヘッドは約40KBでした。 Arduino UNOに比べれば自由人 !! * 正味のコードサイズ なんとARCコアはコードサイズがデカイ。ARMの4倍以上デカイ。 可変長命令なのでこんなものなのか? まぁFlash192KBあるからよしとしよう :D 実行速度はキャッシュが8KBあるし,クロック32MHzなので32MIPS強くらいあるかもしれない。
setup()とloop()が空っぽ テストコード 正味のコードサイズ
Arduino UNO500バイト2516バイト2016バイト
Arduino Zero8196バイト8788バイト592バイト
Arduino Due11116バイト11700バイト584バイト
Aruino 10116724バイト19148バイト2424バイト
この表のテストコードはprint文なしです。 * Intel i386コア? i386がホストマイコンということなんだけど どこで出てくるんだろう? xD


posted by Copyright (C) avrin All Rights Reserved. at 00:00| Comment(2) | duino系 | このブログの読者になる | 更新情報をチェックする
この記事へのコメント
Arduino 1.0.6 で avr-asm-list.bat が動作しました
但し、preferences.txt は C:\Users\xxxxxxxx\AppData\Roaming\Arduino\ にあり
C:\Program Files\Arduino フォルダがリードオンリーだったのでフルコントロールへ設定変更しました。

Posted by koujikuu at 2016年03月10日 21:29
こんばんわ
情報ありがとうございます。
古いArduinoIDEは見逃していました。
でも,arduino.orgも同じみたいです。orz
ブログにはそのうち追記しておきます。
Posted by audin at 2016年04月03日 23:54
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
×

この広告は180日以上新しい記事の投稿がないブログに表示されております。