あなたの天然記念物
ホーム更新雑談Perl鉄ゲタランドナーコースガイド自転車Linuxリンク経歴連絡先

FreeRTOSでセミホスト表示 (2013.03.22)

解説

開発環境がLPCXpressoと通信できていて、セミホストのプロジェクトならprintfで開発環境のコンソールに表示できるのだから、 FreeRTOSでもタスク間競合を別にして表示できてよさそうなので、頑張りました。 セミホストのプロジェクトを実行してアセンブラのステップ実行でセミホストの仕掛けを探った訳です。 あ、コレを使う時はプロジェクトのデバッガで起動時にセミホストを使う設定にしてください。 セミホストを使う設定

表示関数

本当は__asmに対してパラメタを渡せるようで関数のパラメタを__asmへきちんとつなぐべきなのですが__asmへの渡し方がわからないので 関数の逆アセンブラを見て第1パラメタがr0に入るのがわかったのでそのまま利用しています。 ソースに手を加えるとr0に第1パラメタが入らないケースが出てくるのでご注意ください。
// デバッグ用コンソールへ文字列(終端\0)を表示
void ksrk_trace_s(char *msg)
{
	// 第1パラメタmsgがr0に来ます。
	__asm volatile (
		"		push	{r1, r2}\n"
		// バイト数取得
		"		mov		r1, #0\n"
		"loop:	ldrb	r2, [r0, r1]\n"
		"		teq		r2, #0\n"
		"		itt		ne\n"
		"		addne	r1, #1\n"
		"		bne		loop\n"
		// パラメタ設定
		"		push	{r1}\n"
		"		push	{r0}\n"
		"		mov		r0, #1\n"
		"		push	{r0}\n"
		"		mov		r0, #5\n"
		"		mov		r1, sp\n"
		// r0 = 5
		// r1 = &{文字列バイト数, 文字列の先頭アドレス, 1}
		"		bkpt	0x00ab\n"
		"		add		sp, #12\n"
		"		pop		{r1, r2}\n"
	);
}

今回の鉄ゲタは…

今回はありません。ほっ。