セミホスティングの無効化

14 May 2014

セミホスティングに関してお教え下さい。

mbedLPC1768をMKD-ARMで使用しています。

プログラムはTCPEchoです。 http://mbed.org/users/mbed_official/code/TCPEchoServer/

オンラインコンパイラからExportしたプロジェクトをMKD-ARM上てビルドし、そのままRUN(実行)するとinit()関数内でBKPT命令で停止してしまいます。

これだとデバッグが出来ないのでmbed-srcのsemihost_api.c内のsemihost_uid()関数の入り口にreturn-1を書いて無効化しています。

MKD-ARM上でのデバッグが終わってから、このreturn-1を#ifdefで削除し再ビルドしてターゲットに転送しているんですが、何か正規の手法?や上手いやり方などあるようでしたらお教え下さい。 よろしくお願いします。

間違えてQustionsに投稿してしまい慌てたっす(^^;

日本語への翻訳、ご苦労様でした。 とても助かります。

14 May 2014

こんにちは。

セミホスティングを使用するプラットフォーム(mbed HDK を使用していないもの)では、BKPT命令でオンボードインタフェース側との処理制御を行います。デバッガを使用すると、ソフトウェアブレークポイントとして、デバッガが停止してしまうので再実行が行われません。デバッガの設定によっては、ベクターキャッチを無視することが出来る物がありますが、MDK-ARM では設定が無いようです。

正規の手法というのは無いと思いますが、以下の方法の方が少し簡単だと思います。

MDK-ARM や DS-5 等の ARM Compiler 限定の対応策になってしまいますが、シンボル定義へのパッチが使えます。

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0363e/Bcgeihci.html

MDK-ARM 側の適当なソースに以下の記述を追加します。

#ifdef __cplusplus
 #define EXTERN_C extern "C"
#else
 #define EXTERN_C extern
#endif
 
EXTERN_C int $Sub$$semihost_uid(char *) {
	return -1;
}

これによって、mbed library 側に含まれた $Super$$semihost_uid() 関数ではなく、ユーザコード側の $Sub$$semihost_uid() 関数が呼び出されるので、BKPT 命令は実行されません。

私の環境では、BKPT命令が実行されないのは確認できましたが、これがご期待の機能かどうか分かりませんので、ご確認をお願いします。

14 May 2014

おお! これはリターゲットってやつですか。

スタートアップ処理を追いかけていて$Sub$$mainでmbed_mainをコールしている処理を見かけました。

教えて頂いたとおりに早速使ったところ見事に希望の動作になりました。

>セミホスティングを使用するプラットフォーム(mbed HDK を使用していないもの)では、BKPT命令でオンボードインタフェース側との処理制御を行います。

この辺を全く理解していなくて分からなくて・・・ またトンチンカンな質問をしてしまうかと思います。 有り難うございました。

14 May 2014

こんにちは。

ご希望の動作だったようで、良かったです。

前の回答のリンク先が間違っていました。すみません。正しくは、こちらになります。

http://infocenter.arm.com/help/topic/com.arm.doc.dui0474jj/pge1362065967698_00004.html

コンパイラ独自の拡張機能で、シンボルを変更できない場合にパッチを適用する機能です。 なので、リターゲットとは少し違いますし、gccとかだと多分動きません。

この辺を全く理解していなくて分からなくて・・・ またトンチンカンな質問をしてしまうかと思います。 有り難うございました。

いえいえ。ここはどちらかというと mbed の内部構造的な話になってしまうので、ドキュメントも あまり用意されておりません。

今後とも、宜しくお願いします。

26 Jun 2014

もうちょっと楽な方法をみつけました。

void mbed_mac_address (char* mac) {
    mac[0] = 0x00;
    mac[1] = 0x02;
    mac[2] = 0xF7;
    mac[3] = 0xF0;
    mac[4] = 0x00;
    mac[5] = 0x00;
}

こんなコードをアプリのどっかに置いておけばいいと思いました。 これはmbed_mac_addressシンボルがmbedフレームワークの中ではWEAKシンボルであるためです。

26 Jun 2014

「セミホスティング前の段階で横取りしてしまう」方式ですね。了解しました。

WEAKはアセンブラだけでなく、Cコード中でも使えるとは・・・知らなかったです。

「mbed_mac_address」と言うヒントを頂いたので、mbed_interface.h内に以下の記述を見つけることが出来ました。

/** This returns a unique 6-byte MAC address, based on the interface UID
 * If the interface is not present, it returns a default fixed MAC address (00:02:F7:F0:00:00)
 *
 * This is a weak function that can be overwritten if you want to provide your own mechanism to
 * provide a MAC address.
 *
 *  @param mac A 6-byte array to write the MAC address
 */
void mbed_mac_address(char *mac);

勉強になります。有り難うございます。