組込み開発とエンディアンの話
私は長年、組込み開発に従事してきたベテランエンジニア.Tと言います。組込み開発を中心に、ソフトウェアエンジニアはどうあるべきか、など、日頃考えている事や感じた事をとめどなく書いてみようと思います。
とある装置の開発を任された話
ある装置の組込み開発をすることになりました。負荷の高い処理はFPGA(Field-Programmable Gate Array)で実現します。
私はMPU(Micro-Processing Unit)で動くファームウェアの組込み開発を担当します。MPUは接続するデバイスやネットワークのバイト列からビッグエンディアンで動作させることが決まりました。
FPGAのレジスター等を外部エンジニアに依頼
それでFPGAのレジスター等の外部インターフェイスもビッグエンディアンで動作させることを依頼するために、FPGA開発エンジニア(「FPGA屋」と呼びます)と打ち合わせを行ったのです。
ところが、FPGA屋さんは意外にもビッグエンディアンを知らなかったのです。何の疑いもなくリトルエンディアンで動作するFPGAしか開発した経験がなかったのです。
なお、ビッグエンディアンとリトルエンディアンの違いは、巷に解説したホームページ(例えば https://ja.wikipedia.org/wiki/エンディアン など)や書籍がたくさんありますので、調べてみてください。
FPGA屋さんに図説する
仕方なくFPGA屋さんにエンディアンを解説し、ビッグエンディアンとリトルエンディアンの違いを図を使って説明しました。そして、FPGA屋さんから「分かりました。ビッグエンディアンで実装します。」とのお言葉を賜り一安心したのです。
依頼したプログラムが届く
暫くすると、FPGAプログラムが届きました。評価ボードのFPGAに届いたプログラムを焼き込み、自分が実装したファームウェアとの結合テストを始めました。そして、FPGAのレジスターを読むと、な、な、何とデータはリトルエンディアンではないですか!
私があれだけ一生懸命説明してFPGA屋さんは「分かりました」と言っていたのに、結局はリトルエンディアンでしか実装できなかった、という落ちだったのです。
MPUはビッグエンディアンで動きますので、阿保FPGAとの読み書きは全てエンディアンの変換が必要になってしまったのです。折角負荷が高い処理をFPGAに任せるはずだったのに、その読み書きで、わずかですが、負荷が発生する、という全くもってダサいシステムになってしまいました。
組込み開発エンジニアの皆さんへ
元を正せば、FPGA屋さんに対する私の説明が至らなかったのかもしれません。ただ、組込みシステムの開発を担当するエンジニア(ハード、ソフトに関わらず)の皆さんは、エンディアン程度の基礎知識は是非持ってほしいと願っています。
私みたいに、第三者に対する働きかけが徒労に終わるような経験は、避けて欲しいものです。
ちなみに、当社では組込み開発を始め、様々なシステム開発の相談、設計、実装を全国対応で行なっています。無料相談も実施していますので、お気軽にご相談ください。