組み込みOS自作入門(2章)
- 昔読んでいたけど、途中で読むのをやめてしまったのでリベンジ。
- 今回は2章。
2章で作るもの
- 1章で作った「Hello World!」しか送信できないプログラムを改造して、任意の16進数文字列を送信できるようにする。
(改造する量自体は少ないので、1章で解説してこなかったものをチョイチョイ解説)
シリアルドライバ
「シリアル通信」といっても、複数の通信フォーマットがあり、それぞれ微妙にちがう。通信するためにはフォーマットを決めて、ペリフェラルモジュールのレジスタを設定する必要がある。一度フォーマットを設定してしまえば、送信したいデータをモジュールに渡すだけでモジュールが電気信号を出してくれる。
- 通信速度 9600bps
- データ長 8bit
- ストップビット 1bit
- パリティ なし
- ハードウェアフォロー制御 なし
- ソフトウェアフロー制御 なし
シリアル通信波形のイメージ
(この図はVAIO Z VJZ13A1とCLIP STUDIO PAINTでかきました)
レジスタ設定は本文中に詳しく書かれているが、キチンと設定する場合はマイコンマニュアルを見て、マニュアルに書いてあるとおりにレジスタを設定する。(けっこうめんどくさい)
http://documentation.renesas.com/doc/products/mpumcu/rjj09b0165_h83069rf.pdf
コンパイラのコード最適化が問題になるとき
C言語からペリフェラルモジュール(ハードウェア)を制御するときには
必要があるのですが、コンパイラはこのような処理を最適化の対象(無駄な処理)と勝手に判断することが多々あります。知らぬ間に処理順序を入れ替えたり処理が省かれると不具合の原因となります。
最適化して欲しくない部分にvolatileキーワードを付加することで、処理の最適化は行われなくなります。ただし、処理の効率は落ちるので、volatileキーワードを付加するのは必要なところだけに限定しないといけません。