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

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

[复制链接]
wolfgang 发布时间:2018-5-17 22:44
本帖最后由 wolfgang2015 于 2018-5-17 22:49 编辑
. P5 y. {, x5 A' x, S3 {5 d" w! q3 ~
队列的使用,试验的内容如下图:
23.jpg
队列的创建、使用以下函数创建队列。
24.jpg
xQueueCreate 使用宏 调用 xQueueGenericCreate
    xQueueCreate  与xQueueCreateStatic,调用宏受以下的配置参数影响
configSUPPORT_DYNAMIC_ALLOCATION,configSUPPORT_STATIC_ALLOCATION
参数不同调用的实体也不同:

4 L5 ^6 o* ]: u2 Z# n7 y
xQueueGenericCreate 和xQueueGenericCreateStatic
0 {1 R7 p. k% y$ y9 E
将消息送入队列、从队列中提取消息的函数:
25.jpg
创建队列后,使用 xQueueSend();xQueueReceive();实现发送和接收消息。消息发送和接收操作可以通过队列实现任务间的数据通信;创建队列后,使用 xQueueSend();xQueueReceive();实现发送和接收消息。消息发送和接收操作可以通过队列实现任务间的数据通信;

/ ^/ w9 L, c8 ]8 F" q4 D8 q) o
试验具体步骤:
' `. _1 h) w/ [" D2 l3 o
1、继续上一个信号量试验的内容,在main.h中加入队列传递消息的常量定义:
  1. <font face="新宋体" size="3">enum Enum_Language {9 X/ w, G4 B4 h
  2.     None =0,
    . k# \- E, I" b# K  T, U/ v- V
  3.     English = 1,
    * I; ~5 K3 V' ^0 m: ?/ E
  4.     Deutsch = 2
    5 h" O) U( [% B( Z/ V& W
  5. };
    6 \5 {. z4 }7 ~  L7 k: ]
  6. </font>
复制代码
2、main.c中定义队列的数据类型、队列长度等内容
  1. <font face="新宋体" size="3">typedef struct QueueTypedef {! w  E8 `8 A- s1 ^: @4 U
  2.     enum Enum_Language Lanuage;
      s3 p0 v% g0 i) [
  3.     uint32_t ToggleCount;; k" D2 e5 L; e% q3 a. u) Y
  4. } QueueType;# [: p( l0 t  C9 w) V
  5.     #define QUEUE_DEP (5U)
    1 ]9 ]$ e% N6 U9 g- W
  6.     #define QUEUE_LEN sizeof(QueueType): s6 c% p& e3 D  @* P* u6 B3 d
  7. </font>
复制代码

( \$ M2 D( W/ |5 k( m1 _* z
3、定义消息消费任务:

/ h1 d  S  q" e. G1 x8 A
接收到消息队列中的消息,根据消息种类,实现不同的信息回复与闪灯提示,判断为英语闪亮LED2,为德语闪亮LED3,根据消息的闪亮次数控制LED灯不同的闪亮次数。
  1. <font face="新宋体" size="3">void vStartLanTogTask(void const * argument);
    $ H2 @. \" \; d! @  @: o+ n
  2. ……
    : Y; n2 X4 U' K7 I+ u: a

  3. 6 `- K: M: y* ~' [
  4. void vStartLanTogTask(void const * argument) {
    ) O9 s3 y9 B9 D
  5.     QueueType usData;& g9 g# z% D) N
  6.     uint8_t i;
    1 `+ @; D. Z) Q- p( B
  7.     uint8_t sta = ON;
    $ D( d9 X  G8 P) ^
  8.     uint16_t delay = 100;
    7 q9 _# l: W( p- u- d
  9.     const TickType_t xBlockTime = pdMS_TO_TICKS((TickType_t ) 1000);
    8 x0 Q; |$ l' i
  10.     for (;;) {# r# J! C. r9 S. y1 M
  11.       if ( xQueueReceive( xQueue, &usData, xBlockTime ) == pdPASS) {
    2 F9 i6 _; w3 g1 a% d% ]3 m# X8 n
  12.           if (usData.Lanuage == English) {0 S) V- t5 R* J. e9 S! V
  13.                for (i = 0; i < usData.ToggleCount * 2; i++) {: U$ u- s& ?) n4 `7 A4 z) A* q
  14.                     LED2(sta);
    3 ^8 q1 V, |7 \9 f6 l; y
  15.                     sta = !sta;, Q# k+ c- p# Z" c, K* y' [
  16.                     vTaskDelay(delay / portTICK_PERIOD_MS);
    1 ?* t* e1 e$ o" N4 ?
  17.                 }
    8 k9 ?3 z! Z* Q
  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");
    ; K! M% d) e4 C( Y
  19.          } else if (usData.Lanuage == Deutsch) {: M" K  B  s1 U2 g( p9 j$ }4 J
  20.               for (i = 0; i < usData.ToggleCount * 2; i++) {
    ' }( ]4 T; e" B( h9 q9 r
  21.                   LED3(sta);9 u# u' v5 @7 D. v  _# v3 m1 o$ `
  22.                   sta = !sta;. @+ G" M; \3 Y/ z$ ?' p
  23.                   vTaskDelay(delay / portTICK_PERIOD_MS);) K/ b( [- V. W* _! N7 q7 U
  24.               }; C7 B, j8 r3 N! X
  25.               printf("Gut: nur attr , nicht adv \n");+ d6 i6 x& P* \5 E6 @. D
  26.           }else{5 J8 \4 A0 q  C1 O1 e2 \# @% R
  27.               ;$ t3 A& e- o6 R5 Z9 u' C9 }
  28.           }
    8 U2 V4 A, ~! w
  29.        }" Z, [# W& H3 E2 ^1 W1 ]$ d
  30.     }- I9 e( T& f* Q+ v% F: c
  31. }
    5 N! y3 l9 U6 y* h$ |4 Q8 B; K
  32. ..................</font>
