motoh's blog

主に趣味の電子工作やプログラミングについて書いていきます

組込みソフト開発で学んだ知識まとめ

プロフィールの通り、自分は組込みソフトエンジニアであり、就職してからいつの間にか10年近く経ちました。10年目にしてはあまり自信はないのですが、思い起こせばいろいろと考えたり学んだりしてたので、ここでまとめてみたいと思います。学生の頃にマイコンのプログラミングは経験していましたが、就職してから34年目くらいまでは結構ついていくのに必死でした。その頃を思い出しながら書きたいと思います。

 

f:id:mzmlab:20190703213900j:plainRepublicaによるPixabayからの画像

 

  

はじめに~組込みソフト開発ってどんなことするの?

組込み系と一口に言っても、システムの規模によって使う技術も様々ですが、自分は主にマイコンF/Wの開発に携わってきました(システムの規模は小さく、OSもなし)。どんなことをしているのかについては、最近たまたま同じような境遇の方のブログを見つけ、とても共感したので、自分で書き直すことはせずリンクを貼らせていただきます(^^)

nmmmk.hatenablog.com

 

組込みソフト開発で学んだ知識

MISRA-C

マイコンF/W開発のチームに入ってまず渡されたのが、MISRA-Cの本でした。

 『組込み開発者におくるMISRA‐C:2004―C言語利用の高信頼化ガイド』
 
 MISRA‐C研究会 日本規格協会

MISRA-Cは自動車業界で生まれた、C言語で安全なプログラムを書くためのコーディング規約です。本を読んでみた感想として、ほとんどのルールがコンパイラの基本的な仕様に関するものであり、自動車業界に限らず知っておいたほうがよいと思える内容でした。

実際、MISRA-Cを学ぶまで知らなかったコンパイラ仕様もあるので、少し紹介します。

・汎整数拡張と平衡化
異なる型の間での演算を行う場合、暗黙的に同じ型に変換されますが、この暗黙の変換は汎整数拡張と平衡化により実行されます。まず汎整数拡張により、式中の整数型(charshort)はint型に昇格します。その後、平衡化により、より精度が高いオペランドlongfloatdouble)に合わせられます。自分は汎整数拡張のことを知らなかったので、今更C言語でこんな発見があるのかと、目から鱗でした。

・プロトタイプ宣言がない場合のコンパイル結果
プロトタイプ宣言がなくてもコンパイルは通るため、プロトタイプ宣言が抜けていないかのチェックは疎かになりがちですが、実はプログラムの動作結果に影響します。プロトタイプ宣言がない関数は、コンパイラが勝手に戻り値と引数をint型と解釈します。そのため、もし定義側の戻り値や引数が浮動小数点数だったとしても、動作時は小数点以下が丸められてしまいます。(コンパイルエラーにしてほしいですね。warningは出ますが、warningがいくつも放置されているプロジェクトだと見落としてしまうので。)

マイコンの仕組み

マイコンには学生の頃から触れていましたが、就職してから新たに学んだことも多いので、挙げていきたいと思います。なお、すべて以下のサイトで気軽に学ぶことができます(会社HPの技術コラムのようですが、かなり丁寧に書かれています)。

[技術コラム集] 組込みの門

・ヒープとスタック
学生のときは、サイズが大きな配列はローカル変数ではなくmallocで動的確保しましょうと習いましたが、メモリ領域におけるヒープとスタックの違いについて理解するとその理由がわかります。

・メモリのセクション
PCアプリのプログラミングではプログラムコードやグローバル変数、定数などがメモリのどこに配置されているか、あまり気にしないと思いますが、マイコンはメモリサイズが小さいため、すべて考えて配置する必要があります。 

・キャッシュ
マイコンでキャッシュを使う場合は、キャッシュの有効/無効をメモリ領域ごとに検討する必要があります。また、組込みではDMAなどを行った場合にキャッシュに最新の値が反映されず、不具合の原因になることがあります(コヒーレンシの問題)。

・スタートアップルーチン
main関数が呼ばれる前のマイコンの初期化処理であり、アセンブラで書かれています。大抵はマイコンのベンダーがサンプルを用意しているため、自分でゼロから作ることはありませんが、簡単なカスタマイズは自分でする必要があります。

