「一人前のエンジニアをめざす人」のためのキャリアコーチング -4ページ目

「一人前のエンジニアをめざす人」のためのキャリアコーチング

エンジニア、技術者の皆様、キャリアコーチングを受けてみませんか。キャリアについてお悩みの方の進路を明確にして、スッキリしていただくキャリアコーチングサービスをご紹介します。

私は、コーチングを始める以前は、組込みエンジニアとしてソフトウエア、ハードウエア両方の設計を経験をしました。

C言語を使ってマイコンを制御するプログラムを書くことが多かったのですが、C言語と言っても、WindowsやLINUXのアプリケーションプログラムとは異なる、組み込み独特の書き方をするところがありました。

簡単に言うとハードウエア(CPU)がどのようにプログラムを実行するかを意識して書くところです。

例えばC言語にはvolatileという修飾子があります。

C言語で書いたプログラムは、実行する前にコンパイルします。このとき、プログラムを効率よく実行するために最適化されますが、一部の変数は使用される一定期間内、CPUの内部レジスタに割り当てられることがあります。

組み込みの場合、CPUバスに接続されているコントローラ、例えば、UART、I2C、SPI、Ethernet、USB、CAN、LIN等など多くのコントローラを制御します。どうやって制御するかというと、各コントローラが持っているレジスタに値を書いたり、値を読んだりします。

例えば、通信コントローラがデータを受信したかどうかは、ステイタスレジスタというあるアドレスに割り当てられたレジスタを読むとわかるとします。

CPUは、例えば、定期的にこのステイタスレジスタの値を読み取って、あるビットがセットされていればデータを受信したとわかるという仕組みです。

従って、CPUは毎回プログラムか期待する通りに、通信コントローラのレジスタをきちんと読んで判断しなければならないのですが、残念ながらコンパイラはプログラムが通信コントローラを読みにいっているのか判別できるほど賢くありません。

そこで、コンパイラは、通信コントローラのステイタスレジスタをCPUの内部レジスタに割り当ててしまうようなことがあります。

一回目の読み出し時は、ステイタスレジスタから読み取るのですが、読み取った値をCPUの内部レジスタに保存して、それ以降の読み出しはCPUの内部レジスタを読み出し、C言語プログラム上はきちんと動作しているように、見えてしまいます。

当然ながら、ステイタスレジスタの値が変化してもCPU内部レジスタは影響を受けませんので、通信コントローラがデータを受信してもプログラムはそれを知ることが出来ません。

いつまでたっても受信できないプログラムになってしまいます。

そこで、volatile修飾子の登場です。

while(1){
if((*(volatile unsigned int *)0x80000000 & 0x1) == 0);
else break;
}

などとして、使用します。
このプログラムは0x800000000番地の値を読んで0x1とANDをとってセットされるまではwhileループを回り続けるというプログラムです。

こうしておくと、CPU内部レジスタに割り当てられることが無く、毎回きちんと0x80000000番地から値を読み取ってくれます。

Windows、LINUXのデバイスドライバも、ハードウエアにアクセスするものは同様の注意が必要になります。



エンジニアの方、一度、体験コーチング(無料)で、自分の考えを整理してみませんか?モヤッとしている考えがハッキリ見えてきてスッキリしますよ!

まずは体験コーチング(無料)から試してみませんか?