【仕事の記憶】(3)組込みシステムエンジニアへ
の続き。
初めての組込みシステム開発プロジェクトと無茶無謀な担当割り
新しい課に異動後、新規プロジェクトの立ち上げメンバにクレジットされる。前回は途中参加だったので少し気持ちがいい。
ただし、UNIXワークステーションやPCで動作するアプリケーションではない、教育では習っていない用語「ファームウェア」の開発である。
「ファームウェア」は、(大抵は)半導体不揮発メモリ上に格納されるソフトウェアを示し、小規模な組込みシステムはこの形態で実装されるものも多い。
電子交換機システムの案件を主に扱う会社・部門なので、C言語の案件も交換機に絡んでいる。
プロジェクトは以下のようなものだったと記憶している。
電子交換機に付属するハードウエアのファームウェア=組込みシステム開発。ハードウェアは、シリアルインターフェースを介して交換機から通話量などの運用情報を取得する。この情報をLANを介してUNIXワークステーションで動作する情報表示アプリケーションに送信する。
CPU:Intel80286 (リアルモードで使用。割り込み制御用などのファミリーデバイスも実装)
OSなし。タスクスケジューラは自作する。
シリアルインターフェース:RS232C 調歩同期でプロトコルも一般的なものだったような。
イーサネットトランシーバ制御用デバイスあり LANCEという名前だったような。
LANの通信プロトコルは当然TCP/IP。
イーサネットケーブルは10base5=イエローケーブル。UNIXワークステーション側はX WindowSystemで動作するGUIアプリケーション。顧客グループ会社が担当する。
プロジェクトチームは入社2年目の若手4人で構成。無謀というか危なすぎるので、課長がプロジェクトマネジメントを担う。
自分以外のメンバは、同期の中ではかなりできる人達。
入社前からC言語のコードをそこそこ書けるし、現在の応用情報技術者とネットワークスペシャリスト相当の資格も取得している。
通信プロトコルなどの知識が必要なシリアルインターフェースやイーサネットトランシーバ制御デバイスドライバ、TCP/IPプロトコルスタックを”できるメンバ”で担当する。
自分はスタートアップルーチンとスケジューラや割り込み制御が割り当てられた。
有識者であれば、こう突っ込むはずだ。
「おい、業務でC言語のコードをまともに書いたことがない奴がこんなところを作れるわけがないだろう」
正しい。その通り。できるはずないのである。
しかし、これはマズいことになった。と焦るほどの知識も実績もない自分なのであった。
組込みシステムエンジニアとしての原点
担当となった機能・処理を設計し実装するには、CPUやファミリーデバイスの仕様や制御方法、タスクスケジューリング・割り込み制御方法などを理解していないければならない。
なんとか理解するため、ノートが2冊ぐらいになるまで以下を何度も繰り返した。
分からなくてもマニュアル・本を通しで読む。
読み手が予め知っている前提で書かれている文言が使われているので遡って調べる。
ただの文字列にしか見えず何のことか理解できない。自分で噛み砕いたイメージを言葉や図でノートに整理・記載する。
ただの想像に過ぎなかったイメージは、理解が進むと間違いに気づく、都度修正をノードに記す。
C言語は新人教育でも使っていたので、プロジェクト開始時点で多少コードは書けたかもしれない。しかし、それは組込みシステムで職業プログラマが書くそれには程遠い。
ハードウェアのレジスタ設定手順やアルゴリズムが理解できたところで、これを適切なC言語のコードで表現できるようにはなっていない。
C言語の勉強を始めた時、"Hello World"のコードを目にするだろう。そこにはmain関数があり標準出力関数(printf)が書かれているはずだ。
これは汎用OS上で実行するユーザーアプリケーション作成時に必要な作法である。汎用OSは、コードからコンパイル・リンクして作られた実行ファイルを、ユーザー空間のメモリにロード・実行し、キーボードからの入力やディスプレイへの出力要求があれば制御を代行する。
OSがない小さな組込みシステムは、電源ON~OFFまですべての処理を自分たちで作りこまなければならない。ユーザーアプリケーションのmain関数は存在しないし、標準出力先へのドライバが必要であれば自分で作るのだ。
(これは必ずということではない。リアルタイムOSやハードウェアドライバ・ミドルウェアのソースコードがライセンス販売されていて組み込むことは結構ある。)
実行イメージを作るためのコンパイラ・リンカ・ロケータなどクロス開発環境も独特でC言語の教科書では学習できない。
スタートアップルーチンや、ハードウェアに近い処理はアセンブラも必要になる。C言語コードのコンパイル結果を逆アセンブルし確認し、命令セットも学ぶ。
設計を進めつつ、その実装プロトタイプをC言語やアセンブラで何度も書き直してプログラミングスキルの向上に努めた。
このプロジェクトはQCDを守り一応成功した(そもそも若手だけのプロジェクトでコストなど度外視していたのかもしれない)が、今、当時の設計やコードを見れば全面書き直ししたくなるほど稚拙で恥ずかしいものだと思う。
当時、担当を割り振った課長は何を考えていたのか...無謀というか無茶というか。スパルタが過ぎる。
本来であれば「正直、全く知らないし分からないっす。多分無理っす。」と抵抗したいところだが、当時の自分は「無知は最強」な人である。タスクをこなすためにどれほどの学習が必要なのか知らずにやる気だけで引き受けてしまった。(そもそも若手社員にタスクの拒否権などないけれど)
ただ、自分にとって、CPUのプログラミングマニュアルやファミリーチップの制御手順やアルゴリズムを理解することは、作ったプログラムをCPUやハードウェアがどのように解釈し処理するのか、その原理に触れているようでかなり楽しく・面白かった。
CPUアーキテクチャは他にも沢山ある。もっと知りたいと思ったほどである。
好きこそもののなんとやら。
C言語の学習も含めて、組込みシステムの開発というものは結構面白いものだ。と心に沁みついた。
初めての「エンジニア」的な業務経験が、それから積み重ねていく技術の原点となった気がする。