組み込みからクラウドに至るまで、今日様々なシステムがLinux基盤上に構築されています。Linuxが選ばれる一因として、標準化されたインタフェース「ANSI/POSIX準拠インターフェース(Portable Operating System Interface:POSIXインタフェース)」を提供しているという点があげられます。
POSIXインタフェースは「アプリケーションからどのような方法でOS、ライブラリ、ユーティリティ等を制御できるか」というインタフェース設計のルールを定義するIEEEの規格です。POSIXインタフェースを使って実装されたアプリケーションは、POSIXインタフェースを提供する他のOS上へと簡単に移植することができ、実行可能です。Linuxには無数のディストリビューション(OSのバリエーション)がありますが、いずれを選んだとしてもLinux向けに開発されたアプリケーションの開発資産を再利用できるため、開発プロセスを手早く推進させることができます。これらの優れた互換性により、多くのユーザーがLinux基盤を選択しています。
NuttXの提供するPOSIXインタフェースを活用しよう
さて、SPRESENSEの開発にもPOSIXインタフェースを利用できることをご存知でしょうか。開発ツールキット「SPRESENSE SDK」に同梱されたリアルタイムOS「NuttX」は、NOT-Linuxでありながら「POSIXインタフェース」を提供しています。そのため、これまで蓄積され続けてきた膨大なLinuxの開発資産をSPRESENSE上へ簡単に移植可能です(図1)。今回の初心者講座では、まず「POSIXインタフェースの魅力」について触れ、次に移植性の鍵を握る「POSIXインタフェースの概要」を紹介します。最後に「ソフトウェアを移植するデモ」を動画にてお見せします。是非、システム開発の高効率化にお役立てください。
目次
POSIXインタフェースの魅力
Portable Operating System Interface (POSIX)は、OSとOS上のアプリケーションやライブラリ間のインタフェースを定義し、OSが異なる場合であってもソフトウェアの移植性を維持・担保するための規格です。
POSIXインタフェースは大別して3種類の項目を定義します(図2)。一つ目は、アプリケーション(ユーザーのプログラム)からOSやライブラリへ処理を依頼するための「API(Application Program Interface)の定義」です。二つ目は、OSや実行環境に同梱されている各種「ユーティリティ(rm、mv、ls、echoなど)の定義」です。三つ目は、「ファイルツリー(ファイルの見え方、ファイルシステム上でのデバイスやシステムの管理方法:/dev、/procなど)の定義」です。
POSIXインタフェースがもたらすメリットと、その魅力を次に紹介します。
サーバーからSPRESENSEへソフトウェアを移植できるメリット
AI×IoTの発展に伴い、サービス全体に求められる技術要求は益々高まっています。サービスの高度化、高機能化に対して、これまでネットワーク帯域(処理できるトラフィック)の増強や、サーバー(クラウド)の強化も行われてきましたが、エッジが収集する情報が急増したためリソースは限界を迎えようとしています。これらの課題を解決するために、サーバー上で実行されている機能(アプリケーション)をエッジ端末で個別に処理する、分散処理アーキテクチャの採用が進んでいます(図3)。
SPRESENSEはPOSIXインタフェースを備えているため、Linuxサーバー上に実装された様々なアプリケーションを、シームレスにエッジへ移植することができます。POSIXインタフェースはファイルシステムの構造も定義しているため「どんなデバイスがつながっているか」「どの記録媒体のファイルを操作すべきか」といった、API以外の機能もLinuxと同じ作法で制御可能です。
なお、SPRESENSEは、さらに移植性を高める取り組みとしてPOSIX以外のインタフェースも同梱。画像処理に頻出するlibjpegや、深層学習を実行できるDNNRTなどを提供します。これにより、POSIX以外の機能も再実装することなく、すぐに実行できるため、他のPOSIX準拠のエッジに比べ、より優れた移植性を達成します。
組み込みLinuxからSPRESENSEへソフトウェアを移植できるメリット
SPRESENSEの提供するPOSIXインタフェースは、エッジの低消費電力化にも貢献します。IoTではエッジを「電力が安定しない環境」や「バッテリーのみで駆動しなければならない環境」へ設置することが多く、超低消費電力であることが求められています。また、超低消費電力による低発熱は、長期運用時の劣化軽減にも効果があります。
しかし、Linuxを基盤とするエッジは、多くの場合Arm Cortex-AをはじめとするリッチなCPUコア/SoCのみをサポートするため、消費電力の削減が非常に困難です。そこで、SPRESENSEのPOSIXインタフェースを活用することにより、組み込みLinuxのアプリケーションを超低消費電力のSPRESENSE上へ移植。ハードウェアをまるごと交換しつつ、これまでと同等の機能を提供できるため、設置制限の緩和、電力サージへの対応(瞬停)、長期に渡る安定性の担保などを実現できるのです(図4)。
POSIXインタフェース(ANSI/POSIX準拠インターフェース)の概要
先に挙げたように、POSIXインタフェースは、OSとアプリケーション間のインタフェースを定義する標準規格です。規格の立ち上げ当初は、UNIXのバリエーションの差異を吸収するために考案された規格でしたが、現在はLinuxとNuttXのように異なるOS間における高い移植性を達成するための規格として活躍しています。
ここではSPRESENSEアプリケーションを開発する際に、図2の要素が移植性向上に対して、どのように効果を発揮するかを解説します。
POSIXによるAPIの定義
POSIXによるAPIの定義により、SPRESENSEはfopen、gets、freadなどLinuxで馴染みのあるAPIを使うことができます。すべてのAPIは「spresense/nuttx/lib」に実装されています。POSIXインタフェースに従うため、引数の順序もLinuxと一致しており、移植時のミスを大きく軽減できます(図5:fopenの例)。またPOSIXの大きな魅力である、複数の処理を並行実行できるフレームワーク「PThreads(POSIXスレッド)」もサポートしています。本記事の後半ではPThreadsを使ったプログラムの移植を動画にて紹介します。
Linux : Man page of fopen
NuttXの提供するfopen
POSIXによるユーティリティの定義
POSIXインタフェースは、ls(指定した階層のファイルを列挙する)をはじめとする各種ユーティリティも定義しています。SPRESENSEはNuttShellを通して、図6に挙げるユーティリティを提供します。また、SPRESENSEのアプリケーションをプログラムする際は、これらのユーティリティをビルドイン関数としてユーザープログラムからの直接実行できます。これにより、「過去に実装された機能を再実装(車輪の再発明)する」という無駄なコストを削減できます。
POSIXによるファイルツリーの定義
POSIXの定義にはファイルツリー(ディレクトリの構造)も含まれています。ファイルやディレクトリは木構造として管理され、根本の部分を「/(ルートディレクトリ)」と呼びます。SPRESENSEのNuttXも、すべてのデータを「/」以下に格納し、ディレクトリを進むごとに「/test」「/test/hello」のように階層を掘り下げていきます(図7)。
なお、NuttXに認識されているデバイスの情報は「/dev」以下、実行中のプロセス(タスク)に関する情報は「/proc」以下のファイルとして、Linuxと同じように参照できます。図8上は、SPRESENSE上の「/proc」を開き、7個のプロセスがあることを確認し、0番目のプロセスの状態(/proc/*/status)をcatコマンドにより表示した例です。Linux(図8下)と同じように操作可能です。
POSIXインタフェースを使ってLinux上のソフトウェアをSPRESENSEへ移植する
それでは、実際にLinux上で動作するプログラムを、SPRESENSE上へ移植してみましょう。
POSIXスレッド(PThreads)プログラムを移植する
今回はPOSIXインタフェースのうち、マルチタスク設計に欠かせない「PThreads(POSIXスレッド)」を使ったプログラムを移植します。移植作業のサンプルとして、PThreadsに関する名書「PThreads Programming: A POSIX Standard for Better Multiprocessing (A Nutshell Handbook)」にて紹介されているCondition Variable(条件変数)のソースコードを使います。 POSIX Threads ProgrammingのCondition Variablesより1クリックでソースコードを入手できますので、是非みなさまもお試しください。
POSIXスレッド(PThreads)プログラムを移植するデモ
本デモでは、まずPThreadsのサンプルアプリケーションを入手し、Raspberry Pi 4上でビルド・実行します。次に、全く同じプログラムをSPRESENSEの開発環境にコピー&ペーストし、3行書き加えるだけで、PThreadsのプログラムが実行できることをお見せします。Linuxで培ったスレッドプログラミングをはじめとする様々な開発ノウハウが、そのままSPRESENSEの開発で活きることを確信いただけるでしょう。
スレッドとは
スレッドは、プロセス内(実行中のアプリケーション)のプログラムの実行状態を管理するものです。最も単純なプロセスとスレッドの関係は、ある時点でソースコードの1箇所を、CPUがどのような情報を持って処理しているかを管理することです。そのため、1プロセス1スレッドとなります(図9 – ①)。
PThreadsを使って2個目以降のスレッドを生成することにより、ソースコード内の複数箇所の実行状態を管理できます。例えば、実行中に割り込みやリソースの変化を待っている地点と、待ち時間の間に先行実行できる処理を進めている地点、2個の情報をPThreadsで管理できます(図9 – ②)。さらに多くのスレッドを生成することも可能です。
なお、各スレッドをどのCPUコアで実行するかはOSに依存して決定されます。4個のCPUコアを搭載しているプラットフォーム上に、100個のスレッドを生成することも可能です。Intel CPUを代表とするSMPアーキテクチャ(Symmetric Multiprocessing)の場合、スレッドは各CPUコアを時分割したリソースの上で実行されます。
ASMP(ASymmetric Multiprocessing)アーキテクチャを採用している「SPRESENSE」と、リアルタイムOS「NuttX」の組み合わせでは、Pthreadにより生成されたスレッドはメインコア上のみで実行され、サブコアが勝手に消費されることはありません(図10)。スレッドをOSに管理させずに開発者の思い通りに実行できるため、CPUコアの使用率や実行順序を完全に制御可能です。
まとめ
今回は、SPRESENSE SDKに統合された「NuttX」のPOSIXインタフェースの魅力と、移植性について紹介しました。次回はSPRESENSE SDKの提供する「豊富なデバイスドライバ」の魅力に迫ります。
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機能を活用した製品開発に必要となる技術を紹介いたします。