090114

|
>



16キーのテストをしました。10Kのプルアップ抵抗を狭んでH8のポートにつなぐ
だけ。このくらいならテストなしでもいけそうだけれど、ソフト側のメッセー
ジ処理とかを決めておきたいので。

ほんとにたまーにしか入力されないボタンをポーリングするのは、とてもリソー ス的に嫌なので、なんとかエッジで割りこみかけれないかな...とも思ったのだ けれど、とんでもないことになりそうなので、ここも富豪的に。リソースが足 りないならCPUを足す方向で。リフレッシュコントローラをインターバルタイマ にしてCPUクロックの4096分周を201カウントで33msecごとにサンプリングする ことにしました。

プログラムをROMにもっていってみるとうまく動かない。nmしてみるとわかった。 そいえば.dataのコピー処理してなかった。今迄小さいプログラムだったので意 図的に.rodataと.bssに振り分けて書くことでなんとかなってたのだけど、そろ そろちゃんとしないと。
OUTPUT_FORMAT ("coff-h8300")
OUTPUT_ARCH (h8300h)

MEMORY {
       vectors	: o = 0x00000, l = 0x4
       intvecs	: o = 0x00030, l = 0xc4
       intram	: o = 0xfdf10, l = 0x2000
       rom	: o = 0x00100, l = 0x7ff00
}

SECTIONS {
	 _stack_start = 0xfff10;
	 .vectors :
	 {
		*(.vectors)
	 } > vectors

	 .intvecs :
	 {
		*(.intvecs)
	 } > intvecs

	 .text :
	 {
	 	 *(.text)
		 *(.rodata)
		 . = ALIGN (4);  次の.dataセクションが4byteアラインで始まるようにします。
	 } > rom

	 _rom_data_start = .; これはLMA
	 .data :
	 AT (ADDR (.text) + SIZEOF (.text))
AT()を使ってLMA(ロードされるアドレス)と、VMA(実際にリンクされるアドレス)を別々に設定します。
.dataセクションはLMAは.textの後にロードされるけれど、VMAは'>intram'で指定されたとこになります。
	 {
	 	 _data_start = .; これはVMA
	 	 *(.data)
		 . = ALIGN (4);
		 _data_end = .; これVMA
	 } > intram
	 _rom_data_end = _rom_data_start + SIZEOF (.data); これはLMA

	 .bss :
	 {
	         _bss_start = .;
	      	 *(.bss)
	 } > intram
	_bss_end = .;
}

以前、PROVIDE(_bss_start)を使っていたけれど、これはよくなかった。PROVIDEを
使うと、weakシンボルになるので、ユーザが同じシンボルを定義したら、ユーザの
定義したシンボルが使われてしまう。

後はスタートアップで、ROMからRAMに移動します。
void
machine_startup ()
{
  // Symbols provided from ldscript.
  extern char stack_start[];
  extern char bss_start[], bss_end[];
  extern char data_start[], data_end[], rom_data_start[], rom_data_end[];
  char *p, *q;
  bool ram_ok;

  // Initialize Bus state controller 1st.
  board_bsc_init ();

  // Check BSS
  ram_ok = check_ram ((uint32_t)bss_start, (uint32_t)bss_end, FALSE);

  // Clear BSS
  for (p = bss_start; p < bss_end; p++)
    *p = 0;

  // Copy DATA section.
  for (p = data_start, q = rom_data_start; p < data_end; p++, q++)
    *p = *q;

これでOK。
ちょっと嫌なバグに当たった。シリアルの出力がきつい状況で
ff | ff | ffff
ff | ff | ffff
ff | ff | ffff
ff | ff | ffff
ff | ff | ffff
ff | ff | ffff
iXXXXXXXXXX Asssertion failed. kernel/monitor.c, 207 (818c4)XXXXXXXXXX
---Ready Queue---
<0>: 5 
<1>: 3 
<2>: 
<3>: 
---Thread Status---(remain/total)
[5] R 0 (0/512) app0
[4] W 1 (0/512) keyboard
[3] R 1 (0/512) sci send
[2] W 0 (0/512) sci recv
[1] W 3 (0/512) root
CCR_PC=0
---Monitor---
L ringbuffer
        lock 3 event 80000 prio 1 inherit 1
        lock : 
        event: 4(keyboard) 3(sci send) 

818c4 ... ringbuffer_write 
monitor.c 207 ... mintor_wait
RUN状態のスレッドが二つできてるね...。