こちらの前回記事では、シグナルイベントを紹介しました。
今回は上記記事の発展版として、同じくタスク間通信機能である、メッセージキューを体験したいと思います。
本編
1. 準備
前回記事に従い、仕込みを実施しておきます。
2. やってみよう!
2-1. 仕様
基本は前回に倣いますが、変更箇所は取り消し線+太字としています。
- UART受信を割り込みで受ける
- 割り込みで受信した
旨データをタスクにイベントメッセージ通知 -
イベントメッセージとデータを受けたタスクは、単にエコーバック
2-2. 実装
2-2-1. メッセージキューの追加
おなじみ、「FREERTOS」-「Tasks and Queues」タブにて、キューを追加します。
型だけuint8_tとし、それ以外はデフォルト値でOKです。
意味合いは、**「uint8_t型を16個キューイングできるよ」**となります。
2-2-2. その他(雑)
今回より別ファイルとして、user.cを用意しました!
使用上の注意は以下です。
- myTask02のCode Generationは、As Weakとする必要あり
- main.cの手動での修正はしない(修正済みの場合は元に戻す)
- (当然ですが)user.cをコピペなりダウンロードなりで取り込む
2-3. 動かしてみる
前回同様に、Tera Termでのエコーバックが確認できるかと思います(やっぱり雑)。
3. かんたんな解説
3-1. メッセージキューとは
ずばり、イベントとデータを同時に通知する仕組みです。
本例では
「イベント=受信したよ」
「データ=受信データそのもの」
です。
データのサイズは、(何も工夫しなければ1)最大で32bit(uint32_t型)です。
CMSIS仕様は以下。
Message Queue
http://www.keil.com/pack/doc/CMSIS/RTOS/html/group__CMSIS__RTOS__Message.html
3-2. 定義と生成
賢いIDEが自動生成してくれます(main.cに含まれる)。
よって、ここではハンドルだけ使いまわします。
extern osMessageQId myQueue01Handle;
3-3. 送信と受信
それぞれ以下の通り。
/* Put Message */
osMessagePut(myQueue01Handle, (uint32_t)rxData, 0);
/* Get Message */
osEvent evt = osMessageGet(myQueue01Handle, osWaitForever);
おわりに
シグナルイベント同様、とても簡単に実装できますね!
シグナルイベントとこのメッセージキューがあれば、概ねタスク間通信は網羅できるかと思います(経験則)。
次回記事は何にしようか検討中。
参考
CMSIS-RTOS
Function Overview
http://www.keil.com/pack/doc/CMSIS/RTOS/html/functionOverview.html
環境
- IDE: STM32CubeIDE
- 評価用ボード: STM32L4 Discovery kit IoT node - 型番はB-L475E-IOT01A
-
動的にメモリ確保することで拡張可能。ただし、ここでは面倒なので割愛。 ↩