复制代码
4、改造串口消息解析任务,把串口接收到的字符串进行解析,并将解析的内容分解为队列中的不同值
  1. <font face="新宋体" size="3">……
    ' p& [+ M$ u* W0 y' U3 o
  2.        //解析位Hello,识别为英语,传递消息内容:英语,闪亮LED次数2
    6 i, j$ L1 t0 ?0 h! y; S
  3.                 strp = strstr((char *) ReceiveInfo, (char *) "Hello");* F8 q2 D3 `3 V0 c) m1 m) B
  4.                 if (NULL != strp) {
    + G5 X$ }% @. Y/ k2 ^6 w8 f
  5.                         printf("\n Nice to meet you! \n");
    - {8 r6 e, k# T) G  Z4 i. C  p
  6.                         usData.Lanuage = English;
    ; s; n5 d; t3 G
  7.                         usData.ToggleCount = 2;; v' }' D, \4 K$ l% A$ w1 I
  8.                 };  
      V9 `+ _% D% u1 e' {( a
  9. ……… 9 c! R! @1 A% R" A/ Y: {
  10. //回答guten tag/ guten morgen/ guten abend / guten nacht
    3 F9 J9 ^8 s! @. a7 a. s
  11. //解析为Guten morgen, 识别为德语,传递消息内容:德语,闪亮LED次数1;9 n% l$ Q4 o: w* U
  12. //解析为Guten tag, 识别为德语,传递消息内容:德语,闪亮LED次数2;" |( |7 x  [: U( Q8 b' @# P
  13. //解析为Guten abend, 识别为德语,传递消息内容:德语,闪亮LED次数3;
    9 \5 `4 U& J1 n! E% T5 @, L3 u3 Q, w
  14. //解析为Guten nacht, 识别为德语,传递消息内容:德语,闪亮LED次数4;" i5 o+ ^9 h# [& s
  15.                 strp = strstr((char *) ReceiveInfo, (char *) "Guten");6 }" M1 X4 Y2 M* D0 J# T
  16.                 if (NULL != strp) {
    2 c7 N6 r2 W& ^- ?4 g8 L
  17.                         strp1 = strstr((char *) ReceiveInfo, (char *) "morgen");$ h3 g! P6 K9 K
  18.                         if (NULL != strp1) {
    ' X0 Q& g! @& O
  19.                                 printf("\n Guten Morgen ! \n");
    # [  Y( e3 m2 e0 ~
  20.                                 usData.Lanuage = Deutsch;  B' o$ h. @# U
  21.                                 usData.ToggleCount = 1;
    $ B. q9 r4 y5 T3 j$ l3 z8 u
  22.                         }, Z+ P+ t: ~& K  d3 h: ]
  23.                         strp1 = strstr((char *) ReceiveInfo, (char *) "tag");9 n8 k4 i, g3 a  }
  24.                         if (NULL != strp1) {9 x+ R4 T6 H. Z
  25.                                 printf("\n Guten Tag ! \n");2 s' @; \2 [, a8 f+ Y6 M
  26.                                 usData.Lanuage = Deutsch;
    " X- k* w, `. R# O8 K* [( r7 v
  27.                                 usData.ToggleCount = 2;  v* {: U5 R1 j# [  a
  28.                         }2 a7 T+ f3 d8 ~* Q+ y, ?
  29.                         strp1 = strstr((char *) ReceiveInfo, (char *) "abend");
    + ~# `3 i, `# V5 E. k' T( z% k
  30.                         if (NULL != strp1) {0 ^3 v1 x$ h* p' k
  31.                                 printf("\n Guten Abend ! \n");
    ! p8 c2 T4 ~4 N  A3 {8 U
  32.                                 usData.Lanuage = Deutsch;
    . u! g& H- U' E. C* ]- _5 |
  33.                                 usData.ToggleCount = 3;& f; g# D5 [1 j& V: c( |
  34.                         }- l7 y6 W1 x& a$ _) O9 ~! B; N( H, }4 f
  35.                         strp1 = strstr((char *) ReceiveInfo, (char *) "nacht");
    1 @4 B" h( Y+ y/ e3 Z7 F
  36.                         if (NULL != strp1) {
    : ~0 Q3 [; i/ w' E
  37.                                 printf("\n Gute Nacht ! die Nacht \n");
    6 x5 I: @. e1 t. v& {  n9 V+ @
  38.                                 usData.Lanuage = Deutsch;
    8 u9 v, }+ B7 h
  39.                                 usData.ToggleCount = 4;' S2 }: _9 |- c$ |1 W! [8 I
  40.                         }* c8 [5 l) z& P  K( j. h9 k
  41.                 }
    " t$ T) O0 E3 r" p2 W
  42. ……
    / n/ P6 Q  r! `: R5 n. f& G

  43. 1 {0 h# o6 r$ s
  44. </font>
复制代码
5、在main函数中创建队列、创建消费者任务
  1. <font face="新宋体" size="3">……$ O  h% J3 J. K9 y. \9 t& m/ ^
  2.         xTaskCreate((TaskFunction_t) vStartLanTogTask, //任务函数/ h* V  |9 Z- `: A3 H& H4 w1 G
  3.                   "LanTog",                                   //任务名称( y& G8 Z( \4 k( D1 ]1 r( ]) l
  4.                   200,                                       //任务栈大小3 N$ D2 t! H: |$ P
  5.                   NULL,                                     //任务函数参数  H4 H' p: p) R: a- [
  6.                   Start_TASK_PRIORITY,                      //任务执行等级
    ) c% U$ }0 G, A
  7.                    (TaskHandle_t *) NULL);                //任务句柄" L8 F- J$ t. x5 ^
  8. xQueue = xQueueCreate(QUEUE_DEP, QUEUE_LEN);9 }8 j( ]% g+ o& r: |% t$ {
  9. ……
    " I, h! n+ h) ^) G- [* J
  10. </font>
复制代码

+ d2 ?7 u' [  ~
编译下载代码到开发板中,在串口工具中键入以下内容:
- q0 I. R/ J2 i. X% f. }
Hello、Guten morgen、Guten tag、Guten abend、Guten nacht
8 X% N0 H. W5 e5 _5 \; `: b$ L
串口显示如下:

% z9 c! A% ]& f. Y# o$ f: [' A- s+ L
26.jpg

' M; n. E4 \  H) l" m) O
输入 Hello后,蓝灯闪亮2次
27.jpg

" Q# [  ~0 O0 ^9 h
  X& |3 c  O% N( \1 \$ Z9 P3 M' [
输入:Guten morgen、Guten tag、Guten abend、Guten nacht后,红灯分别闪亮1、2、3、4次
28.jpg
7 i" ~; O* @# y! q. [# }

4 [0 F  U$ G  X1 |0 P( ~. q  t

* p0 z% d- c( }# w0 D1 ?8 T
" B& f" i2 |0 J7 s( C+ Y- j
0 Z; N8 b4 b) u9 J4 d2 x3 M
收藏 评论0 发布时间:2018-5-17 22:44

举报

0个回答

所属标签

相似分享

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