2013年9月5日木曜日

mbedでセミホスティング

mbedで(pyOCD+CMSIS-DAP)のサブセットでセミホスティングするようにしてみました。
動作を確認できたのは SYS_OPEN,SYS_CLOSE,SYS_READ,SYS_WRITE,SYS_FLEN,SYS_SEEK,SYS_REMOVE,SYS_RENAME,SYS_EXIT,USR_UID です。
つまり、mbedのLocalFileSystemクラス、mbed_mac_address()がハングアップしないで使えるようになりました。
しかし、mbed_interface_connected()でセミホスティングされているのを予め知る事が出来るのを今更ながら気がついた。

更に SYS_WRITEC を実装したので、SWDでコンソール出力を出来るようにしました。
__semihost(SYS_WRITEC,&c) で文字cを送ります。
ただし、uartに比べると非常に遅いです。

LPC1114FN28が bkpt #ab を実行、停止する。
mbedがSWDでDHCSR(Debug Halting Control and Status Register)をポーリングしてhaltを検出。
pcプログラムカウンタ読み取る、pcにbkpt #abを確認。
r0レジスタを読み取る、SYS_WRITECを確認。
r1レジスタを読み取る、ポインタ先を読み取って表示文字を取得、コンソールに表示する。
pcをbkptの次のアドレスに移して、resumeする。
LPC1114FN28が動作再開する。

標準出力をuartからSWDに簡単に変更出来ないかと調べたが、
retarget.c の PREFIX(_write)でファイルハンドルfhが0,1,2の場合、つまり標準入出力の場合は
データをSerialに送るようにしている。
再ビルドすればいいのだろうけど、動的に変更するのは難しそう。

(2013/9/5)
---
|mbed_interface_connected()でセミホスティングされているのを予め知る事が出来るのを今更ながら気がついた。

mbed_interface_connected()でわかるのはLPC1768のCortex-M3プロセッサだけで、
LPC1114,LPC810のCortex-M0、M0+ではプロセッサで自分自身のコアデバッグレジスタを読み取る事ができない。
mbedライブラリでは常にセミホストに接続状態にしています。

(2014/2/21追加)
---

0 件のコメント: