リアルタイム処理の基礎知識(組み込みソフトウエア開発)
2022年08月29日
- ICTシステム開発
- 組み込みソフトウエア開発
自動車や鉄道に代表される輸送機器、ロボットや監視カメラなどの産業機器、医療機器や身近な家電など、これら幅広い分野の機器に組み込まれているソフトウエアの多くは、さまざまな場面で「限られた時間の中で完了せよ」という要求に応えています。このような処理をリアルタイム処理、または実時間処理、即時処理と呼びます。そして、その処理を実現する仕組みがリアルタイムシステムです。
ここではリアルタイム処理の基礎を解説します。
ここではリアルタイム処理の基礎を解説します。
リアルタイムシステムとは
リアルタイムシステムの仕組みを説明します。
システムを大別すると、ハードリアルタイムシステムとソフトリアルタイムシステムの2つがあります。
ハードリアルタイムシステム
ハードリアルタイムシステムとは、定められた期限内に、所定の処理を完了させる仕組みです。
最もわかりやすい例が自動車のエアバッグです。
自動車が衝突してから、乗員がダッシュボードに衝突するまでの間にエアバッグが動作を完了しなければ、その価値はゼロになってしまいます。
最もわかりやすい例が自動車のエアバッグです。
自動車が衝突してから、乗員がダッシュボードに衝突するまでの間にエアバッグが動作を完了しなければ、その価値はゼロになってしまいます。
ソフトリアルタイムシステム
ソフトリアルタイムシステムとは、期限の制約が緩く、処理が期限内に完了できなくてもある程度許容できる、あるいはやり直しができる仕組みです。
ソフトリアルタイムシステムの例はオンラインゲームです。
ハンドルを切ったり銃を撃ったりした時の反応ができるだけ早い方が快適にプレイできます。ある程度遅くても許容できますが、限度はあります。
ソフトリアルタイムシステムの例はオンラインゲームです。
ハンドルを切ったり銃を撃ったりした時の反応ができるだけ早い方が快適にプレイできます。ある程度遅くても許容できますが、限度はあります。
リアルタイムシステムを実現する方法(ベアメタル方式/RTOS方式)
組み込みソフトウエア開発の世界で、リアルタイムシステムを実現する方法には、ベアメタル方式とRTOS方式があります。
ベアメタル方式
ベアメタル(Bare Metal)方式とは、OS(オペレーティングシステム)を利用せずに、マイコンシステムを組み上げる方式です。
より高速で、省メモリ、省電力な方式ですが、小規模でも作るのが大変かつ複雑で、通常その中身は設計者にしかわかりません。
より高速で、省メモリ、省電力な方式ですが、小規模でも作るのが大変かつ複雑で、通常その中身は設計者にしかわかりません。
RTOS方式
RTOS(Real Time Operating System:一般的に「リアルタイムオーエス」と呼びます)方式は、RTOSを利用したマイコンシステムでアプリケーションが動作する方式です。
RTOSを介することでハードウエアがブラックボックス化されるので、ソフトウエア設計者には、ベアメタル方式ほどのマイコンやCPUの知識は必要ありません。詳細は次項以降で説明します。
また、ライブラリなどを活用することで、複数の設計者が関わる大規模なチームであっても、容易に、かつ可視性良くプログラムを開発できます。ただ、リアルタイム性を重視するため、汎用OS(WindowsやLinux)とはアプリケーションの作り方が異なるので注意が必要です。
RTOSを介することでハードウエアがブラックボックス化されるので、ソフトウエア設計者には、ベアメタル方式ほどのマイコンやCPUの知識は必要ありません。詳細は次項以降で説明します。
また、ライブラリなどを活用することで、複数の設計者が関わる大規模なチームであっても、容易に、かつ可視性良くプログラムを開発できます。ただ、リアルタイム性を重視するため、汎用OS(WindowsやLinux)とはアプリケーションの作り方が異なるので注意が必要です。
RTOSとは
RTOSとは、「期限内に所定の処理を終える」という汎用コンピューター向けのWindowsやLinuxなどのOSでは実現が難しい課題に対して、処理の単位、順序や優先度などを工夫することでリアルタイム性を重視するよう専用に設計されたOSです。
FreeRTOSやAzureRTOSが代表的で、それぞれAmazon Web Services(AWS)クラウドやMicrosoft Azureクラウドとの接続を前提としたライブラリが用意されています。他にもVxWorksやμITRONなどが有名です。
FreeRTOSやAzureRTOSが代表的で、それぞれAmazon Web Services(AWS)クラウドやMicrosoft Azureクラウドとの接続を前提としたライブラリが用意されています。他にもVxWorksやμITRONなどが有名です。
RTOSの構造
RTOSは、カーネル部とドライバー部で構成されます。
カーネルは次の機能を持っています。
- カーネル
どのタスクを処理するか制御する機能 - ドライバー
ハードウエアの各種入出力を制御する機能
(例えばネットワークプロトコルなど)
カーネルは次の機能を持っています。
- スケジューリング
- 割り込み制御
- タスク間通信 (排他制御、同期制御、通信制御)
RTOSの特徴
- マルチタスク処理が容易。
タスクとは、「RTOSが処理するプログラムの最小単位」です。
複数(マルチ)のタスクを並列で処理する(ように見える)サービスをRTOSが提供します。 - 優先度順スケジューリング方式(詳しくはこちら)。
- 複数人での開発に適応。
タスクごとに機能が独立しているので、複数人での開発が容易です。 - 汎用OSと比較するとプログラムサイズは小さく、メモリ使用量は少ない(数kB~数MB程度)。
RTOSのメリット、デメリット
RTOSのメリット
- 高い移植性でタスクやアプリケーションを開発できる。
- 大人数による大規模な開発ができる。
- RTOSが提供するライブラリにより、ブラックボックス化されたマイコンなどのタスク開発が容易。
RTOSのデメリット
- CPUリソース、メモリリソースの使用量がタスク数で増加する。
- タスクや優先順位など、ベアメタル方式とは異なる概念が必要。
- RTOSを使うためのスキルが必要で、スキル習得に時間とコストが必要。
- RTOSそのもののバグによるトラブルが発生する場合がある。
RTOSの特徴① スケジューリング
RTOSのカーネルは、規則に従って次に処理するタスクを選択します。スケジューリングとは、これから処理するタスクの待ち行列を作ることをいいます。スケジューリングには、ラウンドロビンスケジューリングと優先度順スケジューリングの2つの方式があります。
ラウンドロビンスケジューリング方式
ラウンドロビンスケジューリング方式とは、一つのタスクを連続して処理できる単位時間を決めておき、その単位時間が経過するごとに処理するタスクを切り替える方式です。
汎用OSを使う環境では、以下のような理由でこの方式が採用されています。
汎用OSを使う環境では、以下のような理由でこの方式が採用されています。
- ユーザーが自由にアプリケーションを追加・実行できる。
- 最適な優先度設定が難しく、設定できたとしても正常に動作しなくなってしまう可能性がある。
優先度順(プリエンプティブ)スケジューリング方式
優先度順(プリエンプティブ)スケジューリング方式とは、タスクに優先度を与えて、より優先度の高いタスクを常に実行してリアルタイム性を確保する方式です。
RTOSを使う環境では、以下のような理由でこの方式が採用されています。
RTOSを使う環境では、以下のような理由でこの方式が採用されています。
- ユーザーが後からアプリケーションを加えない。
- 開発元で十分なテストが行えるため、システムの異常な動作などは起こらない。
- 他のタスクを停止してでも優先度の高いタスクを先に実行しなくてはならない場合がある。
RTOSの特徴② 割り込み処理
割り込み処理とは、現在のタスクに優先度の高いタスクを割り込ませて、優先度の高いタスクを先に終了させるための処理です。CPUへの割り込み要求(優先度の高いタスクの処理要求)をきっかけに、割り込み処理が行われます。割り込み要求には、ハードウエア割り込みとソフトウエア割り込みがあります。
ハードウエア(外部)割り込み
ボタンやタイマーなどのCPU外部からの割り込み要求(IRQ:Interrupt ReQuest)をCPUに通知すると、CPUはメモリ上の割り込みベクタテーブル(割り込みソースごとに実行したい割り込みハンドラのアドレスと優先度などをまとめた配列)を参照して、対象となる割り込みハンドラへ処理を渡します。
割り込み処理の流れ
RTOSの特徴③ タスク間通信
RTOSは、複数のタスクを正しく実行するために、タスク間通信機能を提供します。
タスク間通信には、次のような機構や手段があります。
さらに高機能な「拡張同期・通信機能」として、ミューテックス、メッセージバッファ、ランデブなども提供されています。
ここでは、セマフォを使った「排他制御」や「同期制御」について解説します。
タスク間通信には、次のような機構や手段があります。
- セマフォ
タスク間で共有するリソースの「排他制御」や「同期制御」などに利用します。 - イベントフラグ
あるイベントの発生を複数のタスクに通知する仕組みを「同期制御」などに利用します。 - データキュー/メールボックス
タスク間で、データ(やメッセージ)を、メモリ空間を経由して通信します。
さらに高機能な「拡張同期・通信機能」として、ミューテックス、メッセージバッファ、ランデブなども提供されています。
ここでは、セマフォを使った「排他制御」や「同期制御」について解説します。
セマフォとは
セマフォ(Semaphore ※)とは、共有リソースの状態を表示するカウンター機能付いた変数です。タスクはセマフォを制御して共有リソースを獲得/解放します。
※ Semaphore:信号機 踏切の遮断機に由来 遮断棒の状態で踏切への進入可否を表示することより。
※ Semaphore:信号機 踏切の遮断機に由来 遮断棒の状態で踏切への進入可否を表示することより。
セマフォによる排他制御
複数のタスクが同じメモリ領域に値を書き込もうとしてデータを破損する可能性がある時に(クリティカルセクションと呼ばれます)、複数タスクの同時アクセスを回避します。
- 共有リソースにアクセスしたいタスクは、その共有リソースのセマフォを獲得します。
セマフォの獲得を「P操作」といいます。 - P操作で、セマフォが1であれば1を減算してセマフォを獲得します(セマフォ=0)。
- 共有リソースの利用が終わったら、セマフォに1を加算してセマフォを解放します(セマフォ=1)。
セマフォの解放を「V操作」といいます。
つまり、セマフォの値が遮断棒の役割を果たしていて、「1」は進入可(共有リソースにアクセス可)、「0」は進入不可(他のタスクが共有リソースを利用中)を表しています。
※ RTOSの中には、P操作を「セマフォをTakeする」、V操作を「セマフォをGiveする」といった呼び方でサービスが用意されているものもあります。
本稿では割愛しますが、排他制御には「タスクの処理が膠着状態に陥ってしまう問題(デッドロック)」や「タスクの優先度が変わってしまう問題」が潜んでいますのでご注意ください(調べてみてください)。
セマフォによる同期制御
あるタスクは他のタスクが完了してから処理したい時に、複数のタスク間で待ち合わせを行います。
セマフォは、どのタスクからもアクセスできるので同期制御にも用いられます。例えば、あるタスクが共有リソースに書き込んだデータを、別のタスクが読み出す場合、書き込む側のタスクがP操作でセマフォを獲得して、書き込みが完了してV操作でセマフォを開放するまで読み出す側のタスクを待たせておくといった使い方ができます。
セマフォは、どのタスクからもアクセスできるので同期制御にも用いられます。例えば、あるタスクが共有リソースに書き込んだデータを、別のタスクが読み出す場合、書き込む側のタスクがP操作でセマフォを獲得して、書き込みが完了してV操作でセマフォを開放するまで読み出す側のタスクを待たせておくといった使い方ができます。
ここではリアルタイム処理の基礎の基礎をご紹介しました。
これからのリアルタイムシステムは、車載・産業・家電・宇宙など多くの分野で、ハードウエア・ソフトウエアともに、そのバリエーションを増やしながら、省エネルギーに貢献しつつ、日々進歩・進化していくでしょう。
読者の皆さまも、それぞれのニーズにあった「リアルタイムシステム」を研究してみてください。
これからのリアルタイムシステムは、車載・産業・家電・宇宙など多くの分野で、ハードウエア・ソフトウエアともに、そのバリエーションを増やしながら、省エネルギーに貢献しつつ、日々進歩・進化していくでしょう。
読者の皆さまも、それぞれのニーズにあった「リアルタイムシステム」を研究してみてください。