yuqlidの日記

どっかの学生の雑記帳

SW4STM32でsemihostingが使いたい

はじめに

以前こんな記事を書きました.

yuqlid.hatenablog.com

この開発環境「SystemWorkbench for STM32(SW4STM32)」では,OpenOCDを用いたデバッグの時に,semihostingという機能が使えません.

semihostingとは

semihostingについての詳細はARMのページを参照してください.
ARM Information Center

ざっくりいうと,stm32とEclipseのコンソールにてprintf()関数やscanf()関数をやりとりするような機能です.僕は基本的にprintf()しか使ってません.
このsemihostingという機能は書き込みに使用するSWDの線のみでやりとりを行うため,簡単なデバッグをする際に非常に便利です.
今回はSW4STM32でsemihostingを使うためにやったことを紹介します.

やったこと

以前紹介した記事の「OpenSTM32 Community」内のForumsを探してみたのですが,まぁありますよね,みんなやりたいことは一緒なんだな,と
その結果色々出てきました.

http://www.openstm32.org/tiki-searchindex.php?filter~content=swd+print&sort_mode=score_ndesc

ここに書いてあったことをやっただけですが,備忘録としてまとめとこうかと.

プロジェクトの設定

以前の記事 yuqlid.hatenablog.com を元に,プロジェクトがすでに存在している前提で話を進めます.
プロジェクトを右クリック ->Properties -> C/C++ Build -> Settings -> MCU GCC Linker -> Miscellaneous
C++でプロジェクトを作っている場合は MCU GCC Linker -> MCU G++ Linker と読み替え)
Linker flagsのボックスに以下の文を追加します.

-specs=nosys.specs -specs=nano.specs -specs=rdimon.specs -lc -lrdimon

こんな感じです
f:id:Yuqlid:20161223183623p:plain

ソースコードの編集

以下の関数宣言を入れます.

extern void initialise_monitor_handles(void);

なお,C++で書いてる方は以下の用にしてください

extern "C"void initialise_monitor_handles(void);

main関数内部で呼んであげます.

void initialise_monitor_handles(void);

自由にprintf()関数を書き込みます.一例を置いときます.

sw4stm32_use_semihosting

この時,main.cと同じsrcフォルダに存在するsyscall.cは不要なので,削除するなり,ビルドから除外してください.
入れたままにしておくと重複定義(multiple definition)のエラーがでます.

デバッグの設定

Debug Configurations を開き,Startupタブ内部のボックスに以下の文を追加します.

monitor arm semihosting enable

f:id:Yuqlid:20161223183624p:plain

これですべての設定ができました. デバッグを実行(再生ボタンを押す)すると f:id:Yuqlid:20161223190437p:plain:w1800 Lチカが実行されます,ここで画像のようにconsoleをクリックしてやると,printf()関数の出力を確認することができます.

まとめ

SW4STM32のちょっとしたネタを紹介,まとめた. お役に立てば幸いです.