ADCで値が取れるようになったので、ちょっと寄り道して、ログを出力するルートを変更しておきたい。
今はVolTaskからUARTドライバを呼び出して直接出力させているのだが、これをUartTask経由で出せるようにしたいのだ。
そうしないと、各タスクがログを好き勝手に出してしまって、何が何だかわからなくなりそうだからだ。
目標としては、こういう感じだ。
このイメージになりそうなので、間にキューを置いている。
キュー制御用API関数の使い方
タスク生成と同じようにしてキューを生成し、ハンドル値をグローバル変数にとっておいて、各タスクはそのハンドルを使って書いたり読んだりするようだ。
あれ、ハンドルはみんなで使うようだけど、排他はいらないのかい?
こちらを読むと、MUTEXを使わずにキューで処理するやり方が書いてあるので、キューであれば排他はいらないようだ。
排他制御(MUTEX)の使い方
なんでだろう?
xQueueSend()の中身であるxQueueGenericSend()を見ると、かなり最初の方でtaskENTER_CRITICAL()を呼んでいる。
つまり、誰か最初に呼んだ人がディスパッチ禁止にするわけだ。
キューを使うときはタスク間通信が主で、だったら排他がいるから自動でやっておくか、というところか。
ディスパッチ禁止は移植対象で、ARMの場合はBASEPRIをいじって割込みを禁止させるみたい。
おおざっぱだけど、割り込み処理用にAPIが別にあるものは、内部でディスパッチ禁止処理を行うようになっていると思っていてよいのだろう。
受ける方のxQueueRecive()はタイムアウトを指定できて、無限にしておくとキューにたまるまでは待ってくれるようだ。
変更したプロジェクトは、こちら。
案外、あっさりと動いてくれた。
今頃気付いたが、FreeRTOSはドライバレベルについてはOSで面倒を見ないから、別マイコンに移植するつもりがあるなら自分でやることになるんだな。
まあ、最近は他のマイコンに載せるといっても同系列のマイコンだったりするので、そこに時間を掛けるよりもさっさと作れてしまうほうがありがたいかも。
0 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。