DRO01_IO、DRO01と接続して動作するとこまで進めました。DRO01のプログラムも
DRO01_IOに都合のいいように多少変更しました。

しかし、問題をみつけた。シリアルの入出力が激しくなると
ちょっと追い切れず、シェルにエコーバックしないモードをつけてごまかして しまった。エコーバックしたのは相手先で無効なコマンドになるので、しないのが 正しいのだけど。しても動かないとおかしい。ここは後で調べよう。
DRO01_IO(H8/3694)はRAM2KBなのに4スレッド。H8/Tinyで富豪的アプローチの限 界かな。
D Z:::000 D X::-584 D X::-583 D Y:::000こういう形でDRO01はDRO01_IOにコマンドを送ります。DRO01_IOは
zero 0 zero 1 zero 2のようにゼロリセットコマンドをDRO01に送ります。

しかし、問題をみつけた。シリアルの入出力が激しくなると
>monitor_wait: [2] stealed lock from [1] Asssertion failed. ../../kernel/monitor.c, 210 caller:0x2412で止まってしまう、あるいはデッドロックしてしまう。どこかモニタ(同期プリ ミティブ) にバグがある。
ちょっと追い切れず、シェルにエコーバックしないモードをつけてごまかして しまった。エコーバックしたのは相手先で無効なコマンドになるので、しないのが 正しいのだけど。しても動かないとおかしい。ここは後で調べよう。
DRO01_IO(H8/3694)はRAM2KBなのに4スレッド。H8/Tinyで富豪的アプローチの限 界かな。
void
board_main (uint32_t arg)
{
shell_command_register (&D_cmd);
// Application thread.
thread_t app_th = thread_create (app_tls, THREAD_STACKSIZE_DEFAULT, "display",
display_thread, 0);
thread_start (app_th);
shell_set_device (SERIAL, SERIAL, FALSE);
shell_prompt ();
ここでDRO01からの入力を待って、登録された'D'コマンドならば下のD ()を実行。
/* NOTREACHED */
}
void
display_thread (uint32_t arg)
{
thread_priority (current_thread, PRI_HIGH); // highest
while (/*CONSTCOND*/1)
{
LEDを点灯して、プッシュボタンをポーリングし続けるだけ。
display ();
poll_switch ();
}
// NOTREACHED
}
uint32_t
D (int32_t argc, const char *argv[])
{
if (argc < 2)
return -1;
DRO01からのコマンドからLCDに送り出すバッファを作成。
prepare_digit_buffer (argv[1]);
return 0;
}
void
display ()
{
#define DELAY_USEC 1000
int32_t i, j, k;
18桁のLEDダイナミック点灯。
for (k = j = 0; k < 3; k++)
{
uint8_t *p = display_buffer[k];
for (i = 0; i < 6; i++, j++)
{
*PDR8 = p[i];
*commons[j].reg = commons[j].bit;
timer_sleep (DELAY_USEC);
ここで寝ている間にシェルが動く。
*commons[j].reg = 0;
}
}
}
$ tip hmon57600
connected
stack_start: 0xff80
ROM data: 0x2f90-0x3018
RAM data: 0xf780-0xf808 136byte
bss: 0xf808-0xff2c 1828byte
NMI return address|CCR: 8000039a
delay_div=252
calibrated. delay_div=250
---Monitor---
W ringbuffer
lock :
event: 3(sci send) 1(root)
U ringbuffer
lock :
event:
---Ready Queue---
<0>:
<1>:
<2>:
<3>: 1
---Thread Status---
id pri(used/total)
[4] W 0 (96/256) display
[3] W 1 (110/256) sci send
[2] W 0 (122/256) sci recv
[1] R 3 (182/384) root
---Monitor---
W ringbuffer
lock :
event: 3(sci send) 1(root)
U ringbuffer
lock :
event:
---Ready Queue---
<0>:
<1>:
<2>:
<3>: 1
---Thread Status---
id pri(used/total)
[4] W 0 (96/256) display
[3] W 1 (110/256) sci send
[2] W 0 (122/256) sci recv
[1] R 3 (198/384) root
zero 0
zero 0
zero 1
zero 1
zero 1
zero 1
zero 2
zero 2
zero 2
zero 2
~
[EOT]
$
