HIPCのタスク間通信ライブラリは、OS無しシステムでリアルタイムタスクとHIPC通信タスクが通信するケースを主眼に設計されている。 例えば、タイマ割り込みでリアルタイムタスクの処理を行い、main関数からHIPC通信用の関数を呼ぶような実装である。 このタスク間通信ライブラリは組み込みOS上でも利用可能であるはずだが、OSを使用する場合はOSが提供するタスク通信用APIの利用を推奨する。
Doxygen
キュー: <hipc/queue.h>
初期化
まず、「キューに出し入れするアイテムのサイズ」に「利用するスロットの数」をかけた大きさのバッファを用意する。 次に、このバッファのアドレス、アイテムサイズ、スロット数を引数にしてhipcQueueInit()
を呼び出す。
キューにアイテムをプッシュする手順
hipcQueueFull()
を呼ぶ。キューが一杯になっていなければ、この関数は空きスロットのアドレスを返す。
- 1で得られたアドレスへデータを書き込む。
hipcQueuePush()
を呼ぶ。
キューからアイテムをポップする手順
hipcQueueEmpty()
を呼ぶ。キューが空でなければ、この関数は先頭アイテムのスロットのアドレスを返す。
- 1で得られたアドレスからデータを読み込む。
hipcQueuePop()
を呼ぶ
注意事項
- OSがタスク間通信用キューを提供している場合は、その利用を推奨する。
- このキューはSingle producer single consumer queueである。ある1つのキューのプッシュ操作は1つのタスクからのみ行うこと。同様に、ポップ操作も1つのタスクからのみ行うこと。
- このキューの実装では、スロット数より1小さな数のアイテムが溜まると、キューは一杯となる。例えば、スロット数が8であれば、キューに溜められるアイテムの最大数は7である。
パラメータ用バンク: <hipc/pbank.h>
概要
- この機能の目的は、あるタスクが利用するパラメータを別のタスクが繰り返し更新することである。
- ここでは、パラメータを読んで利用するタスクをリーダータスク、新しいパラメータを書き込むタスクをライタータスクと呼ぶ。
- 内部にはパラメータ用にページが2枚有り、1ページのサイズはパラメータ1セット分である。
- リーダータスクがある時点で読んでいるページをRead-onlyページと呼び、名前の通りこのページは書き換えてはならない。
- ライタータスクが新しいパラメータを書き込むのがもう1つのページであるWritableページである。
- 内部の2ページのうち、どちらがRead-onlyページで、どちらがWritableページなのかは、スイッチ操作により動的に切り替わる。
- ライタータスクがスイッチリクエストを出し、リーダータスクがこれを受理すると、Read-onlyページとWritableページはスイッチされる。Read-onlyページはライタータスクが書き込んだ最新のパラメータがあるページを指すようになり、Writableページは古いパラメータのあるページとなる。
- スイッチリクエストが受理された後にライタータスクが完了処理を行うことで、Writableページのパラメータも最新のパラメータに更新される。
- リクエストや完了処理を誤ったタイミングで行うとエラーになる。1回のリクエストが完了する前に次のリクエストを出すことは出来ないし、リクエストが受理される前に完了処理をすることも出来ない。
- ほぼ同等の機能はキューを利用しても実現できるが、HIPCのキューではpbankよりもメモリ使用量が多くなる。また、pbankは使用頻度が高いユースケースであると考えられるので、別の機能としてpbankが提供されている。
使い方
- 初期化
- 2ページ分(パラメータ2セット分)のバッファを用意する。
- バッファの前半部(1ページ目)にパラメータの初期値を書き込む。
hipcPbankInit()
を呼ぶ。
- ライタータスク:
hipcPBankGetWritablePage()
でパラメータを書くためのページを取得する。
- ページのパラメータを変更する。
hipcPbankSwitchRequest()
でページの交換を要請する。
- リーダータスク:
hipcPbankSwitchAccept()
を呼び、実際にページを交換する。
hipcPbankGetReadOnlyPage()
でパラメータを読むためのページを取得する。
- ライタータスク:
hipcPbankGetStat()
を呼び、リーダータスクが交換要求を受理したか(hipcPbankSwitchAccept()
を呼んだか)を確認する。
- 要求が受理されていれば
hipcBankSwitchComplete()
を呼び、古いままの内部ページを最新のパラメータにする。
TOPページ
Last modified: 2015/07/27 08:00:59 +09:00