090602

|



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

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]
$