LoginSignup
2
4

More than 3 years have passed since last update.

STM32CubeIDEで学ぶFreeRTOS (2) - メッセージキュー

Last updated at Posted at 2019-07-16

こちらの前回記事では、シグナルイベントを紹介しました。

今回は上記記事の発展版として、同じくタスク間通信機能である、メッセージキューを体験したいと思います。

本編

1. 準備

前回記事に従い、仕込みを実施しておきます。

2. やってみよう!

2-1. 仕様

基本は前回に倣いますが、変更箇所は取り消し線太字としています。

  1. UART受信を割り込みで受ける
  2. 割り込みで受信したデータをタスクにイベントメッセージ通知
  3. イベントメッセージとデータを受けたタスクは、単にエコーバック

2-2. 実装

2-2-1. メッセージキューの追加

おなじみ、「FREERTOS」-「Tasks and Queues」タブにて、キューを追加します。

SnapCrab_STM32CubeIDE - Device Configuration Tool - STM32CubeIDE_2019-7-19_9-4-8_No-00.png

型だけ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

環境


  1. 動的にメモリ確保することで拡張可能。ただし、ここでは面倒なので割愛。 

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4