本記事は全三回構成の第三回です。
Part1 概要(マネージャーとモジュール)
Part2 アプリケーションとメモリプロテクション
Part3 注意点と開発手法
前の記事をまだお読みでない方は第一回記事「PX5 MODULESについて解説してみた Part1」からお読みください。
モジュールの、I/Oを含めた実装の注意点
モジュールでは基本的なAPIは一通り使用できますので、アプリケーションに要求されるほとんどの機能をモジュールで動作させることが可能です。ただしメモリプロテクションもあるため、モジュールで割り込みを処理したり許可されていない領域のメモリを直接操作したり、などの処理は推奨されていません。
px5_module_manager_create()には共有メモリ(shared_memory)の指定も可能ですので、この領域をI/Oアドレスに割り当てることで周辺コントローラの操作は可能ですが、モジュールから共有メモリの設定変更等は許可されていません。また割り込みコントローラの設定や割り込みハンドラの登録等は周辺コントローラとは別のアドレス範囲になる場合も多く、共有メモリは一つしか設定できませんので、やはり問題があります。
つまりモジュールから直接的なI/Oの操作や割り込みを含んだ処理は難しく、またPX5 MODULESではそれらをサポートする機能も提供していないため、モジュールの機能としては何らかの対策を検討する必要があります。。
もしモジュールの機能としてI/Oを含めた処理が必要なのであれば、最初から割込みハンドラはマネージャー側に登録しておき、px5_module_application_request()を経由して各種I/Oを行った方が現実的です。またメモリプロテクション無効で動作させる方法もありますが、モジュールの動作開始前に割込みが発生する場合や動作停止後に割込みが発生する場合、その後の動作なども含め、検討するべき内容は多くあります。
このあたりは使用したい周辺コントローラやアプリケーションの設計方針によりますので、推奨はされないものの、検討は可能だと考えられます。
相対アドレッシングのモジュールについての注意点
PX5 MODULESでは、モジュールが任意のアドレスに配置される場合のアクセス設定、つまり相対アドレッシングで構成されたコード(Position-Independent Code:PIC / Position-Independent Data:PID)でも動作は可能です。(もちろん相対アドレッシングとして用意されていないモジュール、つまり固定アドレスとして用意されているモジュールを、任意のアドレスに配置することはできません)
ただし相対アドレッシングで構成されたモジュールでpx5_module_application_request()を使用する場合は注意が必要です。
マネージャー側へpx5_module_application_request()によってリクエストを送る場合、パラメーターとして数値を一緒に送ることができますが、送る数値は単純な数値として扱われるため、パラメーターに何らかのアドレスを送る場合、実アドレスに変更する必要があります。
あるいはコードだけ相対アドレッシング(PIC)でデータは固定アドレスとし、モジュールで使用するデータ領域も固定とすることで、データ領域のアドレスについてはこの問題を回避できるはずですが、すべてのアクセスについて保証できるわけではないことに留意してください。
実際の開発方法
PX5 MODULESを使用したアプリケーション開発は、マネージャー側の開発とモジュールの開発が別々になるため、少々手順が複雑です。
マネージャー側の開発は、従来からの組込みシステムの開発方法とあまり変わりません。ただしリクエストハンドラ等の、モジュールとの通信に関わる部分については注意が必要で、オーバーヘッドやアドレス変換等の問題には気を付ける必要があります。
モジュール側の開発も基本的には従来の開発方法とあまり変わりませんが、メモリプロテクション状態で動作させるのであれば、データアクセス方法やマネージャー側との関連性、他のモジュールとの協調動作等が必要なのであれば、その手段やアクセスタイミングなども考慮して設計したほうが良いでしょう。
デバッグについても考慮が必要です。モジュールを動的に入れ替える場合、一般的に使用されているデバッガでは、モジュールの実コードと元のソースコードをリンクしてデバッガ画面に表示することができません。したがって何らかのデバッグ上の工夫が必要になりますが、これはデバッガによって方法が異なるため、各デバッガの使用方法で工夫していただく必要があります。
当社側ではEWARMで確認していますが、モジュールをデバッグ開始前に静的にロードすることで、EWARMのデバッグ機能(実コードと元のソースコードをリンクして表示、break pointの設定、実行/強制停止など)を使用して確認することができます。
まとめ
PX5 MODULESを使用するメリットは、他の処理が動作している途中でもモジュール単位で動作開始/停止および入れ替えが可能、メモリプロテクションが使える、などがあります。特に動作中に処理が入れ替え可能という点においては、RTOSを使用したアプリケーション開発において、製品の使い方の幅が広がるのは間違いありません。ぜひPX5 MODULESを使用して、製品の可能性を広げてみてはいかがでしょうか?
