現在、私たちの身の回りにある多くのシステムは、複数の作業を同時に、もしくは短時間に並行して切り替えながら実行するマルチタスクシステムが採用されています。画像処理機能、通信制御機能、組み込みAIによるデータの分析機能など、多種多様な機能(タスク)が繋ぎ合わされることによりシステムとして優れたユーザーエクスペリエンスを達成しています。
今回の初心者講座では、複数のタスクを連携させるための「タスク設計」方法と、タスク間で情報を交換するための領域の扱いである「リソース管理」について解説します。ソニーのSPRESENSEを具体例にマルチタスクシステムを学びましょう。
タスク設計とリソース管理が必要な理由
現在、組み込みシステムへの要求は日々高度化しています。そのため製品開発では、単機能のシステム設計ではなく、多種多様な機能を統合した多機能のシステム設計が必要とされています。また、ユーザビリティの観点より高いレスポンス性も求められており、データを解析しながら、外部との通信やUI制御を同時に実行する並列処理も不可欠です。そのため、タスク設計や、マルチタスクとASMPを協調動作させるための設計は重要な課題です。
あわせて読みたい
加えて、リソース管理も重要な課題です。リソースとは、それぞれのタスクを実行時に占有し利用するハードウェア資源です。リソースには、メインメモリをはじめ、GPIO、I2C、SPI、タイマー、PWMコントローラ、カメラモジュールなど様々なものがあります。同時に何個のタスクを並列実行できるかという視点からCPUもリソースとして扱われることがあります。もちろんリソースが多ければ多いほど、高度なシステムを構築することができます。しかし、多くのハードウェアを搭載すると原価が高騰するため、製品開発では必要最低限のハードウェアのみを搭載し、これらをいかに有効活用するかという「タスク設計とリソース管理」の技術が求められます。
タスク設計のコツ
タスクの構成(SupervisorタスクとWorkerタスク)
ASMP上のマルチタスクシステムでは、メインコア上のタスクがシステム全体を管理し、サブコアのタスクはメインコアから指示されたリソースのみを使って動作します。SPRESENSEの場合、メインコア上で実行されるタスクを「Supervisorタスク」、サブコア上で実行されるタスクを「Workerタスク」と呼びます。図2はプログラムを実行中のSPRESENSEにデバッガを接続し(図3)、プログラムの先頭で全コアを停止した状態を示しています。6タスクのうち、Thread 1がSupervisorタスク、Thread 2〜6がWorkerタスクとなります。WorkerタスクはSupervisorタスクからの指示を受けるまでは休止し、依頼を受けてはじめて処理を開始。要求された機能を実行します。
タスクを定義する際の考え方
Workerタスクに割り当てる機能は、以下の指標に従って定義すると良いでしょう。
大量のリソースを扱う処理を複数コアで分担し合う
例えば、256KBの画像データを扱うアプリケーションを構築する場合、Supervisorタスク1個のみで処理すると256KB全てを直列に処理することとなります。一方で、Workerタスク4個に同じ機能を持たせ、それぞれに画像を4分割したデータを解析させることにより、約\(\tfrac{1}{4} \)の時間で処理することができるため、高いスループットと高い応答性を達成可能です(第6回で実際の実行方法を紹介します)。
リアルタイム性が求められる機能をコアに占有させる
例えば、ビデオカメラ・アプリケーションは「撮影した映像をディスプレイに表示する」「SDカードに漏れなくデータを記録する」「画像中の顔位置を検出しフォーカスを調整する」といった機能から構成されています。このうちSDカードへデータ書き込み処理は、決してデータを取りこぼしてはいけない、デッドラインが厳密に決まった(ハードリアルタイム)処理です。この要求を満たすためには、必ず処理が一定時間内に完了するよう、Supervisorコアにはカメラモジュールの制御処理とSDカードへの記録処理に専念させ、Workerコアには顔位置検出など比較的リアルタイム性の低い処理を任せる役割分担が適切です。このように機能の特性を考慮することも、タスク設計に必要な指標のひとつです。
リソースを共有するタスクを連携させるための機能
次に、SupervisorタスクとWorkerタスクが連携するためのハードウェアを紹介します。
SPRESENSEでタスクの連携に使うことのできるNuttXのインタフェース
ミューテックス(Mutex, Mutex-Lock, Binary-Semaphore)
SupervisorタスクとWorkerタスク、または、Workerタスク同士が、1つのリソースへ同時にアクセスするとデータの一貫性が崩れてしまいます。これを防ぐためSPRESENSEは同時に1個のタスクのみが占有できるハードウェアのフラグ「Mutex」を提供しています。各タスクがリソースを参照・変更する前に、事前に定めたMutexの確保にトライ(TryLock)することで、リソースへの同時アクセスを防ぐことができます。
メッセージキュー(Message Queue)
Message Queueは、SupervisorタスクからWorkerタスクへの通知や、WorkerタスクからSupervisorタスクへの返答に利用できる、短いデータを扱うためのFIFO(First-In-First-Out)バッファです。主に、Workerタスクの開始時に、SupervisorタスクからWorkerタスクへパラメータ(メモリのどこにあるデータを解析するか、何バイト解析が必要か、など)を指示するために利用します。なお、SPRESENSEではWorkerタスクから別のWorkerタスクへのMessage Queueを確立することはできません。
共有メモリ(Shared-Memory)
Shared-Memoryは、タスク間で大きなデータ(画像データや録音データなど)を共有できるハードウェアです。SPRESENSEのメインメモリ(1.5MBのSRAM)は128KBのメモリタイル12個から構成されており、複数のコアから同じメモリタイルを共有できる仕組みを備えています。これにより、データの詰まったメモリタイルをコアに割り当てるだけで、128KBのデータをタスク間で受け渡すことが出来ます(複数のタイルを同時に付け替えることにより128KB以上の転送も可能です)。
なお、SPRESENSEは、コアとメモリタイルをクロスバースイッチというハードウェアで結合しています。クロスバースイッチを採用することにより、交差している経路での通信に限定できるため、自在にメモリタイル付け替ながら、従来のSRAMと同等の高いアクセス性能を発揮することができます(メモリタイルへのアクセスが競合した場合のみ、ハードウェアの調停機能が動作し、若干のペナルティが発生します)。
まとめ
今回はタスク設計とリソース管理について解説しました。SPRESENSEはCortex-M4(FPU搭載)を6コア備え、1.5MBの大容量SRAMを搭載したパワフルなボードコンピュータです。すべてのコア、すべてのメモリタイル、様々なペリフェラルを効率的に活用することで、より高度なアプリケーションを実現することができます。是非、マルチタスクシステムの設計・構築に挑戦してみてください(本初心者講座では、第6回に実際の設計手順を紹介する予定です)。
次回はいよいよSPRESENSEの開発環境の構築手順と使い方について紹介します。Windows/macOS/Ubuntuのマルチプラットフォームに対応し、Visual Studio Codeの対応も計画されている開発環境です、ご期待ください(図9)。
SPRESENSE SDK + Visual Studio Codeに関する情報はこちら
SONY SPRESENSE
SPRESENSEは、Arm Cortex-M4コア(FPU機能搭載)を6コア搭載したシングルボードコンピュータです。マルチコアによる豊富な演算能力をはじめ、魅力的なペリフェラルを多数搭載しながら、電池のみでも駆動できる超低消費電力な製品です。本格的なエッジコンピューティングを是非ご体験ください。システムの試作はもちろん、PoC、製品化にもご活用いただけます。
開発者向けサイトを見る Switch-Scienceで購入する
APS学習ボード(SPRESENSE™ Extension Board用)
APS学習ボード(SPRESENSE™ Extension Board用)は、初心者講座の内容をはじめ、SPRESENSE SDKの提供するオーディオ入力機能やLCDドライバをはじめとする各種機能を、回路設計をすることなく簡単にお試しいただけるよう開発したAPSオリジナルの評価基板です。Web記事と併せてお楽しみください。
取扱説明書|APS学習ボード Switch-Scienceで購入する(ボード単体) Switch-Scienceで購入する(部品キット)
こちらも是非
“もっと見る” マルチコア|SPRESENSE編
SPRESENSE×Neural Network Console:第4回|推論モデルを最適化し、エッジAIによるオリジナルの音声識別システムを構築する
今回の初心者講座では、SPRESENSEの「ハイレゾオーディオ入力」と「DNNRT機能」により「Neural Network Console」で生成したディープニューラルネットワーク(DNN)の推論モデルを統合。エッジ単体で完結するオリジナルの音声識別システムを構築する技法を解説いたします。
SPRESENSE×Neural Network Console:第3回|オーディオ解析に必要な学習用データを採取し、PC上で学習・推論を実行する
今回の初心者講座では、SPRESENSEに搭載されたハイレゾオーディオ入力を活用し、環境音を録音し、ディープニューラルネットワークによる音声分類に不可欠な学習用データと検証用データを生成する方法について解説します。また、PC上で動作するNeural Network Consoleによって生成した推論モデルをエッジ・デバイスへ統合するために解決すべき課題を紹介します。
SPRESENSE×Neural Network Console:第2回|異常検知に活用できるニューラルネットワークで波形の扱い方を学ぶ
SPRESENSEのDNNRT機能が扱うことのできるデータは画像だけでなく、産業分野を中心に人気が高まっている「異常検知・故障予知」に活用できる加速度センサーや大気圧センサーなどから収集した波形データも解析することができます。さらにSPRESENSEに内蔵されたハイレゾオーディオ録音機能も周辺環境を可聴域の波形データとして記録することができる優れたセンサーとして利用可能です。そこで、今回の初心者講座では、まず簡単な波形データの解析方法を例に、DNNRT機能から波形データを扱うシステムの構築方法について解説。DNNRT機能を活用した製品開発に必要となる技術を紹介いたします。