你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

《低功耗MCU运行FreeRTOS》培训课程(六)消息队列的使用

[复制链接]
wolfgang 发布时间:2018-5-17 22:44
本帖最后由 wolfgang2015 于 2018-5-17 22:49 编辑 * f% x0 ~0 V& _1 L+ t: Q
) \, `4 b$ |6 P. _, J  ^) E& B# {# H
队列的使用,试验的内容如下图:
23.jpg
队列的创建、使用以下函数创建队列。
24.jpg
xQueueCreate 使用宏 调用 xQueueGenericCreate
    xQueueCreate  与xQueueCreateStatic,调用宏受以下的配置参数影响
configSUPPORT_DYNAMIC_ALLOCATION,configSUPPORT_STATIC_ALLOCATION
参数不同调用的实体也不同:

7 s' z9 F2 m3 b1 `
xQueueGenericCreate 和xQueueGenericCreateStatic

- h6 c' y" _% u$ l
将消息送入队列、从队列中提取消息的函数:
25.jpg
创建队列后,使用 xQueueSend();xQueueReceive();实现发送和接收消息。消息发送和接收操作可以通过队列实现任务间的数据通信;创建队列后,使用 xQueueSend();xQueueReceive();实现发送和接收消息。消息发送和接收操作可以通过队列实现任务间的数据通信;
0 L4 A3 }0 S- W: t
试验具体步骤:
1 S) R+ M; y) |% E
1、继续上一个信号量试验的内容,在main.h中加入队列传递消息的常量定义:
  1. <font face="新宋体" size="3">enum Enum_Language {2 V4 Z! T9 G4 f& z# W
  2.     None =0,+ F3 }& B$ s3 ?8 F  \& ~# f
  3.     English = 1,
    1 e* o2 C% K' z2 X# N3 |
  4.     Deutsch = 2
    1 x/ I5 @# y* X
  5. };
    ( N2 b0 L4 H! S( W& J, r2 i1 G
  6. </font>
复制代码
2、main.c中定义队列的数据类型、队列长度等内容
  1. <font face="新宋体" size="3">typedef struct QueueTypedef {; i, |4 \7 g* p$ w$ F
  2.     enum Enum_Language Lanuage;
    - E: s- ?* g' G4 U  L
  3.     uint32_t ToggleCount;( v$ O& a: F: o# f+ G. o
  4. } QueueType;
    2 A8 _8 C! W  R7 V8 r
  5.     #define QUEUE_DEP (5U)! G! l) \7 _6 Q. J
  6.     #define QUEUE_LEN sizeof(QueueType)8 _: m; m# N8 r/ P
  7. </font>
复制代码

- d- Z+ G0 Q4 B5 o$ {) `
3、定义消息消费任务:

# i5 o+ `3 f, J% s
接收到消息队列中的消息,根据消息种类,实现不同的信息回复与闪灯提示,判断为英语闪亮LED2,为德语闪亮LED3,根据消息的闪亮次数控制LED灯不同的闪亮次数。
  1. <font face="新宋体" size="3">void vStartLanTogTask(void const * argument);
    $ N- z8 t2 w9 b6 y" Z: U( }) S2 S
  2. ……
    9 H" T" I8 u% s" R0 g- _

  3. & H5 W5 Q* d8 l/ N
  4. void vStartLanTogTask(void const * argument) {1 Z. ^" f, {* s2 v
  5.     QueueType usData;# }4 _7 ?3 t0 k
  6.     uint8_t i;8 c5 _( K% G! [( X: y3 x
  7.     uint8_t sta = ON;
    9 i6 J6 X1 S7 J, I) R9 g7 V0 {
  8.     uint16_t delay = 100;" W0 [7 {0 a; o6 C
  9.     const TickType_t xBlockTime = pdMS_TO_TICKS((TickType_t ) 1000);
    8 n% W2 H/ Y0 Q8 ]$ U3 Y- {
  10.     for (;;) {& r7 k: D: {: v
  11.       if ( xQueueReceive( xQueue, &usData, xBlockTime ) == pdPASS) {
    6 o% Q+ P0 L+ i
  12.           if (usData.Lanuage == English) {( e$ B/ g- k- k3 x
  13.                for (i = 0; i < usData.ToggleCount * 2; i++) {( d$ d+ J6 U# U) p7 J3 `
  14.                     LED2(sta);
    7 B9 b5 J2 t3 q2 v; Q' y
  15.                     sta = !sta;& C( I) i2 P- F% ?
  16.                     vTaskDelay(delay / portTICK_PERIOD_MS);- r5 R% w( k; T4 P3 F% H3 d
  17.                 }
    ; W) {! A0 b1 A' R
  18.                 printf(        "Hello : used as a greeting when you meet sb, when you answer the telephone or when you want to attract sb's attention; \n");# m) C) v6 n' z7 s; M! Q
  19.          } else if (usData.Lanuage == Deutsch) {( |# F, ?, }  r1 m9 r1 U
  20.               for (i = 0; i < usData.ToggleCount * 2; i++) {5 P$ r: L* C! Z
  21.                   LED3(sta);
    % r7 z) g' k9 H" d$ I8 F
  22.                   sta = !sta;
    + i' d5 k: q( t* r2 `
  23.                   vTaskDelay(delay / portTICK_PERIOD_MS);
    - M& K) Z6 \& a  I
  24.               }
    2 w4 }4 |9 h: c7 @, ~
  25.               printf("Gut: nur attr , nicht adv \n");/ P  K8 ^. v. _5 E
  26.           }else{: ?6 S2 l4 w* D8 |
  27.               ;) n  z1 w& z! V7 W
  28.           }' Y3 d3 y  A. t+ z
  29.        }% l$ Q* H+ n, R3 |
  30.     }
    2 T$ r8 K! d5 ]7 _5 R8 F, T! M
  31. }. B" U8 O3 T: s' U* u! Y2 ]
  32. ..................</font>
复制代码
4、改造串口消息解析任务,把串口接收到的字符串进行解析,并将解析的内容分解为队列中的不同值
  1. <font face="新宋体" size="3">……
    3 b  ?& m9 P5 `9 W& o
  2.        //解析位Hello,识别为英语,传递消息内容:英语,闪亮LED次数2
    & _- w' s+ i. @! M) p' r: z' F
  3.                 strp = strstr((char *) ReceiveInfo, (char *) "Hello");% d# x/ x  C3 L* l& |$ Q& o
  4.                 if (NULL != strp) {
    + J4 W4 _* v3 N/ p0 ~
  5.                         printf("\n Nice to meet you! \n");
    : [( T" @/ I  ?( K" K1 _* ?. {
  6.                         usData.Lanuage = English;
    $ {7 T/ n/ R$ T: Y
  7.                         usData.ToggleCount = 2;
    , s  K- {) I4 J6 d$ L& a
  8.                 };  " V$ b7 x0 J' V" Q
  9. ……… / @' R6 A2 y$ O* e
  10. //回答guten tag/ guten morgen/ guten abend / guten nacht& L' {+ K  V) _& H% c
  11. //解析为Guten morgen, 识别为德语,传递消息内容:德语,闪亮LED次数1;
    & G$ \# W' d; R2 w
  12. //解析为Guten tag, 识别为德语,传递消息内容:德语,闪亮LED次数2;
    0 p! [: q5 s4 E3 |! P1 s. I! S
  13. //解析为Guten abend, 识别为德语,传递消息内容:德语,闪亮LED次数3;% c) Y. ~& \) g: _! x
  14. //解析为Guten nacht, 识别为德语,传递消息内容:德语,闪亮LED次数4;+ w1 {5 p4 M4 a4 v8 F) D, }' {* M" r
  15.                 strp = strstr((char *) ReceiveInfo, (char *) "Guten");
    + E8 V# ]) {# o, `
  16.                 if (NULL != strp) {
    . O, Q8 R- f5 c; h# m
  17.                         strp1 = strstr((char *) ReceiveInfo, (char *) "morgen");
    0 a8 q1 p3 T) V! D6 H
  18.                         if (NULL != strp1) {5 o, U8 U9 Q- `* Z
  19.                                 printf("\n Guten Morgen ! \n");
    % p4 `/ Y! ~# ^# G
  20.                                 usData.Lanuage = Deutsch;
    4 p* Y3 f8 l" f9 L; M6 X
  21.                                 usData.ToggleCount = 1;
    5 c  v7 ]( r$ _- @% `2 z9 ]( t
  22.                         }. K' Q% X1 ~" i, I% w8 B* d9 q
  23.                         strp1 = strstr((char *) ReceiveInfo, (char *) "tag");7 a6 g/ s5 n( Q) J2 ^/ f  S
  24.                         if (NULL != strp1) {
    % j7 d5 Y; f+ q9 A3 w$ m
  25.                                 printf("\n Guten Tag ! \n");
    # v- y1 N% L7 c! X7 X
  26.                                 usData.Lanuage = Deutsch;2 w9 o. j! ]' i% A8 E! \8 j3 Y) H
  27.                                 usData.ToggleCount = 2;
    2 A- N- A  D; P, I
  28.                         }5 H: ~! f. _9 B' a( v# R
  29.                         strp1 = strstr((char *) ReceiveInfo, (char *) "abend");( c* \% K8 |8 c" z  n" i1 J) K8 L
  30.                         if (NULL != strp1) {
    5 l; n* }  F) s& m* F
  31.                                 printf("\n Guten Abend ! \n");8 ^' N: |! _5 Z; d, i1 k6 W
  32.                                 usData.Lanuage = Deutsch;8 Q/ i' f9 Q6 @
  33.                                 usData.ToggleCount = 3;
    - h1 u2 d- h; m) u# F
  34.                         }
    & M; R. A( @: J- I6 G% H
  35.                         strp1 = strstr((char *) ReceiveInfo, (char *) "nacht");
    . r, e( ~3 |. F- M# C6 j
  36.                         if (NULL != strp1) {8 w9 E# b# `( a" `( s# J
  37.                                 printf("\n Gute Nacht ! die Nacht \n");
    ) C$ M* O; S! w9 c; X, ^$ y
  38.                                 usData.Lanuage = Deutsch;
    ( _/ s9 B% `7 ?" G# A/ f
  39.                                 usData.ToggleCount = 4;
      [' a/ @1 }2 t$ ]. f; p" Z; u) d$ u
  40.                         }3 Z- }0 \/ p5 g+ W/ I  q) c
  41.                 }9 Z& f% V# `; c2 d; N! [9 X
  42. ……% E. Z' S% N& P1 r2 [8 z

  43. ! u) Y' n% r1 C8 _4 e' [
  44. </font>
复制代码
5、在main函数中创建队列、创建消费者任务
  1. <font face="新宋体" size="3">……( x. b8 p/ w' ~5 b6 H. i+ c
  2.         xTaskCreate((TaskFunction_t) vStartLanTogTask, //任务函数" ?" p% x" Y9 m4 Y
  3.                   "LanTog",                                   //任务名称
    $ f: A1 L: p0 W. A/ e. V/ P
  4.                   200,                                       //任务栈大小& Z+ i6 X" l$ A2 m+ p' c; j
  5.                   NULL,                                     //任务函数参数" G* \8 x7 b, d9 M0 A
  6.                   Start_TASK_PRIORITY,                      //任务执行等级/ z/ k7 s# G3 Z& ]. l0 A4 X
  7.                    (TaskHandle_t *) NULL);                //任务句柄
    6 s% R  Y3 S; K7 S) o. B
  8. xQueue = xQueueCreate(QUEUE_DEP, QUEUE_LEN);
    ( Y3 v/ ^0 a/ W; e& G
  9. ……3 E. J9 o* D7 ~- b9 l! V: ^
  10. </font>
复制代码
' G: V0 t' r7 s' \+ L
编译下载代码到开发板中,在串口工具中键入以下内容:
. e7 W! X; a" v! p% V
Hello、Guten morgen、Guten tag、Guten abend、Guten nacht
- c5 y9 z% O- _# P9 A! p& D, Y
串口显示如下:
( H0 K/ I2 c3 p/ e) O+ |
26.jpg

' `( I- b6 x  P, ~
输入 Hello后,蓝灯闪亮2次
27.jpg
( u& W' S7 i8 {7 r/ f' k! q6 H
9 ?5 H3 {$ N  [2 P+ e. i
输入:Guten morgen、Guten tag、Guten abend、Guten nacht后,红灯分别闪亮1、2、3、4次
28.jpg
7 P: `3 O0 R8 Q  z( J
! y$ N( g" ]7 k# w. a7 d
+ Y3 s4 G7 R5 F5 D$ m$ t
, j" L0 w6 x4 o; q7 N. e9 C6 ^
1 @$ U, o0 Q+ J4 J
收藏 评论0 发布时间:2018-5-17 22:44

举报

0个回答

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版