![見出し画像](https://assets.st-note.com/production/uploads/images/34021687/rectangle_large_type_2_82565eca2c9e30891540763f03dab25e.png?width=1200)
KUMIKOMI NO SEKAI
「組込み」って聞いて即、組込み系ソフトウェアのことが頭に浮かぶ人はその道のプロぐらいでしょう。C言語は組込み系のシステムを開発する際に大活躍する言語で、組込みシステムこそC言語のフィールドだと言えます。組込み系のソフトウェアエンジニアを組み込み屋さんと言ったりします。私もその内の一人です。
身の回りの組込みシステム
組込みシステムは我々の日常生活に密接に関係していて、家電なんてもはや組込みシステムの搭載されていないものを探すのが難しいくらいです。炊飯器、ポット、洗濯機、冷蔵庫、テレビ等々、普段の生活で使っている電化製品には間違いなく組込みシステムが導入されています。そして、その多くがC言語で書かれたプログラムで制御されているのです。
ポットで湯を沸かすには
自宅に電気ポットがあるなら、ちょっと想像してみて下さい。ポットを使って湯を沸かすには、どんな流れになるでしょうか。私の家のポットは以下のような流れになります。
1)ポットに水を入れる
2)コンセントに電源プラグを差し込む
3)ポットの沸騰ボタンを押す
4)ポットの沸騰中LEDが点灯する
5)湯が沸くとメロディーが鳴る
6)ポットの沸騰中LEDが消える
7)ポットの保温中LEDが点灯する
この内、1)と2)に組込みシステムは関係ありませんが、3)~7)はまさに組込みシステムの成せる技です。ポットが主人公だとして、3)のボタンが押されたことはどうやって知るのでしょう?水の温度が100℃になったのはどうやって知るのでしょう?LEDはどうやって光らせるのでしょう?これらは全てハードウェアとソフトウェア(プログラム)で実現しています。
CPUについて
パソコンを自分で組み立てたことがあるような人は、CPU自体を手に取ったことがあると思います。Central Processing Unitの略書で日本語では中央演算処理装置と訳されます。これは謂わば装置の頭脳に当たる部分で、このCPUが手足となるボタンやLEDやブザーに対して電気的な信号を送ることで、ハードウェアを制御することができます。CPUには色々な種類があって、ハイスペックなものからロースペックなものまで様々です。組込みシステムに搭載されるCPUは一般的にロースペックなものが多いです。ポットにパソコン程の賢さは要りませんからね。スペックが低ければ、当然値段も安くなるため、商品の原価を下げることができます。私は今までの仕事で、ルネサス社のR8C、H8S、SH2、SH3、freescale社のI.MX等を扱ったことがあります。
CPUとピン(ポート)
CPUを実際に見てみると、黒い石の用なモノから金属の足が生えています。実物は以下の通り。これはATMEL製のAtmega328pと言う名前のCPUです。
この黒い石がCPUで金属の足がピンです。ピンは外部の様々なデバイス(LED、センサー等)と接続されます。ピンからは電気を流したり、外から流れてくる電気を検知したりすることができます。ピンのことはポートとも呼びます。
LEDを光らせる
LEDを光らせるにはLEDと接続されているピンに電圧をかければ良いのです。実際の開発では、ハードウェア担当者から回路図を受け取って、CPUのどのピンがどのLEDに繋がっているのかを確認し、該当するピンを制御します。回路図は以下のような図になります。
真ん中の四角がCPUで、右下にLEDって書いてありますね。LEDの配線を辿ると19と番号が振ってあります。これがピン番号です。そしてCPUの内側にPB5と記載があります。これがポート番号です。ポートBの5と読みます。ピン番号とポート番号が一致するとは限りません。この回路図を見ると、ポートBの5を制御すれば、LEDに電気を流せて光らせることができそうですね。
スイッチの入力を検知する
さっきの回路図の左下を見て下さい。SW1、SW2と書いてあります。これはスイッチのことです。物理的に押せるボタンです。SW1の配線を辿ると4番ピンに接続されています。このポート番号はPD2ですね。SW1を押すと、電気がCPUの4番ピンに流れて来ます。CPUは4番ピンの電圧変化を検知して、今押されてる/押されてないの判断ができます。
ポートの方向
LEDを点けたり、消したりするにはLEDに対して電気を流さないといけません。つまり、CPU側から電圧をかける必要があります。なので、LEDが接続されているPB5は出力ポートとして使う必要があります。反対にスイッチに関しては、外からの電圧変化を検知する必要があるので、PD2は入力ポートとして使います。ポートの方向の考え方は主語をCPUとして考えます。CPUから見て、出すのか?入って来るのか?で決めます。出力ポートのことをOUTポート、入力ポートのことをINポートと呼んだりします。
ハードウェアを制御するには
大まかな原理は分かったとして、具体的にどうするのか?とんでもない難度の事をしないといけないんじゃないかと思うかも知れませんが、大したことはありません。「LEDを光らせる」の一点に集中すると、C言語のソースコードは1行です。こんな感じ。
PB = 0x20;
「え?こんだけ?」と思いませんか?PBに対して0x20を入れる。それだけです。ここで問題なのが、PBって何者で、何故0x20なのかと言うことです。
レジスタ(Register)
レジスタ・・初めて聞く言葉かも知れませんが、これは何かと言うと、ハードウェアを制御するためのコントローラーみたいなもんです。先程の「LEDを光らせる」に出てきたPBというのは実はレジスタの名称で、ポートBレジスタのことでした。ポートBレジスタはこんな形をしています。
あれ?何か変数っぽいですよね。そうです、1バイトのchar型の変数と一緒です。PB = 0x20; の意味はもう分かりますね。二進数なら”0010 0000”となるので、PB5に1を書いているのです。PB5は何と繋がってましたっけ?LEDですね。これでLEDが点灯します。もう少し図を分かり易くすると、こんな感じです。
では、そのレジスタとは何処に在るのか?それはメモリ上にマッピングされています。
メモリマップドI/O(Memory Mapped I/O)
メモリマップドって???はてなマークがいっぱいだと思いますが、プロジェクションマッピングをイメージすると良いかも知れません。プロジェクションマッピングは分かりますよね?大阪城とか東京駅とかにプロジェクターで映像を投影して、普段何てことの無い建物が飛んだり跳ねたりするように見えます。あのマッピングとメモリマッピングは同じような話です。
メモリも大阪城と同じように物理的なもので動きはしません。メモリは単にメモリで情報を入れる箱でしかありません。そこにレジスタを上から被せる(マッピング)ことで、別の意味が生まれます。CPUは単にあるメモリの1ビットに対して1を書いたつもりでも、実はそれはポートを制御するためのレジスタになっているということです。
では、メモリの何番地にレジスタがマッピングされてんねん?って話になりますが、これは予めバチっと決まっています。アドレスのXXX番地にはPBレジスタがマッピングされています!とCPUの説明書に書いてあります。後はそのアドレスに対してデータを書くだけで、LEDが光ったり、モーターが回ったりするわけです。
レジスタに対するデータの読み書きを、通常の変数に対するデータの読み書きのようにするために、大抵のCPUメーカーはレジスタの定義をC言語で書いてくれています。ポートBなら、PBみたいな感じです。PB = 0x01;みたいにするとレジスタを制御することができるのです。親切な話ですね。
ちょっと興味湧いたかも?
私は文系出身で理系分野を避けて学生時代を過ごして来たのですが、どこで間違ったか現在組込み系のソフトウェアエンジニアとして働いています。私の最初の記事にも書きましたが、C言語を使ったプログラムで「おお!」ってなるのは何かが動いた時です。今回の記事を読んでみて、ちょっとでも興味が沸いたなら一歩踏み込んでみませんか?
しかし、いきなり自分一人で組込み用のCPUボードを購入して、プログラムを組んで動かすのは非常にハードルが高い。世の中には研修をしてくれる所もありますが金が高い(20万円とか)。個人で突入するのは尻込みしますよね。安上りで何か良いのないかなぁと探してみると、初心者用に良さげキットがありました。試しに私が購入して、軽く触ってみようと思います。結果、使えそうなら記事にしたいと思います。
まとめ
いかがでしたか?ハードウェアを制御するプログラムって、無茶苦茶難しいのではないかと思っている人も居たかも知れませんが、案外行けそうじゃね?ってなりませんでしたか?組込み屋さんに対して、PCアプリ等のソフトを開発しているエンジニアのことをPC屋さんとかアプリ屋さんと言いますが、プロとして仕事をしているその人達でさえ、組込みソフトは難し過ぎて立ち入れないと思っている人が沢山います。参入障壁が高いんですね。それ故に慢性的に人手不足なんです。実際の仕事でも、開発メンバーとなるエンジニアを集めるのに相当苦労します。「エンジニア見つかったよ!60歳の人なんだけど・・」「要らん!」こんなやり取りを何回することか・・。できる人は余っちゃいないわけですよ。どんな業界でもそうでしょうけどね。なので、少し興味がある、挑戦してみようかなと思う人には、是非仲間になって欲しいと思います。いつか、開発メンバーとして助けに来て下さい。それでは、今回はこの辺で。お疲れさまでした。
この記事が気に入ったらサポートをしてみませんか?