【ARM C Compiler】セミホスティングを無効化する方法

ARM C Compiler(armcc/armclan)でビルドすると、デフォルトでセミホスティングを使おうとしてしまいます。

セミホスティングに対応していないシステムでARM C Compilerを使う場合には、これがトラブルの元になるんですよね。。。

そんなときは、セミホスティングを無効化してしまいましょう。

セミホスティングとは?

セミホスティングについては、ARMのこちらに詳しく解説されています。
ARM Information Center : セミホスティング

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

セミホスティングを無効化する方法はこちらを見てください。
ARM Information Center : 非セミホスティング環境向けのアプリケーションの作成

とはいっても、具体的にどうすればいいかよくわかりませんよね。。。

具体的なコード

ということで、具体的なコードのご紹介です。

#include <rt_sys.h>

#if (__ARMCC_VERSION < 6000000)
#pragma import(__use_no_semihosting)
#else
void use_no_semihosting(void)
{
    __asm(".global __use_no_semihosting\n\t");
}
#endif

char *$Sub$$_sys_command_string(char *cmd, int len)
{
    return 0;
}

__attribute__((noreturn)) void $Sub$$_sys_exit(int return_code)
{
    while(1);
}

__attribute__((noreturn)) int $Sub$$__raise(int signal, int type)
{
    while(1);
}

このコードをコンパイル、リンクすればOKです。

__use_no_semihostingが「セミホスティングは使わないよ」という指定です。ARM C Compiler 6.xとそれ以前で指定方法がちょっと違うので#ifで場合分けしています。

そのあとに続くのが、セミホスティングに関係する関数の独自実装です。ARM C Compilerが持つライブラリ内にも同じ関数があるのですが、そちらはセミホスティング前提の処理になっているので、これをセミホスティングを使わない独自実装の関数に置き換えます。

上のコードでは、関数名に$SUB$$を付けてパッチを充てる方法で置き換えをしています。パッチに関してはこちらを読んでください。
ARM Information Center : $Super$$ と $Sub$$ を使用したシンボル定義へのパッチの適用について

また、上のコードでは何もしない空関数に置き換えていますが、例えばシリアルにメッセージを出力するとか、システムに応じて書き換えてください。

もし、リンク時に

Error: L6915E: Library reports error: __use_no_semihosting was requested, but __xxx was referenced

のようなエラーメッセージが表示されたら、上記コードと同様にその関数を実装してください。

これでセミホスティングを無効化できます。