12ステップで作る組み込みOS自作入門
1章
H8/3069FにELFは直接書き込めない
モトローラSレコードフォーマットに変換が必要
objcopyで変換可能
code:shell
$ $HOME/12steps/h8300-elf/bin/objcopy -O srec kzload kzload.mod
シリアル接続可能な端末エミュレーター
cu
~.で切断
code:shell
$ sudo cu -l /dev/tty.usbserial-FTRTGKIU
Hello World
~.
Disconnected.
minicom
kermit
2章
メモリマップドIO
CPUのアドレス空間に割り振られたレジスタで操作するIO
チップ・セレクト信号
チップ・セレクト
通常のDRAMのチップが持つ CSまたはCEと呼ばれる信号ピン
チップセレクトピンが1になった場合のみ、チップが動作する
volatile
コンパイラによる最適化を抑制するキーワード
メモリマップドIOのレジスタ操作を変更されないようにするために使う
最適化によりレジスタへのアクセスの順序の変更
無限ループの削除
SMR
シリアルモードレジスタ
SCR
シリアルコントロールレジスタ
シリアル入出力の操作
BRR
ビットレートレジスタ
シリアル通信の速度(ボーレート)の操作
9600bpsが一般的
115200bpsもよく利用される
H8/3069Fはクロック数がそれほど高くないので通信できないことがある
SCIで1文字出力するのに2つのレジスタを利用する
TDR
トランスミットレジスタ
SSR
シリアルステータスレジスタ
手順
SSRの送信完了ビットがおいていないか確認
TDRに送信した文字を書き込む
SSRの送信完了ビットを落とす
送信が完了すると、コントローラーがSSRの送信完了ビットを立てる
スタートアップ
動作開始処理のこと
crtという名前が使われることもある
C RunTimeの略
割り込み
CPUがある処理を実行している最中に割り込み が発生すると、実行中の処理とは別の処理に入る
割り込みベクタ
ハンドラのアドレスを記述しておく特別なアドレス
割り込み発生時にどのアドレスから実行するか設定しておく
リセットベクタ
リセットが発生するとリセットベクタを参照して処理を開始する
3章
ROM上に変数を配置すると代入しても書き換わらない
変数の初期値はROMに保存
プログラム起動時にROM上の初期値をRAMにコピー
変数にアクセスするときはRAMのアドレスに対してアクセス
ロードアドレス・物理アドレス
変数の初期値が配置されるアドレス
リンクアドレス・論理アドレス
プログラムが変数にアクセスするアドレス
テキスト領域
機械語コードが置かれる
データ領域
初期値を持つ静的変数などが置かれる
BSS領域
初期値を持たない静的変数などが置かれる
データ領域とBSS領域をROM上に配置されると静的変数の書き換えができない
リンカスクリプトで配置先を変更する
リンカスクリプト
シンボル
C言語のプログラムからセクションの位置を把握するために必要
ロケーションカウンタ
. 現在のカレントアドレスを表す
code:lcr
. = 0x0
セクションの作成
code:lcr
.vectors : {
vectors.o(.data)
}
.text : {
*(.text)
}
MEMORYコマンド
メモリ領域の定義
code:lcr
MEMORY
{
romall(rx) : o = 0x000000, l = 0x080000 /* 512KB */
vectors(r) : o = 0x000000, l = 0x000100 /* top of ROM */
rom(rx) : o = 0x000100, l = 0x07ff00
ramall(rwx) : o = 0xffbf20, l = 0x004000 /* 16KB */
data(rwx) : o = 0xfffc20, l = 0x000300
stack(rw) : o = 0xffff00, l = 0x000000 /* end of RAM */
}
配置場所の指定
MEMORYで設定した領域への配置を > で指定する
code:lcr
.vectors : {
vector.o(.data)
} > vectors
AT>は物理アドレスの指定
.dataセクションの物理アドレスをrom上に配置する
.dataセクションのリンクをRAM上のアドレスをベースにできるが、ロードはROMから行われるようにする
VA ≠ PAのための対応
code:lcr
.data : {
_data_start = . ;
*(.data)
_edata = . ;
} > data AT> rom
シンボルの配置
カレントアドレスにシンボルを配置する
code:lcr
_text_start = . ;
静的変数の読み書きはリンカスクリプトの対応だけでは不十分
初期値の設定のために起動時にROMの初期値をRAMにコピーが必要
4章 ブートローダー
ROMのメーカーが保証する書き込み回数は限られている
ブートローダー
フラッシュROMに書き込む代わりに実行形式をシリアル通信でダウンロードし、RAMに展開して起動するプログラム
修正のたびにフラッシュROMを書き換えなくて済む
ROM化
製品化の段階で開発したプログラムをROMに書き込む
XMODEM
古くからあるシリアル通信でのファイル転送のためのプロトコル
転送効率が良くない
信頼性が低い
プロトコル
NAK
EOF
ACK
EOT
CAN