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

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

[复制链接]
wolfgang 发布时间:2018-5-17 22:44
本帖最后由 wolfgang2015 于 2018-5-17 22:49 编辑 * q, @$ k& P, M2 L6 `

$ J9 s: y- Q% }6 _
队列的使用,试验的内容如下图:
23.jpg
队列的创建、使用以下函数创建队列。
24.jpg
xQueueCreate 使用宏 调用 xQueueGenericCreate
    xQueueCreate  与xQueueCreateStatic,调用宏受以下的配置参数影响
configSUPPORT_DYNAMIC_ALLOCATION,configSUPPORT_STATIC_ALLOCATION
参数不同调用的实体也不同:

4 c2 [% h# E3 L5 b4 m
xQueueGenericCreate 和xQueueGenericCreateStatic
# c* J5 r, C8 z* U& {2 ^
将消息送入队列、从队列中提取消息的函数:
25.jpg
创建队列后,使用 xQueueSend();xQueueReceive();实现发送和接收消息。消息发送和接收操作可以通过队列实现任务间的数据通信;创建队列后,使用 xQueueSend();xQueueReceive();实现发送和接收消息。消息发送和接收操作可以通过队列实现任务间的数据通信;
. U: u5 v. \/ i6 q' X- r
试验具体步骤:

3 j+ W! l5 B/ _, W3 P1 v! O" O
1、继续上一个信号量试验的内容,在main.h中加入队列传递消息的常量定义:
  1. <font face="新宋体" size="3">enum Enum_Language {. J3 H( ]  a7 V- i: A1 I) A7 w. K
  2.     None =0,( p9 k8 {0 o1 D. ^0 j0 [
  3.     English = 1,
    * j! a6 l9 w! b- @
  4.     Deutsch = 2
    5 c; s; H( c/ \9 x+ ^
  5. };9 X  q) ]8 e! O4 `% y
  6. </font>
复制代码
2、main.c中定义队列的数据类型、队列长度等内容
  1. <font face="新宋体" size="3">typedef struct QueueTypedef {
    6 s" _: ?, O4 C3 j% Q$ t
  2.     enum Enum_Language Lanuage;
    # L# _" _/ ^4 U- m; g: z( @% _
  3.     uint32_t ToggleCount;: D+ x2 U; q7 l0 c+ ?
  4. } QueueType;- p. w3 a7 [+ w4 z+ i# t
  5.     #define QUEUE_DEP (5U). f: w/ l; m8 N( u- t# @" p! w2 a
  6.     #define QUEUE_LEN sizeof(QueueType)4 O/ L9 j6 j7 T2 L9 l* i
  7. </font>
复制代码
/ L' K3 o# ]1 F' }8 A- g
3、定义消息消费任务:
4 ~# }2 i# ^/ V5 q( o
接收到消息队列中的消息,根据消息种类,实现不同的信息回复与闪灯提示,判断为英语闪亮LED2,为德语闪亮LED3,根据消息的闪亮次数控制LED灯不同的闪亮次数。
  1. <font face="新宋体" size="3">void vStartLanTogTask(void const * argument);
    / X. \$ E+ }6 J) C! h& I: b. j; ^# m
  2. ……
    ; ?4 o# B# [, A( q7 Q
  3. ( n5 L9 Z* L# R( x% ~
  4. void vStartLanTogTask(void const * argument) {
    1 D# |, E! E7 \0 E  c
  5.     QueueType usData;7 l# t+ @3 C0 F4 k& g
  6.     uint8_t i;9 |% F: v6 T& L  Q3 g8 b' P
  7.     uint8_t sta = ON;
    ( M! i) |- e9 ?- ?( ?6 T
  8.     uint16_t delay = 100;
    * Q  U" h) H( ?. l( V& f
  9.     const TickType_t xBlockTime = pdMS_TO_TICKS((TickType_t ) 1000);  q9 i! R: T- T7 Y  f
  10.     for (;;) {
    ' P! b) G$ Y) v9 F" m) `
  11.       if ( xQueueReceive( xQueue, &usData, xBlockTime ) == pdPASS) {
    4 r2 F" {. P9 w: F- A0 x7 N
  12.           if (usData.Lanuage == English) {( Z: i+ F4 E# d: |. q8 @$ q
  13.                for (i = 0; i < usData.ToggleCount * 2; i++) {
    ! G5 u0 p4 ]$ g
  14.                     LED2(sta);
    ! q4 l& X9 ^) X6 U' m, }
  15.                     sta = !sta;' f: ]9 Q3 H% M: w' ~, i9 n5 U# e
  16.                     vTaskDelay(delay / portTICK_PERIOD_MS);
    % p* T, j0 i! B# D
  17.                 }
    0 W& H" f8 Y8 u7 j4 Z) o
  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");
    - ~2 v) B* b! X6 u5 B% `
  19.          } else if (usData.Lanuage == Deutsch) {/ t; _8 d) K1 X8 c4 i1 w
  20.               for (i = 0; i < usData.ToggleCount * 2; i++) {
    $ c# Q' C7 R1 L  Q2 o' [5 H
  21.                   LED3(sta);
    ) I- ~; k. b% e; A
  22.                   sta = !sta;
    ( m  t, R  Q" C( @7 c# v
  23.                   vTaskDelay(delay / portTICK_PERIOD_MS);2 ~: a% H: p: v' z& q, B
  24.               }
    3 I/ @3 Q, l3 b6 M$ C6 |
  25.               printf("Gut: nur attr , nicht adv \n");7 E1 Z6 A% c) d* t$ ~! [
  26.           }else{9 `, f) w/ W8 g
  27.               ;
      r" A7 {4 e0 o5 x0 h2 x
  28.           }9 k5 g- p* a# M: c
  29.        }3 Q3 T- N* I- ?) w: C' u
  30.     }
    $ O0 G2 @! w, Z$ B
  31. }3 y, X& C# d* [
  32. ..................</font>
