組み込みソフトウェアの動きとは?OS無しのシステムでの仕組みを徹底解説

組み込みソフトウェアって何?

組み込みシステムは私たちの身の回りにあり、家電製品、医療機器、産業機器、さらには航空宇宙分野まで幅広く活用されています。ユーザーがアプリケーションを選択できるものに対して組み込みシステムでは特定用途に特化した作りになっていることが特徴です。

組み込みシステム = 特定用途向けシステム

組み込みシステムは機構(メカ)、電気回路、ソフトで構成されており、このソフトのことを「組み込みソフトウェア(組み込みソフト)」と呼びます。

組み込みシステムとは?

「組み込み機器」「組み込みシステム」という言葉を聞いたことがありますか?いわゆる「コンピューター機器」の一種ですが、コンピューターという言葉は聞いたことがあっても「組み込み機器」は知らない方が多いと思 ...

組み込みソフトには、OSが搭載されているものとされていないものがありますが、特にOSが無い場合、「メイン処理」が組み込みソフトウェアの要となります。本記事では、OS無しのシステムに焦点を当て、その動作原理について解説していきます。

組み込みソフトウェアの基礎知識

先述のとおり、組み込みソフトは特定用途向けに作られたソフトであり、電気回路や機構を使って外部とやりとりする動きをするよう最適化されています。

OS無しの場合、ハードウェア制御部分も用意する必要があるため、C言語やアセンブラがまだまだ多い状況です。これらの言語は実行タイミングや間隔を厳密に調整できるため効率的に動作を記述できることが大きなメリットです。

C++をはじめとしたオブジェクト指向言語、Pythonのようなインタープリタ言語は基本的に向いていません。やりたいこと以外の処理が介在するため、タイミングやメモリ効率にうるさいシステムでは使えないからです。

プログラミング言語にはいわゆるメインルーチンとサブルーチンがあり、これらは書籍にもよく出てくる言葉だと思います。OS無しのケースについて、順を追って見ていきましょう。

メイン処理とは

CPU上で順次実行されていく処理の部分を「メイン処理」といいます。処理にはこの「メイン処理」と「例外処理」しかありません

さて、メインルーチン、サブルーチンはどこに行ったのか・・・?これから説明します。

メイン処理とメインルーチン

規模が小さいとき、メイン処理とメインルーチンは同義です。

しかし規模が大きくなってくると、メインルーチン内に同じ処理が頻出したり、規模が大きい故に人間の認知能力の問題でわかりにくくなったりしてきます。そんなときに使うのがサブルーチンです。

サブルーチンを使いだすと、メイン処理とメインルーチンは同義ではなくなります

サブルーチンの主な役割

サブルーチンは、同じ処理内容をまとめたり、難しい処理をメインルーチンから隠すのに使われます。人間の可読性のための存在なので、CPUにとってはぶっちゃけ必須ではありません

同じ処理内容をまとめる、というのは不具合が出たり仕様が変わったりしたときに、同じ処理内容の箇所全てに手を入れようとすると管理しきれず、ミスを招きます。サブルーチンにすることで手をいれるところが一箇所で済み、そういったミスを大きく減らすことができるわけです。

サブルーチンからさらにサブルーチンを使うこともできます。上位側を「親」、下位側を「子」などと呼びます。この場合のサブルーチンも、親側を読む人の可読性を上げることが目的です。

なお最近の言語では、サブルーチンというもののうち戻り値があるものを「関数」と呼んでいます。C言語系の言語では全て「関数」と呼びますが、本記事では全て「サブルーチン」と呼んでいます。

メイン処理の定義

メイン処理は、メインルーチンとサブルーチンを合わせた全体を指します。例外処理や、例外処理から使われるサブルーチンは含みません。

C言語でいうmain関数はメインルーチンです。main関数から使われるサブルーチン(関数)も含めたものがメイン処理、ということになります。

CPUの動き

PCでソフトを作ると、メイン処理の先頭から開始され、メイン処理が終わるとソフトの動きも終わります。これを司っているのはOSです。

しかし組み込みソフトの世界では、まずCPUがハード的に起動し、ハード的に決められた処理から開始します。これは「スタートアップ処理」と呼ばれるもので、例外処理の1つです。

このスタートアップ処理が、メイン処理を呼び出します。メイン処理が終わるとスタートアップ処理に戻ってきますが、終了処理を定義していない場合は暴走と同じ状態になってしまいます。

組み込みソフトのメイン処理には永久ループがあるのが普通ですが、これはそういった理由があり、メイン処理を終えることにリスクがあるからです。

ポイントまとめ

  • サブルーチンはソースコードの可読性を高め、メンテナンス性を上げるためのもの
  • メインルーチンは全てのサブルーチンの親玉
  • サブルーチンのサブルーチン、のような階層構造も可。上位側が親、下位側が子と呼ばれる
  • メイン処理はメインルーチンと全サブルーチンを合わせたもの(例外処理を除く)
  • 組み込みソフトのメイン処理は、例外処理によって開始される

ソフトを木に例えてみましょう。

メインルーチンは一番根本の幹です。そこからの枝は全てサブルーチンです。そして、メイン処理は木そのものです。そう考えてみるとイメージしやすくなりませんか?

サブルーチンの真の重要性

何となく、サブルーチンは「ちょっとしたTipsなんでしょ」と思っている方もいるかもしれません。しかしサブルーチンにはとても重要な存在意義があります。

それは、処理を部品化・資産化する、ということです。

ハードウェア依存の処理や、難しいアルゴリズム、複雑な計算といった処理は、サブルーチン(C言語でいう関数)にし、ライブラリにすることで、他のプロジェクトでも再利用することができます。

これを考慮できるかどうかが、一人前のプロであるかどうかの分かれ目であると言っても過言ではありません。これができていない組織はいつまでも生産性が上がらないのです。

どうすれば以降の自分(たち)の生産性を高めていけるのかを常に意識し、使いやすいサブルーチンを積み重ねていくことが、自分や組織のメリットになると心得ておきましょう。

  • B!