基本概念のお勉強
メモリマップドI/O
コントローラ
信号制御をCPUが行うとしたら、一秒間に9600回ON/OFFを繰り返さなければならない。
それを避けるために、通常はこの動作を代わりに行うICチップを実装してそれに行わせる。
このような制御を行うICチップを一般にコントローラという。
シリアル通信ならシリアルコントローラ。
LANならばLANコントローラと呼ぼれるICチップが搭載されている。
信号の制御はコントローラが行う。
CPUからはコントローラに対して、送信要求を出したり、コントローラからデータを受信するだけで済む。
コントローラの操作方法
このコントローラの制御はレジスタ経由で行う。
コントローラもメモリと同様にアドレス線を持っている。
どのアドレスに対して読み書きをすればよい?
内蔵シリアルコントローラ
H8はSCIと呼ばれる内蔵のシリアルコントローラを持っている。
これらSCIを操作するためのレジスタのアドレスは固定となっている。
コントローラ名 | アドレス |
---|---|
SCI0 | 0xffffb0 |
SCI1 | 0xffffb8 |
SCI2 | 0xffffc0 |
レジスタ名 | アドレス | サイズ | 意味 |
---|---|---|---|
SMR | 0xffffb8 | 1バイト | シリアル通信のモード設定 |
BRR | 0xffffb9 | 1バイト | ボーレートの設定 |
SCR | 0xffffba | 1バイト | 送受信の有効/無効など |
TDR | 0xffffbb | 1バイト | 送信したい1文字を書き込む |
SSR | 0xffffbc | 1バイト | 送信完了/受信完了などを表す |
RDR | 0xffffbd | 1バイト | 受信した1文字を読み出す |
スタートアップ
起動の手続きについて知っておく必要がある。
- 電源のONやリセットにより、リセットベクタを参照し、start()が呼ばれる。
- リセットベクタは割込みベクタの先頭になっている
- リセットベクタに予めstart()を配置しておく
- _startの処理は、
- スタックポインタ(sp)を0xffff00に設定
- main()へのjsr(ジャンプ)
ちなみにH8は割込みベクタは0x000000~0x0000ffにあるため、割込みベクタをこのアドレスに配置する設定をld.src(リンカスクリプト)で行っている。
リンカスクリプトでは、オブジェクトファイルをリンクして実行形式を生成する際に、関数や変数をアドレス上にどのように配置するかを指定する。