>
16キーのテストをしました。10Kのプルアップ抵抗を狭んでH8のポートにつなぐ
だけ。このくらいならテストなしでもいけそうだけれど、ソフト側のメッセー
ジ処理とかを決めておきたいので。
ほんとにたまーにしか入力されないボタンをポーリングするのは、とてもリソー ス的に嫌なので、なんとかエッジで割りこみかけれないかな...とも思ったのだ けれど、とんでもないことになりそうなので、ここも富豪的に。リソースが足 りないならCPUを足す方向で。リフレッシュコントローラをインターバルタイマ にしてCPUクロックの4096分周を201カウントで33msecごとにサンプリングする ことにしました。

プログラムをROMにもっていってみるとうまく動かない。nmしてみるとわかった。 そいえば.dataのコピー処理してなかった。今迄小さいプログラムだったので意 図的に.rodataと.bssに振り分けて書くことでなんとかなってたのだけど、そろ そろちゃんとしないと。
ほんとにたまーにしか入力されないボタンをポーリングするのは、とてもリソー ス的に嫌なので、なんとかエッジで割りこみかけれないかな...とも思ったのだ けれど、とんでもないことになりそうなので、ここも富豪的に。リソースが足 りないなら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状態のスレッドが二つできてるね...。
