プログラミング素人のはてなブログ

プログラミングも電気回路も専門外の技術屋の末端が勉強したことや作品をアウトプットするブログ。コードに間違いなど見つけられたら、気軽にコメントください。 C#、Python3、ラズパイなど。

「リアルタイムOSから出発して組込みソフトエンジニアを極める」を読んだ

リアルタイムOSから出発して 組込みソフトエンジニアを極める[改装版]

リアルタイムOSから出発して 組込みソフトエンジニアを極める[改装版]

ソフトウェアの分野の一つとして組込みソフトというものがあります。
組込みソフトとは、家電やオフィス機器など、市販品に組み込まれているソフトウェアのことです。
また、リアルタイムOSとは、少しの時間設定のずれが大きく性能に影響する装置を駆動するOSのことで、本書では例として「レシート印刷機能付きレジスター」を取り上げています。
レシート印刷では、時間管理がずれてしまうとドットがずれるため絵や文字が再現されなくなります。
一方、組込みソフトは利益を出さなければならないので、そのハードウェア性能はギリギリであることが少なくなく、制約が大きいのです。

「組込みソフト」という分野について、どのようなものかというのが興味があったのでこの本を読んでみました。

本篇

組込みソフトのプログラムについてはあまり出てきません。
1章では組込みソフトの設計について触れていますが、2章以降はオブジェクト指向一般や、ソフトウェア再利用性や、品質を高める方法について書かれています。
つまりこの本で言いたいことというのは、市販品では安全をおろそかにするとリコールにつながるため、それはどうやっても避けるべきだ、ということなのでは思います。

ですので、具体的なプログラミングの実際の例だったり、組込みならではのプログラミングのノウハウだったりを期待していると肩透かしです。

その中では、レシート印刷機能付きレジスターで組込みならではの事例が紹介されています。
プリントヘッドのコントロールはその他印刷情報の受信や、紙送りなどと同等に扱うと、時間のかかる他の処理に影響されてプリントヘッドの処理が影響を受けると、ドット作成に発生します。したがって、プリントヘッドの制御は一番優先度が高くなければなりません。紙送りや印刷情報の受信は、時間がかかるとしてもすべて準備ができるまで待ってからシリアルに制御すれば問題は発生しませんが、ヘッドコントロールは何かの影響を受けて待ってしまうと、プリントヘッド(サーマルヘッド)が過熱しすぎてしまったりと問題が発生するからです。
この辺については、タイマー割込み、セマフォシステムコール、低レベル、といった言葉がキーワードではないでしょうか。

品質向上のひとつの考え方として、「V字プロセス」というものがあります。

f:id:s51517765:20190817152716p:plain
V字プロセス
詳細設計にたいしては単体テストを行い、機能設計には結合テストを行い…、というように部品から順番に品質を高めていくという方法です。
これはオブジェクト指向とも関連していて、機能を分割(関数化)することで品質確認をしやすくするというような側面もあると思います。
一方で、ソフトウェアというのは再利用をすることはとても多く、それは市場に出ているソフトウェアは市場で多くのテストを受けているのと同じことで、一番品質が高いことが証明されているようなものと考えられるからです。
しかし、市場では偏ったテストを受けているのと同じなのでテストされる確率が低い現象にかかわるバグや、次の製品で違った分野に適用する場合は注意が必要になります。

テストでは、正しい入力に対して正しい結果を返すことだけを確認していては不足です。
正しくない入力をした時にはそれは正しくないとErrorを返すことを確認するべきです。
医薬品の世界で、「偽陽性」という言葉がありますが、正しくないものに対して正しいような結果を返すのは問題なのです。

f:id:s51517765:20190817154857p:plain
偽陽性

要求仕様とはソフトウェアを作成するための仕様書ですが、仕様書を作る人は必ずしもソフトウェアに精通していません。
というより、私個人の経験からすると普通はまず知りません。
ですから、受け取ったソフトウェアエンジニアがソフトウェア視点で仕様に意見することも時には必要です。

まとめ

リアルタイムOSから出発して組込みソフトエンジニアを極める」という本を読みました。
「組込みソフトエンジニアを極める」とタイトルされていますが、すべてのソフトウェアエンジニアにとって知っておくべき内容だと思います。
また、ソフトウェアエンジニア以外の人(ソフトウェア以外のエンジニア、営業、企画、マネジメント…)も多少、こんなものもあるんだと知っておくと製品の品質向上に寄与すると思います。
一方、具体的な組込みならではのノウハウが中心の書籍ではありません。

というわけで肩透かしを食った面は否定できないので、具体的な組込みプログラミングの事例に当たれるような書籍を知っていたらだれか教えてください。