デバッガ(ICE

学生のときは、マイコンプログラムのデバッグLEDprintf(出力先はシリアル通信のターミナル)で行っていましたが、仕事ではICEによりIDE上でデバッグすることが多いです。ICEによって、Visual Studioのようにプログラムを1ステップずつ実行したり、メモリダンプしたりできます。また、CPUレジスタペリフェラルレジスタを参照・設定したり、キャッシュの内容を表示したり、スタックトレースできたりと、デバッグが大変はかどります。

また、IDEマイコンCPUやメモリをエミュレートする機能を持っている場合があり、開発初期に実機が入手できないといった状況でもデバッグを行えます(ペリフェラルはさすがにエミュレートできないため、主にアルゴリズムデバッグ単体テストで活躍しました)

科学技術計算

マイコンプログラムは基本的にC言語で開発するため、科学技術計算の標準的なライブラリはありません。そのため、客先から要求されたときは、まずは自力で実装方法を調べることになります。

過去経験したものに、最小二乗法があります。なんとなく原理は知っていましたが、自分で実装したことはなく、実装できたとしても処理速度や計算精度といった性能面で要求を満たせるのかが心配でした(もちろん、インターネットに転がっているプログラムでも同じ心配があります)。そんなとき、たまたま持っていた本が、『C言語による最新アルゴリズム事典(奥村 晴彦 著)』でした。久しぶりに本を開いてみると、最小二乗法について計算効率まで考慮したアルゴリズムソースコード付きで載っており、本を買った時の期待以上に助けられました。もちろん、本に載っているからといっても使うときは自己責任ですが、自作やインターネットに比べたら安心感は段違いです。

高速フーリエ変換FFT)を要求されたこともありますが、これはマイコンのベンダーがライブラリを提供していたため、自分で組まずに済みました(信号処理向けのマイコンだったので、当然といえば当然ですが)。ただ、コンパイルを成功させるまでに時間がかかったり、その後使いこなすまでにも時間がかかったりはします。

難しいアルゴリズムの実装はプレッシャーもありますが、動いた時の喜びも大きいので自分は好きです。

ロジカルライティング (追記 2021/12)

組込みソフトとは直接関係はありませんが、仕事を進める上で役に立った知識です。メールやプレゼン資料で(もちろん、口頭でのやり取りでも) 相手に伝えたいことを正確に伝えるにはどのような文章構成にすればよいかを、体系的に示したものがロジカルライティングです(ロジカルシンキングが有名ですが、それを文書作成に展開したものです)。

いろいろな書籍や講座がありますが、自分が読んだのはこちらの書籍です。

『ロジカル・ライティング―論理的にわかりやすく書くスキル』

 照屋 華子()

全体を説明してから詳細を説明するとか、メールなら何を相手に依頼したいのかを初めに書くとか、ある程度経験を積んでいれば無意識にやっていることもありますが、なぜそのようにしているのかを体系的に理解できるので一読の価値はあると思います。

 

組込みソフト開発におけるキャリアアップ (追記 2021/12)

この記事を最初に投稿してから早くも2年以上が経ちましたが、実は最近転職しました。

前職は受託開発の会社で、ハードウェアはすべて客先が製作し、ソフトウェアの要求仕様も基本的にはすべて客先から提示されます。学生時代のソフトウェア系の友人も皆、受託開発の会社に就職していたため、ソフトウェアは受託開発が当たり前だと思い込んでいました。

でも10年以上働いていると、次第に物足りなさを感じるようになりました。元々ハードウェアにも興味があり、もっと上流の、ハードウェアを含めた構想設計の段階から関わってみたいという思いが強くなりました。

また、全ての受託開発がそうとは限りませんが、前職では10年目くらいになるとプロジェクト管理を任されるようになり、チームメンバーの進捗管理や品質管理、コスト管理等がメインになるのが当たり前でした。

そんなこんなで、自分の年齢でも組込みソフト技術者として自社製品の開発に携われる会社はないのだろうかと、転職サイトで検索してみると、そのような会社は思っていたよりもたくさんあることがわかりました。(そこからは、転職サイトのエージェントからのアプローチを皮切りに、どんどん転職活動が進んでいきました。)

とはいえ、受託開発で経験を積み上げてきたからこそ転職が成功したのも事実です。また、新卒で今の会社に採用されたとしても、メカや電装など幅広い会社であるため、最初から組込みソフトをやらせてもらえたかはわかりません(そもそも、好きな会社を選べるほどの学歴や成績でもなかった^^;)。学生時代にあまり深く考えずに就職活動をしていたことを悔やんだこともありましたが、今となっては、転職で徐々にキャリアアップしていくのが自分には合っていたのではないかと感じています。