ARM開発 on Linux


Ubuntu 16.04の場合


以前のページ


クロスコンパイラ等のインストール


sudo apt-get install gcc-arm-none-eabi gdb-arm-none-eabi  openocd

もし,通常のgdbがインストールされていると,マニュアルのオーバーライトのエラーがでる.
その時は,
sudo apt-get -o Dpkg::Options::="--force-overwrite" install gdb-arm-none-eabi
する.

libopencm3のインストール

gitでファイルをとってきて,コンパイルする

cd ~/program/ARM
git clone https://github.com/libopencm3/libopencm3
make CFLAGS=-std=c99    (C99モードにしないとエラーが出る)
git clone https://github.com/libopencm3/libopencm3-examples


Eclipseの設定


Eclipseのインストール
sudo apt-get install eclipse eclipse-cdt


新規プロジェクトを作ったら,パス等を設定

左のファイルツリーのプロジェクトの上で右クリックー>プロパティ
以下のように設定(例)
C/C++ build
    Settings の Tool Settings
       Cross GCC Compiler
          Symbols  に,”STM32F4”を追加
          IncludesのInclude Pathに,”(HOME)/program/ARM/libopencm3/include”,"/usr/lib/gcc/arm-none-eabi/(VERSION)/include"を追加
          MiscellaneousのOther flags に,"-c -fmessage-length=0 -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16"を追加

       Cross GCC Linker
          General の,"-nostartfiles"と"-static"にチェックを入れる.
          LibrariesのLibrariesに,”opencm3_stm32f4”,”nosys",”c”,”gcc”,"m"を追加  
          LibrariesのLibrary Search Pathに,”(HOME)/program/ARM/libopencm3/lib"を追加
          MiscellaneousのLinker flagsに,”-T../stm32f4-discovery.ld -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16”を設定
   
    Settings の Build Artifact
        Artifact name を ${ProjName}
          Artifact extention   を elfにする

    Settings の Build Steps
          Post-build stepsに”/usr/bin/arm-none-eabi- objcopy  ${ProjName}.elf ${ProjName}.bin -O binary”を設定


indexser の再構成


これで,コンパイルはできるはずだが,このままだと,ソース上にエラーがたくさん出てくるはず(変数の未定義など).
これは,インクルードファイルの中での定義(#define)が構文解析に反映されていないから.
そこで,メインウィンドウのメニューWindowからPreferenceを選び,C/C++のIndexerを探す.
この中のBuild configuration for the indexerが,Use the build configuration specified in the project's indexer settingになっていると思うので,これを,Use active build configurationに変更する.
その後,Project -> C/C++ index -> Rebuildで解決するはず.


デバッカの設定

 http://ksksue.com/wiki/doku.php?id=wiki:embedded:ubuntuopenocdを参考にした.

Run -> External Tool -> External Tool Configuration…  を選び,Programの下に新規のlaunch configurationを作成

名前はOpenOCDとしておく.
  Location  は,”/home/taka/data/program/ARM/sat/bin/openocd”
  Working Directory  は,"${workspace_loc}"
  Arguments  は,”-f /home/taka/data/program/ARM/sat/share/openocd/scripts/board/stm32f4discovery.cfg”
を設定

つぎに,プラグインをインストール.
Help -> Install New Software… でhttp://opensource.zylin.com/zylincdtを設定,インストールする.

Run -> Configuration(もしくは,コンパイル後のバイナリファイル上で右クリックしてDebug As -> Debug Configuratino)を選ぶ
Zylin Embedded Debug(Native)をみつけて,Launch Configurationを新規作成する.次の2つを作る.

(1)フラッシュ書き込み用

C/C++ Applicaion に"Debug/Eclipse-test.elf"を設定
DebuggerタブのGDB Debuggerに”/home/taka/program/ARM/sat/bin/arm-none-eabi-gdb”を設定
Commandsタブの"initialize"に
target remote localhost:3333
reset halt
mon poll
mon reset halt
mon sleep 10
mon flash probe 0
mon sleep 10
mon flash write_image erase /home/taka/source/ARM/Eclipse-test/Eclipse-test/Debug/Eclipse-test.bin 0x8000000
mon sleep 10
quit

を設定


(2)デバック用

Commandsタブの"initialize"に
target remote localhost:3333
mon poll
mon reset halt
load
monitor soft_reset_halt
thbreak main

を,Commandsタブの"Run"に
continue

を設定.その他は,(1)と同じ.

Run -> External Tool -> OpenOCDでOpenOCDが起動するはず.
Debugアイコンから,(1)を選べば書き込みができ,(2)でデバックできるはず.
もしくは,Debug Configurationsで起動したいものをダブルクリックする.





window -> show_view -> disassembly で,デバック時にアセンブリコードを見ることができる.
コンパイラがどんなコードを吐き出しているのか見るのに便利.

メモ: デバックで,一命令づつステップ実行させると,PendSVが発生しない.






結局,コンパイラ関連のオプションは,
コンパイラ:
-DSTM32F4 -I/home/tksr/data2/program/ARM/libopencm3-master/include -O0 -g3 -Wall -c -fmessage-length=0 -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16
リンカ:
-nostartfiles -static -L/home/tksr/data2/program/ARM/libopencm3-master/lib -T../stm32f4-discovery.ld -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16
となる.



OpenOCD:コマンドラインでの書き込み


/opt/sat/bin/openocd -f /home/taka/program/ARM/sat/share/openocd/scripts/board/stm32f4discovery.cfg
はroot権限でやらないと,起動できなかった.
なので,/etc/udev/rules.d/90-mydevice.rules等に
SUBSYSTEM=="usb", ACTION=="add", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="3748", MODE="0666"
を追加(または新規作成).
これで,一般ユーザーでも実行できる.

telnet localhost 4444

で,接続し, OpenOCD:コマンドラインでの書き込み

reset halt
flash erase_sector 0 0 11
flash write_image Eclipse-test.bin 0x8000000
reset

で書き込み,実行

ちなみに,
flash write_image erase Eclipse-test.bin 0x8000000
とすると,消去,書き込みが同時にできて簡単.







【メモ(落書き)】


リンカスクリプト: /home/taka/program/ARM/sat/arm-none-eabi/lib/libopencm3_stm32f4.ld
ここで, .vectorsによって割り込みベクトルテーブルが配置される.

(ベクトルテーブルの定義はどこ???)
/home/taka/program/ARM/sat/arm-none-eabi/include/libopencm3/cm3/vector.h に何やら書いてある.
libopencm3のソースファイルの lib/cm3/vector.cに.vectorsセクションの定義が書いてある.
どうやら,ここで定義されているっぽい.
このファイルで参照されている関数の実体を書けば,割り込み時に呼ばれる?
このvector.cはインストール時にコンパイルされるっぽいけど,どこにある??
        ー> /home/taka/program/ARM/sat/arm-none-eabi/lib/libopencm3_stm32f4.a っぽい.
          (readelf libopencm3_stm32f4.a -a とかすると,ハンドラの名前がたくさん出てくる)

/home/taka/program/ARM/sat/arm-none-eabi/include/libopencm3/stm32/f4/nvic.h
とかで,ハンドラが宣言されているので,これの実体を書けば良いと思う.
今後試してみる

libc.a, libm.a,crt0.o などは,/home/taka/program/ARM/sat/arm-none-eabi/lib/thumb/cortex-m4にあった.