読者です 読者をやめる 読者になる 読者になる

【組込OS自作入門】2ndステップのメモ

基本概念のお勉強

メモリマップドI/O

コントローラ

信号制御をCPUが行うとしたら、一秒間に9600回ON/OFFを繰り返さなければならない。
それを避けるために、通常はこの動作を代わりに行うICチップを実装してそれに行わせる。
このような制御を行うICチップを一般にコントローラという。
シリアル通信ならシリアルコントローラ。
LANならばLANコントローラと呼ぼれるICチップが搭載されている。

信号の制御はコントローラが行う。
CPUからはコントローラに対して、送信要求を出したり、コントローラからデータを受信するだけで済む。

コントローラの操作方法

このコントローラの制御はレジスタ経由で行う。
コントローラもメモリと同様にアドレス線を持っている。
どのアドレスに対して読み書きをすればよい?

閑話休題DRAMのアクセスの仕方

CS(チップセレクト)を利用することで、容量の小さいDRAMを複数合わせて、
あたかも一つのDRAMとして連続しているかのように利用できる。

コントローラへのアクセスの仕方

DRAMと同じように、シリアルコントローラのレジスタにもアドレスでアクセスできる。
16bitレジスタの場合は、4bitのアドレスバスが必要。

内蔵シリアルコントローラ

H8はSCIと呼ばれる内蔵のシリアルコントローラを持っている。
これらSCIを操作するためのレジスタのアドレスは固定となっている。

シリアルコントローラのレジスタマッピング

コントローラ名 アドレス
SCI0 0xffffb0
SCI1 0xffffb8
SCI2 0xffffc0

SCI1のレジスタマッピング

レジスタ アドレス サイズ 意味
SMR 0xffffb8 1バイ シリアル通信のモード設定
BRR 0xffffb9 1バイ ボーレートの設定
SCR 0xffffba 1バイ 送受信の有効/無効など
TDR 0xffffbb 1バイ 送信したい1文字を書き込む
SSR 0xffffbc 1バイ 送信完了/受信完了などを表す
RDR 0xffffbd 1バイ 受信した1文字を読み出す

スタートアップ

起動の手続きについて知っておく必要がある。

  1. 電源のONやリセットにより、リセットベクタを参照し、start()が呼ばれる。
    • リセットベクタは割込みベクタの先頭になっている
    • リセットベクタに予めstart()を配置しておく
  2. _startの処理は、
    • スタックポインタ(sp)を0xffff00に設定
    • main()へのjsr(ジャンプ)

ちなみにH8は割込みベクタは0x000000~0x0000ffにあるため、割込みベクタをこのアドレスに配置する設定をld.src(リンカスクリプト)で行っている。
リンカスクリプトでは、オブジェクトファイルをリンクして実行形式を生成する際に、関数や変数をアドレス上にどのように配置するかを指定する。

その他

volatile

変数定義のvolatileが付いていると、変数操作時に最適化が抑制される。

端末変換

C言語では改行コードは"\n"と表記するが、
シリアル通信では歴史的な経緯から改行コードは"\r"が利用される。

さらにPC側からシリアル出力する際には改行コードは"\n"を"\r\n"のように変換することになっている。

ディップスイッチ
モード* 1 2 3 4
ROM書き込み ON ON OFF ON
ROMから起動 ON OFF ON OFF
minicomの操作

ubuntuだとminicomを使うのがたぶん普通なのかな.

#起動
sudo minicom

minicomの終了はC-a x

シンボル

C言語で定義された関数などは、実際には「_」が付加された状態でシンボルが作成される。