复制代码
4、改造串口消息解析任务,把串口接收到的字符串进行解析,并将解析的内容分解为队列中的不同值
  1. <font face="新宋体" size="3">……
    3 V/ C, ~$ b) e. t% E! w
  2.        //解析位Hello,识别为英语,传递消息内容:英语,闪亮LED次数2
    ( b2 ^: M( T+ M, P" D5 h1 Z
  3.                 strp = strstr((char *) ReceiveInfo, (char *) "Hello");
    & v) r8 K5 r" T) z' t$ r. g
  4.                 if (NULL != strp) {; F- }  [% D) }1 T1 N
  5.                         printf("\n Nice to meet you! \n");+ N9 A) A6 h( e/ r* R
  6.                         usData.Lanuage = English;
    / {: C) o/ m& K% E; ]
  7.                         usData.ToggleCount = 2;
    9 U& n; S8 U7 G1 j2 Y" d
  8.                 };  0 j2 \+ m$ G0 h. w
  9. ………
    4 ~0 a( C, E/ q8 s& n- m( f
  10. //回答guten tag/ guten morgen/ guten abend / guten nacht; R9 S2 N! J5 R8 J) B
  11. //解析为Guten morgen, 识别为德语,传递消息内容:德语,闪亮LED次数1;
    & H  T! G6 f4 L
  12. //解析为Guten tag, 识别为德语,传递消息内容:德语,闪亮LED次数2;
    / ]# a$ r& v0 R* a
  13. //解析为Guten abend, 识别为德语,传递消息内容:德语,闪亮LED次数3;
    " J% N! }1 H  \  q; Y7 t. P% ~
  14. //解析为Guten nacht, 识别为德语,传递消息内容:德语,闪亮LED次数4;
    ! A, V, V" D1 w: V2 W* G
  15.                 strp = strstr((char *) ReceiveInfo, (char *) "Guten");: Q+ s7 u% W4 N/ D1 U
  16.                 if (NULL != strp) {) W9 Z1 \- e* C. A* a
  17.                         strp1 = strstr((char *) ReceiveInfo, (char *) "morgen");
    9 ~+ X& Y, B. m6 J! E
  18.                         if (NULL != strp1) {
    + P6 i7 t3 E1 r' {# t: n/ ~
  19.                                 printf("\n Guten Morgen ! \n");0 j1 g1 Q- q' t6 C( X  b
  20.                                 usData.Lanuage = Deutsch;
    4 k5 k: e8 |, s+ i7 f2 m
  21.                                 usData.ToggleCount = 1;
    " D! P, Z) u# M* U' m
  22.                         }
    ( G* `- }4 u# x( \. Y: `0 _  H! {
  23.                         strp1 = strstr((char *) ReceiveInfo, (char *) "tag");
    5 J8 J7 j8 j2 O  u* S% t
  24.                         if (NULL != strp1) {
    * R- a- P) O: ]2 X
  25.                                 printf("\n Guten Tag ! \n");
    ) b: c' k! F. \) S
  26.                                 usData.Lanuage = Deutsch;" h$ A$ @( V  r, E4 c! R. x
  27.                                 usData.ToggleCount = 2;
    ) ^$ O7 C, j! w5 ]7 G8 O! D& t
  28.                         }
    , \- p! ~  \& J" v+ Z' J
  29.                         strp1 = strstr((char *) ReceiveInfo, (char *) "abend");  j5 x* I" b8 P, D
  30.                         if (NULL != strp1) {
    4 g, z! @( l$ N. ?5 n
  31.                                 printf("\n Guten Abend ! \n");# i- ]. A( J& K( g
  32.                                 usData.Lanuage = Deutsch;
    ) x- y) e: \$ t. m% \; P! f& v: w
  33.                                 usData.ToggleCount = 3;
    ' y: T) k$ F4 G3 u! m8 B
  34.                         }
    : H1 w2 k6 K/ u3 K8 _
  35.                         strp1 = strstr((char *) ReceiveInfo, (char *) "nacht");
    1 b9 S, q3 C& A$ @
  36.                         if (NULL != strp1) {
    ' l7 ?& {4 Q, g( W
  37.                                 printf("\n Gute Nacht ! die Nacht \n");
    " l8 j' i) D# s- V
  38.                                 usData.Lanuage = Deutsch;
    7 s" x4 K; A: B3 K" A" ^5 @2 D% N
  39.                                 usData.ToggleCount = 4;
    7 @- L. v! d7 b& f5 P; ~' T
  40.                         }5 f1 a1 {/ k1 q+ o) R
  41.                 }
    . F5 L# K' e4 Z9 z, A; s
  42. ……
    " ]4 \% T5 ^3 {9 Z' M! _  u) b9 Z
  43. 4 F  n6 {' `: W( b4 u! H6 Y* f7 v
  44. </font>
复制代码
5、在main函数中创建队列、创建消费者任务
  1. <font face="新宋体" size="3">……9 J  y( @( Y( \% j- T- G+ z
  2.         xTaskCreate((TaskFunction_t) vStartLanTogTask, //任务函数
    2 S1 Q' o2 d3 y2 @% m7 g' B8 P) ^/ K
  3.                   "LanTog",                                   //任务名称
    5 D2 R$ }- S" \5 R0 l4 G$ a6 |& M# P6 E
  4.                   200,                                       //任务栈大小
    7 i" g" a# o% Q  d, c
  5.                   NULL,                                     //任务函数参数
    ! ]: N( V* J% ?4 A& ?
  6.                   Start_TASK_PRIORITY,                      //任务执行等级4 B4 f9 j; z$ P% A( O
  7.                    (TaskHandle_t *) NULL);                //任务句柄
    ) c/ o, C/ [+ R! H, e
  8. xQueue = xQueueCreate(QUEUE_DEP, QUEUE_LEN);
    & b* h1 V- _/ X
  9. ……  L9 i' h3 J+ h" t3 u% t
  10. </font>
复制代码

4 Z( P& F; {0 e% j' s% R
编译下载代码到开发板中,在串口工具中键入以下内容:
! w: X0 J: h; }
Hello、Guten morgen、Guten tag、Guten abend、Guten nacht

  {/ i+ {/ ~$ I
串口显示如下:
& a' D: _& ?  Z: V4 F' K6 n
26.jpg
! s% |4 b2 \( M9 V* ^- H" ?
输入 Hello后,蓝灯闪亮2次
27.jpg

9 b+ {" Y4 d2 W  v7 \6 n4 e/ d  O; C

" F& v( |# e! F9 G
输入:Guten morgen、Guten tag、Guten abend、Guten nacht后,红灯分别闪亮1、2、3、4次
28.jpg

+ F4 ~" b/ m7 Q( `
( `0 ~6 a2 t' P# @
# _& o: f1 `& k7 h

% b3 W6 V* U+ Q- O* A
% K# G7 g- ~5 Q7 Y7 q
收藏 评论0 发布时间:2018-5-17 22:44

举报

0个回答

所属标签

相似分享

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