STM32/セミホスティングを使ってみる

OpenOCDでは、 Semihosting なるものをサポートしているとのこと。

ARM Information Center

これにより、デバッグの選択の余地が増えることを意味し、開発期間をより短くできる可能性を秘めていると思います。

Arduinoを使っていた場合はそのようなものはなく、

  1. USARTを使用して出力する
  2. SDカードにログとして保存する
  3. LCDなどに表示する

といったことをする必要があり、いずれも回路を追加する必要がありました。これはちょっと面倒です。1.はもっとも有力な選択肢になると思いますが他にUSARTを使用する場合はソフトウェアシリアルを追加で入れる必要がありました。2.と3.もできればしたくないです。

ともあれ、過去に構築方法を説明した SWSW4STM32 System Workbench for STM32 の環境でもSemihostingが使用できるので、活用しましょう。

Eclipseの設定

プロジェクトの設定

Project >> Properties を選択します。

Settings

左側のツリーは C/C++ Build >> Settings* を選択します。右側は Tool Settings タブを選択します。その下に表示されるツリーは MCU GCC Linker を選択します。 Linker flags に ** –specs=rdimon.specs -lrdimon** を追加します。

ソースの修正

Semihostingではprintf() などが使用できますが、その前に initialise_monitor_handles() を呼び出す必要があります。main() の先頭に記述しましょう。試しに、続けてprintf()を記述してみます。

/* USER CODE BEGIN 0 */
extern void initialise_monitor_handles(void);
/* USER CODE END 0 */
    :
int main(void)
{
  /* USER CODE BEGIN 1 */
  initialise_monitor_handles();
  printf("hello world\n");
  /* USER CODE END 1 */
    :

そうそう、試した限りでは、改行コード \n を記述しなければEclipseの Console タブに表示されませんでした。

あと、WEBページによっては -nostartfiles を削除する手順を紹介しているところもありましたが、特に実施しなくても文字列の出力ができました。もっとも誤った手順なのかもしれませんが…

ここまでできたら、ビルドします。

デバッグ時のオプション

Run >> Debug Configurations… を選択し、デバッグで使用している設定を選択します。

Commands Tab

Commands タブを選択し、 ‘Initialize’ commands に以下の1行を追加します。

monitor arm semihosting enable

実行

Debug ボタンを押下してみましょう。以下のように Console タブ上に以下のようなログが出力され、printf()で記述した内容も出力されると思います。

Open On-Chip Debugger 0.9.0 (2015-05-28-12:05)
Licensed under GNU GPL v2
For bug reports, read
    http://openocd.org/doc/doxygen/bugs.html
Info : FTDI SWD mode enabled
adapter speed: 300 kHz
adapter_nsrst_delay: 100
none separate
cortex_m reset_config sysresetreq
Info : clock speed 300 kHz
Info : SWD IDCODE 0x0bc11477
Info : stm32l0.cpu: hardware has 4 breakpoints, 2 watchpoints
Info : accepting 'gdb' connection on tcp/3333
Info : STM32L flash size is 64kb, base address is 0x8000000
adapter speed: 300 kHz
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0xf1000000 pc: 0x080005a0 msp: 0x20002000, semihosting
STM32L0: Enabling HSI16
adapter speed: 2500 kHz
Error: stm32l0.cpu -- clearing lockup after double fault
Warn : couldn't use loader, falling back to page memory writes
adapter speed: 300 kHz
target state: halted
target halted due to debug-request, current mode: Thread
xPSR: 0xf1000000 pc: 0x080005a0 msp: 0x20002000, semihosting
semihosting is enabled
hello world.

これで、よりお手軽にデバッグできます (^^)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください