【再帰呼び出し】《SW全般》
執筆募集中!
【最適化】《ツール》
コンパイラが、入力されたプログラミング言語で書かれたプログラムを実際のCPUで実行できる実行プログラムの形式に書き換える際、プログラムに書かれたままの状態で書き換えずに、実際のCPUで動かす上での実行速度やコードサイズを考えた形に書き換えることがあります。これを「最適化」と呼びます。一般に、アセンブリ言語を使用してコーディングせずに高級言語(C言語など)を使用した場合、実行プログラムの実行性能は悪くなる傾向があります。このため、最適化は、コンパイラを利用する上での必須機能のひとつです。しかし、最適化の方法により、複雑なコードを生成することがあります。生成された機械語には最適化の手法により誤ったコード生成を生じる場合がありますので、コンパイラによる最適化の機能を理解した上で、それを上手に利用すると、効率の良い実行プログラムを作成する上での助けになります。
【再利用】《SW設計》
ソフトウェアを開発する際に忘れてはならないのが再利用です。
言葉の意味は文字通り既存の成果物(仕様、設計、モジュールなど)を新たなプロジェクトで、もう一度使うということですが、なぜそれが大切なのでしょうか。
まず第1に、既にあるものを利用することにより、開発期間が短くなりひいてはコストを大幅に削減できるという理由が挙げられます。第2には、再利用を重ねることにより繰り返し検証が行なわれることになり、それだけ高品質のものを得ることができるという期待もあります。
しかし実際には2つの理由で再利用は困難です。
(1) 再利用すべきものをどこで探せばよいか分からない。
(2) たとえ再利用対象が発見できても、実際に使えるかどうかが分からない。
最初の問題(1)はインターネットの普及により、情報の手がかりが多く得られるようになり、以前に比べれば改善されていると言えます。
オープンソースの中に一般的な解を見出し、それを出発点とできるケースも多くなりつつあります。デザインパターンのカタログを編集しているサイトでは、沢山の有用なデザインパターンを見ることができます。とはいえ基本的なもの(OS
API(System Application Program Interface)や標準的なライブラリ)を除けば、より特化した解を探すための手がかりは難しく、結局良く知っている人に情報への入り口を教えて貰うといったものが一番有効だったりします。
後者の問題(2)は厄介です。機能仕様として求めているものが見つかったとしても、実際に現在の開発プロジェクト内で、そのまま利用できるか否かは難しい問題です。
手に入るモジュールには多くの場合、特定の環境の中で利用することを前提とした仕様書しか付随していませんが、その特定の環境に関する要件が、組み込み技術者が必要とする精度で書かれていない場合も多いのです。
組み込み系以外のソフトウェアモジュールなら、前提条件として「POSIX(Portable Operating System
Interface for UNIX)APIが提供されること」といった(本当はかなり曖昧な)ものでも許されるかも知れませんが、組み込みシステムで再利用可能なものを考える場合には、その再利用対象の「何か」には、自らが提供する機能に加えて「自らが要求するリソース」に関する仕様も付随していなければなりません。またその記述方法は、再利用される対象が、仕様なのか、設計なのか、プログラムなのかによって大きく異なります。
結局こうした理由から、多くの場合一般的な再利用は特定の組織内だけに留まる事例が大部分でした。しかしながら、急速に複雑化する現在の開発プロジェクトでは、たとえ自身の組織内における再利用に限っても急速に難しさが増しています。このような問題に対処するためには、個々の再利用対象が提供する仕様と、要求する外部のリソースへの仕様をきちんと記述するようにしなければなりません。
何らかの原因により回路の電圧が急激に高まること。落雷に起因する機器の異常帯電から生じる現象もサージと呼ぶことがある。
弱電の電子回路設計が原因でサージが生じることはないが、モータの回転といった装置の物理環境とか、組み込み装置を操作する人間がセータを着ているなどで静電誘導からサージが起きることもある。
サージ現象が起きた場合には電子回路へ電磁刺激として伝播するので、レジスタやバスの信号が崩れてプログラムの暴走につながったり、最悪の場合は電子回路が壊れることになる。よってサージ現象の生じる可能性のある電気、電子回路とプロセッサやデジタル回路は十分に隔離する設計が必要である。
サージの隔離には、光インターフェイスや絶縁トランスといった電気伝導体のない伝達系を使用する。
参照:ノイズ、外来ノイズ
【冶具(Jig)】《HW》
機械で工作物を保持したり、工作機械へのガイドとして用いる補助機器。
英語のjigに当て字の「冶具」を当てる。
コンピュータ系の開発現場では、デバッグや測定のための補助機器を機械での用語を流用し冶具と呼ぶ。機械での冶具は一般に、箱や板、フレームなどを指すが、コンピュータ系開発で用いる冶具は開発現場で自作した専用機器を指すことが多い。
【資源の競合】《OS》
メモリ、入出力装置など、プログラムの実行を行う際にCPUが必要とするものを資源といいます。また、CPUの実行時間自体を資源という場合もあります。
RTOSを用いたシステムでは、複数のタスクが同一の資源を扱う場合があり、その資源を奪い合う状態が発生することがあります。この状態を資源の競合といいます。
資源の競合には、(1)資源の依存関係が他のタスクとの間にあり、各タスクがその他のタスクの占有している資源の解放を待っているデッドロック、(2)あるタスクの占有したメモリ資源につき、占有したタスクが処理を完了しているにも拘わらず,資源を開放していないため、他のタスクがメモリ資源を獲得することができない、飢餓状態などが挙げられます。一般には、RTOSのセマフォ機能や、タスク間の同期、飢餓状態を発生させたタスクの強制終了による資源開放により問題の解決を行います。
【自己診断】《SW全般》
ハードウェアの故障の有無を調べるために実行されるソフトウェアを「診断」と呼び、診断の対象範囲と同一レベルでソフトウェアの実行環境がある場合を「自己診断」といいます。(自分で自分の正常性を確かめる訳です)
診断ソフトウェアはハードウェアにアクセスを行い、その結果が予期したものと一致するか確認するという動作を繰り返し行い、不一致が検出された場合何らかの故障があると判断します。中にはアクセス結果を表示して、故障の判断を人にゆだねるケースもあります。
自己診断は、電源投入時・リセット動作時に自動的に行われる場合(スイッチなどの外部条件で抑止されることもありますが)、外からの要求(ボタン操作、接続コンソール等の保守装置からの指示、遠隔操作)、故障発生を検出した機能(ソフトウェアやハードウェア)からの要求などに応じて起動されます。また診断の結果は、起動原因に応じてランプ・コンソール・コマンド応答などの手段で外部に通知されます。通常故障と断定されたハードウェアは人の手で交換されます。
診断は、「実行時間」と「故障検出能力」で評価されます。実行時間は短いほど良く、このため診断するハードウェアが故障していないことをいかに短い時間で調べるかが重要になります。また故障検出能力は、システム(ハードウェア+ソフトウェア)が正常に動作する範囲をカバーしていることが重要です。
システムとして使用しない範囲を診断し故障を検出する場合、まだ使える機器を故障と判断することになります。また使用する機能(ハードウェア)が診断の範囲から外れている場合、故障をなかなか特定できない問題が起きます。(ハードウェアは必ず壊れるものですが、本当に壊れたのか、壊れた時にどうするか、どうなるかを考えておくのは大切なことです)
自己診断の場合、診断の実行環境(こ れを「ハードコア」と呼び、小さいほど良い)とシステム外部との接続部分(通信経路だけでなく、ランプやキー・ボタンも含まれます)が診断対象から外れることが多いため、システムの故障を判断するには自己診断だけでなくマニュアル(取り扱い説明書)による補足を行っておくことも大切です。
【システムLSI】《プロセッサ》 → SIP
【システム記述言語】《HW》
製品が複雑、多機能になるに従い、その開発規模は増大し、分業による開発の効率化を図るため、設計の比較的初期の段階で、システム全体をハードウェア(電子回路)とソフトウェアに分割した上で、開発を進めることが一般的になっています。その結果、ハードウェア(電子回路)とソフトウェアの設計者の間に組織の壁が出来、各々の世界で設計の最適化が図られてきました。
ハードウェア設計の側では、基本論理であるANDやORといった回路レベルでの設計から、Verilog-HDL(Hardware Description Language)やVHDL(VHSIC Hardware Description Language)といったハードウェア記述言語による設計へと、設計の抽象度が上がってきて、現在では、実装に依存しないシステムレベルの設計へと移ろうとしています。
ハードウェアとソフトウェアを含むシステム全体を記述する言語として、ソフトウェアのプログラミング言語仕様であるC/C++を利用するというアイデアが有望で、逐次的な処理を基本にしたソフトウェアにはない、ハードウェア独自の特徴である、並列動作や動作時間などの表現機能が追加されています。
有名なシステム記述言語としては、カリフォルニア大学のGajski教授が提唱したSpecCや、シノプシス社などが共同開発したSystemCなどがあり、STOC(SpecC Technology Open Consortium,http://www.specc.gr.jp/)や、OSCI(Open SystemC Initiative,http://www.systemc.org/)が普及推進、標準化を行っています。
システム記述言語による設計ができると、ハードウェアとソフトウェアの設計の壁が取り払われ、システムを分割しないで設計を進める協調設計や、互いのモデルをテスト環境として用いる協調検証などが可能になり、開発期間の短縮や、設計品質の向上などに効果が期待されます。
【実機(Target Machine)】《SW全般》 → ターゲットマシン
【実機を意識したテストパターンやテストデータ(ベクタ)】《テスト》
実機ができあがるまでPC上または机上でおこなう単体テストはおそらくシングルタスクがメインだったであろう。
実機を使った場合は
が有効になる。
品質を高める上ではユーザビリティを意識して、ユーザーが使いやすいかどうか確認をする。
ユーザーに違和感をあたえるようでは、いくら機能が充実していてもユーザーは納得してくれない。
実機を意識したテストパターンは以下がある。
テストデータ
各機能が使うデータをすべて(MAX)入れておき、それぞれの機能で少しづつ変更して各機能をテストする。テスト(MAX)データはTOOLを使って用意する場合と実機で一からMAXデータを作る場合との二通りを行うとよい。実機でMAXデータを作成するのは時間がかかるのでMAXテストの時間を短縮するのにTOOLを使う。最終的には、ユーザー観点から実機でMAXデータを作成する。作成する過程でユーザー観点で作成していき、実使用上の問題点がないかも確認していくとよい。
【実行のインフラに関する知識】《SW全般》
執筆募集中!
ホスト・マシン上でターゲット・システムの動作をシミュレーションするソフトウェアをシミュレータと呼びます。
プログラムの動作検証、テストを行う時に使用します。
通常、ソース・レベル、またはアセンブラ・レベルで動作します。
プログラムの論理検証をハードウエア開発から独立して行えるため、ターゲットとなるハードウェアが足りない時や完成していない時に役に立ちます。
また、ハードウェアでは通常再現できないような条件や再現すると危険な状態などもシミュレータでは行うことができます。
【シュミット・トリガ】《HW》 → ヒステリシス
【使用環境】《SW全般》
執筆募集中!
【状態遷移図/状態遷移表】《SW設計》
状態遷移図とは、状態と、その状態がイベントをトリガとして別状態に遷移する様子、及びアクションを図示したものです。しかし状態を中心にして記述されるためすべてのイベントに対する分析を網羅しにくいという欠点があります。
それに対し状態遷移表は、すべての状態とイベントの対応をマトリクス上で分析するものであり厳密な分析設計が可能ですが、状態遷移図に比べると見難いというマイナス面もあります。
状態遷移はイベントに対する応答の特徴によりムーア型とミーリー型の2種類に分類されます。また状態の入れ子の概念を含めたハレル型も良く使われUMLでも採用さており、ムーア型やミーリー型への拡張もされています。状態遷移図及び状態遷移表はこれらの状態遷移の種類を表現する手段として使われています。
型 | 特徴 |
---|---|
ムーア型 | イベントに対し状態を遷移後にアクションを行う。 |
ミーリー型 | イベントに対しアクション後に状態遷移する。 |
【冗長設計】《SW設計》
ある特定の部分の故障によりシステムの機能が失われてしまうとき、その部分を単一故障点と呼びます。システムから単一故障点を除去するために冗長設計が用いられます。
冗長設計は演算機能、故障検出機能、故障分離機能、再構成機能、および再同期機能をそれぞれ分散化することにより行われます。
演算機能を冗長化する方式としては、多数決方式や時間軸上の冗長設計として同じ演算を2回以上実行して結果を確認する方式などがあります。
故障検出機能を冗長化する方式としては、誤り検出・訂正符号や、複数のプロセッサが自身の出力と他のプロセッサの出力とを比較する方式などがあります。
故障分離機能を実現するためには、故障が生じた部分を物理的、あるいは論理的に隔離できる必要があります。システムがうまく階層的に構成されている場合には、故障をマスクして他に波及させずに済ますこともできます。故障した部分が自発的にシステムから離脱できるようにすれば故障分離機能も分散化した冗長設計ができます。このようなシステムをセルフパージングシステムと呼びます。
故障分離機能が実現できていれば、冗長系に切り替えたり、故障した部分を切り離して失われた機能を他の機能で肩代わりさせるようなシステムに発展させることも可能です。これらは再構成機能と呼ばれますが、完全にもとの機能・性能を維持せずに、一部の機能を縮退させたり、性能を落としたりすることによりシステムの運用を継続することを優先させる場合もあります。
システムに故障が発生した以前の状態が保持されていれば、システムを再構成した後に、その時点まで一旦後戻りして処理を継続させることも可能です。このような再同期機能が組み込まれていれば、速やかに通常の処理サイクルに復帰させることが可能になります。
これらの冗長設計を行うに際しては、十分に故障ケースの解析を行い、一過性の故障に対応するのか、永久故障に対応するのかなども考慮して最適な方式を選択する必要があります。
1本のデータ線を用いて1ビットずつ順次データを転送する機能。クロック同期と調歩同期の2種類の通信方式がある。マイクロコントローラにおいては8ビット単位の送信あるいは受信毎に内部的に割込みが発生するので、複数バイトのシリアルデータ通信に有用である。代表的なシリアル通信の規格としてはRS-232CやI2Cなどが挙げられるが、車載分野で広く採用されているCAN, LINなどもシリアル通信の一種といえる。
参照:3線接続
【シリアル通信】《HW》 → シリアル
プリント基板面に基板名や部品番号などを印刷すること、あるいは印刷されたものをシルク印刷(通称シルク)と呼びます。
シールドとはノイズなどの外乱による異常動作から電気回路を守るため、あるいは逆に外乱のもとを周囲にまきちらさないようにするため(FCC, VCCIを参照のこと)に設置される遮蔽材あるいは遮蔽システムを指す言葉です。シールドは、対象により次の4種類に大別できます。
一般には影響を受ける側と与える側の距離を離すことが上記の外乱を防ぐためには最も有効です。しかし組込み機器は製品容積の制約が設定されることが多く、機器内部で相互に外乱を与えあうことになりがちです。そのたような場合には内部に有効なシールドを設計・設置することが製品の安定動作のために重要となります。
【シングル・プロセッサ/マルチ・プロセッサ】《プロセッサ》
コンピュータは、CPU、Memory(記憶装置)、I/O(入出力装置)から構成されています。CPUは、Central Processing Unitの略で、中央処理装置と訳され、CPUを単にプロセッサともよびます。
現在のプロセッサ・アーキテクチャの主流は、フォン・ノイマン型とよばれています。これは、プログラム・カウンタの指しているメモリーの内容を命令として読み込み実行するという方式です。このため、巨大なメモリーが装置に組み込まれていても一つのプロセッサ(シングル・プロセッサ)がある特定の時点で実行するのはそのうちのただ一カ所に納められている命令だけです。
これに対し、同時に複数の命令を実行させるため考え出されたのが、複数のプログラム・カウンタをもつコンピュータ・システム、マルチ・プロセッサ・システムです。マルチ・プロセッサ・システムは、次のように分類されます。
物理的分類
機能的分類
各プロセッサの接続は、専用のバスによるものから、ネットワークによる接続まで多岐にわたります。膨大な演算処理を必要とする天気予報などで使われているコンピュータ・システムがマルチ・プロセッサ・システムとして代表的です。
組み込みシステム分野では、現代の自動車制御システムや人工衛星内通信制御システムにネットワーク接続された複数のプロセッサが使われています。
【シングルタスク/マルチタスク】《OS》
タスクとは、「MPUとそのMPUで実行されるプログラムを含むシステム資源の集まりの単位」として定義されます。いわばプログラムあるいはMPUを中心にしてシステムを考えるのではなく、MPU、メモリ、プログラム、入出力デバイスなどの集まりとしての仕事(タスク)を主体にシステムを考えようということです。
どのタスクも必ずMPUとプログラムを含みますが、それ以外にどのようなシステム資源の集まりを必要とするかはタスクごとに違います。
私たちが仕事をする場合、仕事をしてほしいという要請(イベント)を受けた後、その仕事を実行するのに必要な資源をそろえて仕事を開始します。必要な資源が揃わないとその資源を入手するまで仕事の実行を待ち合わせることになります。
コンピュータにおけるタスクにおいても同じことが言えます。イベントの発生あるいはイベントの発生を待ってタスクを実行することになります。必要なシステム資源を全て獲得したタスクを実行状態、後はMPUだけを獲得すればよい状態を実行可能状態、これら以外の状態を待ち状態といいます。実行可能状態にあるタスクがMPUを得ると実行状態に移ります。このようにタスクは資源の獲得状況に応じて状態を遷移します。タスクの状態と状態遷移はオペレーティングシステムによって管理されます。以上のことから、MPUが1つしかない場合、実行状態になれるタスクは高々1個となります。一方、実行可能状態や待ち状態になるタスクは複数存在可能になります。
シングルタスクとは、システム内のいかなるタスクも、すでに実行状態になっているタスクTがあれば、そのタスクTの実行が終了するまで実行状態になれない方式を指します。シングルタスクでは、1つのタスクの実行が終了しない限り、次のタスクは実行状態に移ることは出来ません。
マルチタスクとは、システム内に発生する各タスクが、それぞれ実行状態、実行可能状態、待ち状態など他の状態に遷移することが可能な方式を指します。例えば、あるタスクが実行状態から実行可能状態に遷移し、代わって別のタスクが実行状態になるといった状況を認めるのです。実行状態から待ち状態に遷移したタスクの場合は待ち状態から実行可能状態を経て実行状態へと遷移していきます。他のタスクが実行状態になることが可能です。マルチタスクでは、例えば実行がいつ終了するか判らない複数のタスクを並行して実行させていくことが可能となります。
・ レベルセンス方式
信号が(しきい値以上または以下で)、Hi(またはLow)である状態を検出する方式のことです。Hi(またはLow)である間は、ずっと有効/無効と判定します。
Hi/Lowを明確にして、Hレベルセンス/Lレベルセンスと呼ぶことがあります。
・ エッジトリガ(エッジセンス)方式
信号のLow→Hi(またはHi→Low)への変化を検出する方式のことです。
Low→Hiを立上がりエッジ、Hi→Lowを立下がりエッジと呼ぶことがあります。
また、ディジタル回路で用いられるパーツには、HiレベルとLowレベル2つのしきい値があります。
各パーツのデータシートには、Hiレベル/Lowレベルの入出力電圧に関する記載があります。中間レベルでは、Hi/Low不定です。
<凡例>
・ 回路では、チップセレクト、R/W信号等の制御信号でレベルセンス方式がしばしば用いられます。
また、クロックはエッジトリガ方式として使用される信号の代表的なものです。各種信号の同期を取るのに用いられます。
・ 割り込みに関して、レベルセンス/エッジトリガをソフトウェアで選択設定できるマイコンがあります。いずれに設定するかは、割込みの性質によって変わってきます。
センサやスイッチ等の変化を割込みに使用する場合はエッジトリガ方式が一般的です。
PCIで採用されているように、複数デバイスで割り込みが共有されているような場合にはレベルセンス方式が使用されることがあります。
なお、設定を誤ると誤動作するので注意が必要です。
<その他(検出時不良/不具合について)>
・ 予期せずHi/Lowがふらつくような場合(=エッジ検出/レベル変化の検出が予期せず高周期で発生するような場合)、原因としてはチャタリングや端子接続の不備(レベル不定)などが挙げられます。
【信頼性解析】《品質》
執筆募集中!
【水晶発振子(Crystal Oscillator)】《HW》
コンピュータの基本クロック、カレンダータイマのクロックなどに用いられる高精度な振動素子のこと。水晶片の両端に電圧を印加すると固有のひずみが生じる。このひずみ変化に共振するような回路を組めば、水晶の結晶構造に固有の振動周期の電気信号が得られる。水晶の固有振動数は安定性が高いので正確な基本クロックが得られる。この基本クロックを分周あるいは逓倍して各種のハードウェアデバイスのクロックを生成するのが組込みプロセッサの一般的なアーキテクチャである。
ただし、部品コストが高いので精度を求めない組込み装置の基本クロックには水晶発振子のかわりにセラミック振動子などが用いられる。
【スコープ】《ツール》 → 変数スコープ
OSの下で実行動作させるタスクの実行順番を計画するリアルタイムOSの核となる機能のこと。スケジューラは、OSの下で複数のタスクが実行順番を待っている場合、次にどのタスクを実行させるかを各種の手法により決定する。タスクに実行の優先順位を属性として与え、より高い優先度を持っているタスクを優先度の低いタスクに先立って実行させるのが優先度スケジューリングである。また、同じ優先度のタスクが複数ある場合には、規定時間で実行権を移してゆくというラウンドロビン・スケジューリングなどいくつもの方式が研究されている。
スケジューラがタスク実行の計画を実行すること。
スケジューリング自体もソフトウェアの実行であるから、資源の少ない組込み用OSでは効率よくかつ不確定性の生じないスケジューリングが求められることが多い。一般に、OS以外の汎用ソフトウェアでは、何らかのスケジュールアルゴリズムを組む場合には、計画対象(OSの場合はタスク)の絶対数に依存しない方式が用いられる。これによってソフトウェアの柔軟性を上げ、問題を物理的なリソースで容易に解決することができる。組込みソフト開発では、物理的なリソースは動かせないので、ソフトウェアの柔軟性を制限した実装を行う。スケジューリングのアルゴリズムでは、汎用性を増すにはリスト処理を使うが組込みOSでは固定長テーブル処理とする場合がある。
1. OS上でタスクの実行をおこなうための計画情報のこと。なんらかのイベントが起きたときにイベント発生時点でスケジューラが複雑なアルゴリズムを実行して起動するタスクを決定するのではタスク実行に遅延が生じてしまう場合がある。このような場合は、あらかじめOS内部でスケジュールを作成し、イベントに即答できるような仕組みを持つ。
2. 仕様を満たすようなアプリケーションのタスク実行計画のこと。並列実行が必要なアプリケーションは、複数のタスクに実行優先順位やセマフォ、イベン トフラグなどを使って所望の実行計画(スケジュール)を満たす動作をするようにリアルタイム設計を行う。この基本計画の情報は、アプリ実行スケジュールと
してシーケンス図やタイミング図などで設計表現して決定する。
【スタック(Stack)】《SW全般》
各関数の引数や関数内で一時的に使用する局所的な変数を確保する領域をスタック(stack)という。スタックはオートマチック(自動)メモリとも呼ばれる。
一時的に使用される領域という面ではヒープもスタックと同様である。しかし、ヒープは確保や解放がプログラム側の要求により任意の順番になるのに対して、スタックは関数の入り口と出口で、順序良く確保や解放されるという面が異なる(スタックでの領域の使われ方が、LIFO(last
in first out)即ちデータ構造でいうスタックと同様な使われ方をするので、同名のスタックと呼ばれる)。
ヒープのほうが確保・解放に自由度が大きいため、一般的にスタックよりも確保や解放に多くの処理を要する。従って、スタックの確保解放はヒープに比べて高速であり、一つの関数やメソッド内のみで使用するような寿命の短い(また、比較的小さな)構造体やオブジェクトは、スタックに確保したほうが無難である。
ただし、スタックは一般にヒープよりも小さい領域だということを忘れてはいけない。大きな領域をスタック上に確保したまま関数をネストすると、スタック領域以外の領域を破壊する危険(スタックオーバフロー)がありうる。組込み系のソフトウェアの開発環境では一般にスタックサイズが十分に大きくないため、関数のネスト、各関数内の自動変数の変数長や各関数の引数、例外処理等も考慮しスタックオーバフローにならないような最大スタックサイズの設計が必要である。この際に、再帰呼び出しで再帰する最大回数が不定のような関数がある場合、最大スタックサイズも設計不能となるので、再帰しないコーディングに修正すべきである。特にマルチスレッドプログラムの場合は、スレッド毎に割り当てられるスタックは小さく、スタックの長さを考慮した各関数の設計、および設計に従った長さのスタックの確保が必要である。
参照:スタックポインタ、ヒープとガーベジ
【スタックポインタ(Stack Pointer)】《SW全般》
各関数の引数や関数内で一時的に使用する局所的な変数を確保する領域をスタックと呼ぶ。スタックはLIFO(last in first out)方式で実現されるため、スタック上で次に使用可能な領域がどこかを知る必要がある。次に使用可能な領域を指し示すポインタがスタックポインタである。スタックの操作は、このスタックポインタの上下とデータの書き込みで領域を伸縮することで実現する。
参照:ヒープ
【スタートアップルーチン(Startup Routine)】《SW全般》
スタートアップルーチンとは、主処理(Cのホスト環境であればmain関数)より前に実行する処理のことです。プログラムの動作に必要な資源を整える処理、たとえばスタック領域及びヒープ領域の確保、システムレジスタの初期化、各種ハードウェアの初期化(場合によっては自己診断の実施と結果の判定)、主関数の呼び出しと終了処理等を行ないます。スタートアップルーチンの処理内容や実行タイミングはプログラムを実行させる環境に強く依存します。
プログラムを実行するために、未だ実装されていない関数を、例えば何も演算をせずいつも決まった値を返すことで仮に実装して所望の関数を実行することがある。この関数をスタブとかスタブ関数と呼ぶ。スタブは、特にプログラムの単体テストや結合テストの時に作成・使用することが多く、スタブを作成する目的はその関数がまだ未実装であったり、テスト目的に沿った値が戻ってきて欲しい場合などである。
参照:ドライバ(2)
ソフトウェア開発プロセスモデルの一つであり、プロトタイピング手法とも呼ばれる(厳密にはスパイラルの初期をプロトタイプと呼ぶ)。ソフトウェアの開発は、試作と取り壊しが建築物などと違って容易である。この特徴を生かして、開発初期には小さな仕様で小規模な実行ソフトまでを開発、実行テストをおこない、次に機能やデータが最終目的により近い規模の仕様で設計開発を行う。こうして工程と開発規模を順次拡大し螺旋状にシステムゴールに近づけるような開発プロセスを指す。
開発期間中に何度も仕様策定や実装に立ち戻るので、人的分業がなされている開発組織や業種では適用が難しい場合もある。組込み業界においてはハードウェアの試作、改良、量産試作、量産といったハード開発が実質的なスパイラル開発を行っていることから、ソフトウェアもごく自然にスパイラル開発になっている場合もある。ただし、開発工程間の情報の引渡しに関してはハードウェア開発に比べ適切なモデルやドキュメントの利用が遅れている。
参照:ウォータフォール、プロトタイピング
【スパゲッティプログラム(Spaghetti Program)】《SW全般》
プログラムの論理構造が論理的に整備されていなくて複雑で、少しプログラムを見ただけでは論理構造が把握できないプログラムを指す。元々は、GOTO文(「GOTO文論争」を参照)が多くて、プログラムの論理構造がわからない様を、絡まったスパゲッティに喩えたものである。下手なプログラムの代名詞にも使用する。
バスマスタが、アクティブにしたデバイスに『どのように動作して欲しいのか』を指示するための信号線。代表例としてはリード/ライト信号線がわかりやすい。バスマスタが、リード/ライト信号線を「ライト」にすると、それにつながっているアクティブデバイスは、データバスから信号を入力する。バスマスタが、リード/ライト信号線を「リード」にすると、それにつながっているアクティブデバイスは、データバスに信号を出力する。
OOにおける生成と消滅は、クラスのインスタンスの生成とその消滅を意味する。動的なメモリを前提にしたOOの場合には、必要になった時点であるクラスのインスタンスを生成して動作をスタートさせる。
また、不用となったインスタンスや生成者不明のインスタンスを消滅させる必要もある。このような生成消滅に関わる事象は、C言語による組込みソフトウェア開発では少ない。ただし、関数にローカルな変数や構造体は、関数が呼び出された時点でスタック上に生成されるものであるから、ここで言う生成消滅に近い動作概念と言える。
電荷が蓄積しているだけで流れていない状態のこと。冬の乾燥した衣服や自動車の車体には静電気が蓄積されやすい。
静電気は電気の容量としてはごくわずかであるが、その電位が高い(1000〜10000Volt)。よって、衣類のわずかの帯電であっても導体を経て半導体へ流れ込むとCMOS型の半導体のような電位差に弱いデバイスは破壊されてしまう。破壊されずとも突然、誤作動を引き起こして危険である。
日常の静電気発生は、天候や生活環境に強く依存しているのでハードウェア設計者が対策の必要性に気づいていない場合がかなりある。そのような機器では連続運転試験を行うと間欠障害となる場合があるので、組込みソフトウェア技術者はそのような問題とソフトウェア問題を見分けるハードウェア知識を持つことが必要である。
参照:ノイズ、外来ノイズ
【正論理】《HW》 → ロジック
【セキュリティ】《SW全般》
セキュリティを考えるときには、(1)システムのなかで守るべき対象を明確にし(2)守るべきものの価値/重みを評価し
(3)守るべきものへの脅威の内容を明確にし(4)(1)から(3)までを「セキュリティ・ポリシー」として明文化し(5)設計・実装に対策を盛り込み(6)実装されたセキュリティ性能を検証する を要求分析・設計・実装・テストの各段階で考慮しなければなりません。必要によっては「セキュリティ侵害にあった際の復旧容易性」も設計に加えることもあります。
(1)は側面としていくつかに分類できますが「システム(稼動性の保証など)」「データ(機器内のデータ・プログラム)」「プライバシー」が代表的な切り口です。
最近の組み込み機器はネットワークに接続されることも多くなってきていますが、ネットワーク接続機器においては外部ネットワークからのクラッキング防御、ウィルスやワームへの防御、予期しない内部データ流出の防止、踏み台攻撃の「踏み台」にならないようにする、というポイントも重要です。
また、内部データや外部との通信データを積極的に保護する手段として暗号技術を利用することもあり得ます。この場合は保護すべきデータの重要性や利用する機器のCPU性能、暗号技術のライセンスコストといった様々な観点からどの暗号技術を採用するか、を検討する必要があります。
セキュリティはこのほかに、プログラム内でのバッファ長管理のミスによる「バッファ・オーバーフロー」といった実装ミスによっても侵害され得ます。一般論として、商品として便利さを追求することは外部(ユーザーを含む)に公開するサービスを増やすことにつながりますが、それは逆にセキュリティ上の弱み(セキュリティホール)の可能性を多く作ることと等価です。製品にセキュリティホールがある状態で出荷された場合、さらにそれがもとでユーザーに不利益が発生した場合、企業の負う改修コストと不名誉な社会的コストは通常のバグの比ではありません。
組み込み機器のセキュリティ性能は、どんどん重要度を増しているといえるでしょう。
プログラムのソースファイルからコンパイラを使用してオブジェクトモジュールに変換したときにプログラムの命令に相当するコードや変数の初期値等プログラムに必要なデータが生成される。これらのコードやデータは性質の同じものに分類して管理すると便利なので、通常いくつかの領域に分類する。この分類した領域をセクションと呼ぶ。代表的なセクションには、プログラムコードを表すセクション、プログラムを実行しても値に変化のない定数データのセクション、初期値を持つ大域変数のセクションや初期値を持たない大域変数のセクションがある。
また、これらをメモリ中にどう配置するかということも重要になる。例えば、定数データのセクションはROM上に配置できるが、他の大域変数のセクションはROMには配置できずRAMに配置しなければいけない。このように、セクションを適切なアドレス空間に配置することをセクション配置と呼ぶ。
【セクション配置(Section Allocation)】《SW全般》 → セクション
【設計のルール】《SW設計》
執筆募集中!
【接地】《HW》 → グランド
OSの下で動作するアプリケーションソフトが排他制御やリソースの獲得をする際に利用するOS提供の信号機能のこと。元来は、英国の鉄道において単線区間を通過する権利をしめす腕木と輪管のことであった。単線区間を通過するには、腕木にある輪管を獲得した列車のみが入れることと約束して輪翰のない列車は、区間の手前で待機するという仕組みで正面衝突を防止した。
同様にOS下のアプリケーションソフトでもセマフォ変数が0になった場合にのみタスク実行を許可するとか、特定デバイスを利用できるという約束で資源の獲得を調整して同時アクセスによる不具合の発生を抑止することができる。
光の量、色、重さ、速度、雨量など現象に対応した電子信号を出力する機能部品のこと。重さや速度など基本的な現象の検出を行うセンサに加えて、最近は人の感情を検出するようなAI(人工知能)センサ、交差点の動きから歩行者の人数を推定するインテリジェントセンサ、出張先から自宅の室温を調べることのできるスマートセンサなど多くのセンサが考案、提案されている。
センサ利用の基本は、センサが出す電気信号を増幅してデジタル信号に変換し、コンピュータに取り込む。その方法には、ADC(アナログデジタルコンバータ)にアナログ信号をコンピュータに入力してスケーリングされたデジタルの値を得る方法、センサの出力に比例したデジタルパルス信号をコンピュータに入力して周波数からデジタル値を得る方法などがある。
いずれにしても、ソフトウェアはセンサの出力と現実の物理量の関係を正しく換算しなければ外部の物理量を正しく把握できない。この部分の処理は、時間とも関係するので重要である。
参照:アナログセンサ、デジタルセンサ
【センス/センシング(Sense/Sensing)】《SW全般》
デバイスの外部からデータを取り込み、そのデータから外部の状態を判断することをセンスあるいはセンシングと呼ぶ。マイコンのプログラムからは、ADコンバータやポートを介して接続されている各種センサからデータを読み出し、以前に読み込んだ値との変化から外部状態を判定することが多い。
【速度チューニング】《SW全般》
組み込み用アプリケーションでは1タスクの処理はある一定時間(クロック数)内に終了しなければならないことが通例です。
あるタスクが求められる時間内に処理を終了できない場合に、さまざまな手段をもちいて処理スピードを上げることを速度チューニングと呼びます。
組み込み用のコンパイラは、最適化機能の指定(オプション指定)によって、出力コードが異なっています。速度チューニングのための1つの手段は、コンパイラの速度最適化機能を行うことです。
また、コンパイラに、ループ処理の展開、関数のインライン化機能がある場合は、これらを利用したコード出力を指定することにより、さらに速度向上が可能な場合があります。ただし、これらの最適化処理は、ROMコードを増加させる場合があるため、利用時に注意が必要です。
プログラミング(コーディング)方法とコンパイラの出力コードには、相関関係があります。RISCマイコンでは、メモリの読み書き回数を少なくするため、レジスタを多用するように、外部/static変数の参照/設定を多くしないなど、コーディングを工夫することによって、速度向上を行うことができます。
実行履歴に基づくプロファイルツールが利用できる場合は、実行時間の長い関数、呼出回数の多い関数などの情報を見ることができ、処理の負荷の高い関数のコーディング、アルゴリズムの見直しにより速度向上を行うこともできます。
【ソフトウェア動作周波数(Software Frequency)】《プロセッサ》
ソフトウェアの機械語としての動作周波数は、それが実行されるMPUの基本クロックによって決まる。この周波数は、組込みのプロセッサでは、CISCの場合、基本クロックの4から8分の1程度である。つまり、機械語の1インストラクションの実行完了には、4から8クロックの同期ロジック実行が必要ということになる。C言語で書かれたプログラムは、Cコンパイラによって翻訳され機械語として実行されるが、典型的にはCの単純な代入文は機械語3インストラクション程度に翻訳されている。よって典型的なCプログラムの動作周波数は、基本クロック10から20分の1となる。
例えば、基本クロックが100MHzの場合は、10MHzがソフトウェアの動作周波数である。計測制御システムなどを構築する場合には、このソフトウェア周波数に対して十分に低い周波数領域が計測対象であれば、どのようなプログラミングをしてもかまわない。しかし、計測対象周波数とソフトウェア動作周波数が近い場合には、実行時間見積り、ハードウェアデバイス利用、ハードウェア割込み方式などを正確に使う技術が必要になる。