やぁみんな、ビリーだよ。
いつも楽しみにしていてくれる読者のみんな、お待たせしてしまってごめんね。
ボクも忙しくて・・・
さて今回は、コンピュータ機器の電源を入れてからソフトウェアが起動するまでの間にどのような処理が行われているのか、説明しよう。
「行われているのか」と他人事のように聞こえるけど、組み込み機器のソフトウェアプログラマーであれば、このプログラム自体を作らないといけない場面も出てくるんだ(^_^;)。
自社でCPUボードを開発してプログラムを乗せる場合や、市販のボードでlinuxは動作しているがそれは使わずに自社OSを移植する場合などが該当するよ。
電源オンの直後に実行されるプログラム
世の中にはいろんなメーカのCPUがあるけど、基本的にどのようなCPUであっても、電源を入れた直後(またはリセットを行った直後)の処理は決まっていて、以下のいずれかの処理が実行されるようになっているよ。
- 電源を入れると、あらかじめ決められているアドレスからプログラムを読み出し、それを実行する。
- 電源を入れると、あらかじめ決められているアドレスから「プログラムがどこ(どのアドレス)に置かれているか」を読み出し、そのアドレスからプログラムを読みだして実行する。
どちらの方式になっているか、および「あらかじめ決まったアドレス」が何番地か、というのはCPU それぞれで決まっているよ(しばしば「リセットベクタ」とも呼ばれる)。例えば以下のようになるんだ。
- 1.のタイプ:Intel x86,Pentium 系、FreeScale PowerPC 系
- 2.のタイプ:各社 ARM 系、Renesas SH,RX 系
「あらかじめ決まったアドレス」には、通常はフラッシュメモリやROMのような、書き換え可能な不揮発メモリが配置されているよ。つまりCPUの起動プログラムを作ったら、このアドレスに起動プログラムを書き込んでおくことになるんだ。実際に使用する CPU がどちらに属するのかは、CPU のデータシートで「例外処理」「リセット」あたりのキーワードで調べると載っているよ。
CPU起動直後に必要な処理
CPU起動直後には、いろいろなものを初期化する必要があるよ。これはCPUによって異なり、たとえばARM系であってもメーカや型番によって、必要な処理や手順が異なるんだ。一から作るのはなかなか大変だから、そのCPUで動作している他のOSや、なければ類似のCPUのコードを参考に作ろう。一般的には、以下のような初期化処理が必要だよ。
割り込みコントローラの初期化
割り込みをすべて禁止する。プログラムが起動し、割り込みが使えるようになったらその割り込みを許可する。例えばLANを使いたいのであれば、LANのドライバを初期化してから割り込みを許可する、という感じだね。
RAMの初期化
CPUの内蔵RAMであれば初期化なしでそのまま使える場合もあるけど、外付けのRAMであれば通常は何らかの初期化が必要なはずだ。CPUのRAMコントローラのレジスタであったり、RAMの種類によってはRAMの初期化処理が必要(例えば最初に所定のパターンでデータを書き込むなど)だよ。
CPUのモード設定
CPUによってはいろいろな動作モードを持つものがある。Intel x86系であればリアルモード、プロテクトモードがあるよ。
ブートローダって?
プログラムを別々に作る場合で、このうち電源を入れて最初に起動されるプログラムを「ブートローダ」と呼ぶんだ。
わかりやすい例でいうと、Windowsを起動する場合に、まずBIOSが起動し、BIOSがHDDなりDVDからWindows OSを読み出して起動するよね。このBIOSに相当するのがブートローダなんだ。ブートローダでは、先に書いた割り込みコントローラの初期化などを行うけど、Windowsの例だとHDDやDVDドライブを使用できるように初期化する処理なんかも含まれることになるね。
Windowsのような大きなプログラムは FLASHやROMに格納するのは大変なので、「Windowsを起動するプログラム(=BIOS)」を別に作って入れておく、というようなことを行うんだ。組込み機器の世界では、そこまで大きなプログラムではなくて、プログラムが全部FLASHやROMに収まってしまう場合も多く、そのような場合はわざわざブートローダとメインのプログラムを分けずに、ブートローダの機能を含んだ一つのプログラムとして作ってしまう場合もあるよ。
ブートローダをメインのプログラムと分けておく一番のメリットとしては、頻繁に書き換える可能性があるプログラムと、一度書きこんだらその後変更しないプログラムを分離できることなんだ。
ふつう、ブートローダや、ブートローダを使わない場合のプログラムは、FLASHやROMに書き込まれている。これを書き換えるには、ICEやROMプログラマー等の機器が必要なんだ。つまり簡単には書き換えられないよね。
例えば製品を出荷した後でプログラムのバグが見つかり、プログラムをアップデートしないといけないような場合、ブートローダとメインプログラムを分離しておき、メインプログラムはHDDにおいておくとか、FLASHを書き換えるプログラムごと乗せておくとかすれば、わざわざ製品を回収してICEなどで書き換えなくてもよくて、ユーザーにアップデートプログラムを渡して書き換えてもらうことで対応できるよね。
この機能は当社製品のBBsQuestや EcoQuest等にも利用されていて、ファームウェア(メインのプログラム)をHPなりCDなりで提供して、お客様自身で製品のファームウェアを更新もらうようにしているよ。
ビリーに「○○について講義して!」といったリクエストがあれば、お問い合わせから送ってね。お題があれば、そんなにお待たせせずに、次の講義が出来るかも・・・。
-
- 第1回 組込みシステムのこれから
- 第2回 IoTの成功はセキュリティ次第
- 第3回 組込みでもGPUやFPGAと早めに親しんでおこう
- 第4回 電子産業の紅白歌合戦、CEATECで垣間見えた未来
- 第5回 小口開発案件の集合市場、IoTの歩き方(上)
- 第6回 小口開発案件の集合市場、IoTの歩き方(下)
- 第7回 徹底予習:AI時代の組込みシステム開発のお仕事
- 第8回 いまどきのセンサー(上):ありのままの状態を知る
- 第9回 いまどきのセンサー(下):データを賢く取捨選択する
- 第10回 組込みブロックチェーンの衝撃(上)
- 第11回 組込みブロックチェーンの衝撃(下)
- 第12回 エネルギーハーベスティングの使い所、使い方
- 第13回 「人を育てる」から「道具を育てる」へ、農業から学ぶAI有効活用法
- 第14回 CPS時代に組込みシステム開発に求められることとは
- 第15回 次世代車のE/Eアーキテクチャに見る組込みの進む道
- 第16回 RISC-Vが拓く専用プロセッサの時代
- 第17回 振動計測の大進化で、熟練エンジニアのスキルを広く身近に
-
- 零の巻:組込みというお仕事
- 壱の巻:2進数と16進数を覚えよう!
- 弐の巻:割り込みとポーリング
- 参の巻:printf()が使えない?
- 四の巻:これにもIntelが入ってるの?
- 五の巻:Endianってなに?
- 六の巻:マルチタスクとは
- 七の巻:スタックってなあに?(1)
- 七の巻:スタックってなあに?(2)
- 八の巻:メモリを壊してみましょう
- 九の巻:コードが消える?~最適化の罠~
- 拾の巻:例外が発生しました
- 拾壱の巻:コードサイズを聞かれたら
- 拾弐の巻:キャッシュは諸刃の剣
- 拾参の巻:デバイスにアクセスするには
- 拾四の巻:セキュリティってなに?(1)
- 拾四の巻:セキュリティってなに?(2)
- 拾四の巻:セキュリティってなに?(3)
- 拾五の巻 :DMA対応と言われたら(1)
- 拾五の巻 :DMA対応と言われたら(2)
- 拾六の巻:ヒープとスタック
- 拾七の巻:フラグメンテーション
- 拾八の巻:CPU起動とブートローダ
- 拾九の巻:kmとKByteの「kとK」
- ビリーへの質問:DMAとキャッシュの関係
- ビリーへの質問:スタックオーバーフローについて
- ビリーへの質問:CPUレジスタについて