組み込みエンジニアとしての土台になった5冊
自分に影響を受けた書籍を紹介する記事を目にし、素晴らしい企画だなと思ったので自分も参加します。今まで読んだ書籍のベスト5という形式ではなく、自分の知識や技術の土台となっているものを紹介したいと思います。
自己紹介
組み込みエンジニアです。ソフトメインで基板起こしとかはしません。
業界はFA系なので家電ほどキツキツでもなく、自動車ほどガチガチでもありません。
マイコンの性能で言えば100MHz~1GHzまで(Cortex M3~Cortex A9ぐらいまで)。
処理速度、RAM、ROMサイズを限界まで切り詰めてプログラミングすることはほぼありません。
ベアメタルからRTOS、組み込みLinuxの環境でやっているので、
組み込みの中では比較的?自由度の高い環境にあるかなと思います。
普段はC/C++/C#、シェルスクリプト、あとはPython, JS、趣味でRustをやってます。
(PLCラダーとかそういう話は理解されないのでやめておく)
ちなみに現在絶賛半導体不足直撃中です。
注意
組み込み系は対象製品によって要求性能・仕様が全く異なります。
業界ごとに要求や文化は違いますので、あくまでも一個人のものとして読んで下さい。
FA系の制御工学や機械工学、ロボット工学などの書籍も自分の土台にはなっているのですが、
あくまでソフトウェア周りの5冊にします。
組み込みの世界
組み込み入門ではしばしばラズパイを使ったLチカが紹介されます。
ラズパイは気軽に組み込みプログラミングを体験できる上、外付けのカメラ・センサーとPythonを上手く使うと、IoTやロボットまでできる素晴らしい製品だと思います。
一昔前の PCのコンソールにHello Worldを表示できます!
では若い世代へのアピール力が圧倒的に足りませんからいつも助かっています。
(何せWEB系なら入門書の段階でフレームワーク+クラウドでECサイトまで作れてしまう。。。)
しかしながら、ラズパイは組み込みの世界では超々高性能ボードで、Cortex A55×4+GPUという構成はマイコンというよりは普通のPCです。Linuxが普通に動き、クロスコンパイル不要(てかラズパイ内でビルドできる)な環境は組み込みではほぼありえません。
(このレベルの環境を使う組み込みは自動車のADAS周りぐらいじゃないかな。。。)
受けは悪く地味ではありますが、マイコンからPCのコンソールにHello Worldを表示できるということは 組み込み開発の真理でもあります。一般的にHello Worldはプログラミングの第一歩のように思われますが、組み込みの世界においてHello Worldをなんらかの端末に表示できる知識と経験があれば、組み込みエンジニアとして十分にやっているけるものなのです。
OSなしの世界でHello Worldを表示するためには、そもそも基板が動作しなければなりません。基板が動作するということは配線ミスがなく、リセット回路、クロック等が正しく動作している必要があります。(基板設計を自分でやるかは別として基板が正しく動作していることを確認できることは必須です。)
プログラムが動くにはRAMが正確に動作し、ROMにファームが書き込めている必要があります。つまりRAM、ROMのセットアップが正しく、マイコンのアドレス空間を把握しコンパイラ・リンカの設定ができているということです。
シリアル通信(9600bbsなんて速度は今の時代では笑われるほど低速ですが)をするためには、
ペリフェラル(マイコン内部のシリアル通信をするための回路)を正しく設定しなければなりません。ペリフェラルの使用にはマイコンの仕様書(死ぬほど読みにくいマニュアル)を読み、対象のレジスタへアクセスする必要があります。
使用する割り込み処理には割り込みハンドラを記述する必要はあります。
割り込みハンドラを書くには割り込みの概念とマイコンの割り込み使用を理解し、ハンドラをアセンブラで書かなければなりません。(Armを除く)。割り込み時はどのレジスタが保存されるのか、割り込みマスクはステータスレジスタのどこに設定するのかといった知識と割り込みレベルの設定といった設計をしていく必要があります。
当然Hello Worldを表示するプログラムはC言語で記述される訳ですから、C言語の仕組み(特にポインタ、スタックなどの概念)が分かっていなければなりません。
以上のようにマイコンの世界のHello Worldは普段我々が使用するOSの世界でのHello Worldとは桁違いに多くの知識と作業が求められます。マイコンでのHello Worldとは電子部品としてのコンピュータを仕様書を読みながら操作することに他なりません。
実際の組み込み開発ではHello Worldまで到達すれば、用途に応じたアプリケーションをマイコンに追加していくだけです。もちろんアプリケーションの実装ハードルや別途使用するペリフェラル特有の難しさなどハードルは多々あります。それでも自分の力でマイコンでHello Worldできる実力があれば、組み込みエンジニアとして立派なスタートを切ったと言えるのではないかと思います。
(今の時代マイコン開発でもIDEやHALがあるのでそこまで要らんという意見もあるはず。ですが、やはりフルスクラッチでHello Worldできるということは組み込みエンジニアにとって重要なことだと思います。)
前置きが長くなってしまいましたが、
そんなHello Worldが何とかできるようになり、組み込みエンジニアとしてスタートするための土台になった5冊を紹介します。
なお、C言語については理解しているものとします。C言語の入門書なら苦しんで覚えるCとかがよい書籍だと思います。
追記 2023/09/14
0冊名 ゼロから作るos
WEB・クラウド全盛時代の2023年にも関わらず、
組み込み向けとして過去最高の書籍が出版されたので紹介します。
CQ出版のInterface誌 2023年7月号の「ゼロから作るos」です。
ラズパイ製造元が開発している組み込み向けマイコン 「RP2040」向けに、
リアルタイムOSを開発するという約150ページ程度の特集が組まれています。
従来の組み込み向け書籍と比較して以下の点で圧倒的に優れています。
1.環境の構築が容易
RP2840は主流のArmマイコン (Cortex-M0+)で、
133MHz、RAM264KB Flash 2MBと一般的なマイコンとなっており、
RP2840を搭載した Raspberry Pi Pico はボードは1000円以下でオンライン購入できます。
実機動作に必要なハードウェアはUSB microケーブルを用意するだけで、
ソフトウェアも無料のEclipseエディタに拡張機能を追加するだけです。
本記事で紹介しているH8マイコンを利用する「組み込みOS入門」は、
開発環境の構築が恐ろしく面倒であったり、
SHマイコンに至っては実機を用意することが困難ですから、
Raspberry Pi Picoで開発できる本書は非常に便利で素晴らしいです。
2. 実務に役立てられる
当初紹介していたSHマイコン・H8向け書籍の場合、
SHマイコン・HBマイコンが収束に向かっていることもあり、
書籍を読んでも実務への応用が難しいというものがありました。
一方本書籍のArm マイコンの知識は組み込み業界では、
今後十数年にわたって土台となる知識になるでしょう。
また基本的な組み込みOSの機能(タスク管理・セマフォ)を自身の手で実装することで、
組み込みで重要なリアルタイム性・スケジューリングについての理解も深められます。
3. 内容が素晴らしい
内容が1320円で購入できるものではありません。
アセンブラ・ペリフェラル・ブートローダ割り込みハンドラといった組み込み開発に必須の知識だけではなく、メモリマップ・レジスタ・CPU内部構造まで実にわかりやすく説明されているため、
CSの入門としても参考になります。
またC言語のカリキュラムとしても有効で、
ポインタやメモリ確保の仕組みを理解できるため、
組み込み以外では触る機会が減ってしまったC言語の入門課題としても魅力的です。
4 Raspberry Pi Picoで遊べる
Raspberry PI PicoはGPIOやPWMなどの各種ペリフェラル (外部回路)が実装されており、
これを使えばさらに機能を追加することができます。
WEB上にはたくさんの応用例があるので、
それを参考にすれば組み込み開発の幅広さを体験できるでしょう。
最初はInterface誌 2021年8月号のラズパイのマイコンPico攻略本が参考になると思います。
RP2040のマニュアルは現代のマイコンとしてはコンパクトかつ読みやすく、書籍やブログでの解説が豊富です。
分からない箇所は検索すればいいというのも素晴らしいですね。
余談
Raspberry Pi Pico 133MHzと組み込み向けではかなり高性能なマイコンですね...
しかもオーバークロック対応で外部クォーツもあるから周波数精度も良好。
しかもマイコンでは珍しいダブルコアなので、複数タスクを効率よく回す訓練も出来るうえ、
PIOをうまく使えばFPGAで実装するようなハードウェア処理も簡単につくれるという・・・
こんなすごいボードが1000円を切る価格で購入できる素晴らしい時代なので、
ぜひぜひ手を触れてみてください。
追記終了
1冊目 12ステップで作る組込みOS自作入門
マイコンボードを使って組み込みOSを作ります。
組み込みOSを自身の手で作ることで、組み込みOSの仕組みが分かることもさることながら、
割り込み、ペリフェラル、メモリ管理などの組み込みの基本を詳細な説明とC言語で解説してくれるのが何よりありがたいです。
(組み込みOSは組み込みの世界で使用する限られた機能のOSです。リアルタイムOSとも呼ばれ、プロセス、ネットワーク、メモリ管理などOSとしての基本的な機能だけを有した軽量・高速OSです。)
組み込みの入門書はマイコンで何ができるか?処理をどう書くかといった記載があるのですが、
そもそもマイコンを動作させるには何をする必要があるのかについて書かれていることは殆どありません。(逆にいえば業務でもその領域は入門者以外の役割ということ)
この書籍はマイコンの動かし方を組み込みOSの自作という課題で詳細に解説してくれる、組み込みエンジニアにとって最高の入門書です。また、著者のブログを参考にすれば書籍の内容の延長としてDRAMの使用、TCP/IPの実装に発展し、このレベルになるともう一人前のエンジニアとして活躍できるようになります。
(DRAMの設定・Ethernet・TCP/IPをちゃんとできる組み込みエンジニアは多くない)
問題は使用するマイコンがH8という30年近く昔のものの対象ボードの将来的な入手性が不安であること、H8が新規採用されることはまずなく実用性はないこと、書籍発売がgit、docker登場前なのでソースコード・開発環境の構築がかなり大変なことです。(確かどこかに環境構築をまとめて頂いたサイトがあるはずですが)
2冊目 リンカローダ実践開発テクニック
1冊目と同じ著者です。
OS上のプログラムは当然main関数から始まり、コンパイル時のメモリマップを気にする必要はなく、プログラムもデータもOSがメモリ上によしなに配置してくれます。仮想メモリのため実際にどのメモリにアクセスしているのか気にする必要はありません。
一方、組み込みではメモリアクセス先は物理メモリ・ペリフェラルであり、アドレス先がSRAM、DRAM、NOR Flash、FPGAなどマイコン・ボードの仕様ごとに全く異なります。
リンカスクリプトをマイコン・ボード仕様に応じて作成し、そのプログラムを適切なROM領域に保存する。PowerONResetが入ったら(ボードが起動したら)CPUは特定アドレスから自動でプログラムを開始するので、ブートストラップ処理(プログラムの実行に必要な初期処理、メモリの設定やプログラムのロードなど)を行って初めてmain関数にジャンプします。
こういったマイコンでは当たり前のことは意外とカリキュラム・書籍としてまとめられておらず、実際のところ先輩や上司から教わることが多いのではないでしょうか?
複数のソースコードからプログラムを作るとはどういうことか、プログラムを作プログラムが動きはじめるためにはどのような処理が必要か、という組み込みでは重要な点を学べる素晴らしい書籍でした。
3冊目 SH‐3 & SH‐4プロセッサ入門
日立(今はルネサス)のSHマイコンは国産マイコンとして90年代から10年代まで幅広く使用されていたマイコンです。流石に今はもう時代遅れとなっており見かけることはほぼなくなりましたが、ドリームキャストやガラケーでも採用されるなど、最も成功した国産CPUの一つです。
マイコンでの組み込み開発では基本的にメーカーが出すマイコン仕様書から必要な部分(CPU構造・メモリ空間・ペリフェラル使用方法等)のみを読んで実装する流れになっています。
小規模なマイコンでもマニュアルは1000ページを超え、ArmのCortex Aシリーズに至っては、Arm CPUの仕様書(数千ページ) + 各マイコンメーカーが作成するマイコンの仕様書(1万ページ以上!)の2種類を読む必要があります。もちろん全て把握する必要はなく、高性能マイコンになればLinuxなどで動作させることのほうが多いので、必要に応じで読むスタンスでよいとは思います。
とはいえ、1つのマイコンの仕様を把握しておけば、他のマイコンにも応用が効くという意味で、
SHマイコンの仕様を把握できるこの書籍には大いに助けられました。
SHマイコンは国産メーカー製のため、日本語マニュアルがある上、国内半導体メーカが元気だった時代だったこともあり解説書籍が豊富です。基本的にマイコンマニュアルは慣れなければ全く読めないものなので、本書籍はマニュアルから解釈した内容と照合することで、マイコンマニュアルの読解力を向上させることにも大いに役立つと思います。
なお、現在のマイコンマニュアルは英語版しかなく、その英語も極めて読みにくい(ネイティブがわけわからんというレベル)ものなので非常にしんどいです。。。
SHマイコンは一人で仕様を把握して好きに実装できる最大規模のマイコンな気がします。
MMUにキャッシュがあり最大500MHzする性能と、DRAM、NOR FLASHとの接続もできるので。
小さく作るならCortex MシリーズやRXのほうが良いですが、結構大きいプログラムまで対応できる懐の深さが好きでした。(しょぼい16ビット命令セットは微妙ですが。。。)
問題は現状評価ボード等の入手が難しくなっており、個人で開発環境を整えることはかなり困難な点でしょう。今のようにUSB接続できるJTAG(デバッグ用ツール)もありませんし、法人サイズでないと手を出しにくい点でしょうか。。。
マイコン書籍としてはRXシリーズがSHのあとに何冊かあるのと、KindleでSTM32シリーズの解説書があるのでそちらの方が今の時代はいいかもしれません。開発者が本気で書いたSH入門書を日本語で読めた時代は今から考えれば贅沢ないい時代でした。
余談ですが組み込みエンジニアは一番最初に触れたマイコンを親だと思ってついていく習性があると思ってます。
4冊目 インターフェース 2007年3月号 システムを引き出すメモリ活用&設計法
すみません。書籍ではなく雑誌になってしまいました。。。
しばしばデータをキャッシュに載せろ、ファイル読み込みは遅いという言葉を聞きますが、それを電気信号レベルで理解できる一冊です。
アドレス線を出力すればデータの入出力ができるメモリはSRAMだけで、DRAMは呪文のようなコマンドを送りますし、NORフラッシュも書き込みには0xA55Aという呪文を唱える必要があります。生のNANDに至っては簡単にアクセスしてデータを取り出せる代物ではありません。
普段我々が当たり前のように使っているメモリとい
う電子部品にCPUはどのようにアクセスしているのかよく分かる書籍です。
組み込みでもメモリ設定等に手を触れることは多い方ではないため(一度ボードを立ち上げれば基本流用し続ける)、この書籍には大いに助けられました。
物理的・電気的・ソフトウェア的な目線でメモリを知ると、きっとどこかで役に立つ気がします。
インターフェース誌は10年ぐらいまでは実践的な内容が多かったのですが、最近はホビーユーザ向けになりましたね。各製品のマニュアルを熟読すれば分かるけど、エッセンスを知りたい時に大変助けられていました。きっと組み込み業界が一気に縮小・淘汰されたせいでしょう。時代の流れとは言え少し悲しい気もします。
5冊目 低レイヤを知りたい人のためのCコンパイラ作成入門
ついに書籍ですらなくなりました。ほんと、すみません。。。。
説明不要の名著です。
プログラムは最終的にバイナリコードとして実行されるわけで、そのバイナリコードを読める必要は全くありませんが、アセンブラへの抵抗は少ないに越したことはありません。
現在の組み込み開発では非常に特殊な領域以外でのアセンブラ使用はほぼありませんが、やはり処理がどういう命令でなされるのか読めば分かるという知識があるとしばしば役に立ちます。
コンパイラの作成を通してアセンブラの入門&CPUを理解できる素晴らしい書籍?です。
まとめ
そんなこんなで組み込み向けの思い出深い5冊を挙げてみました。
他にも色々ありますしCS、アルゴリズム、コーディング、開発方法等、影響を受けたものは多々ありますが、組み込みに限って紹介させてもらいました。
ありがとうございました。いつかどこかで皆様のお役に立てば、それはきっと幸せです。
Discussion