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

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

[复制链接]
wolfgang 发布时间:2018-5-17 22:44
本帖最后由 wolfgang2015 于 2018-5-17 22:49 编辑 " }( W* j: |. E) Q( v& Q

3 h- `& R" b- J0 N( @
队列的使用,试验的内容如下图:
23.jpg
队列的创建、使用以下函数创建队列。
24.jpg
xQueueCreate 使用宏 调用 xQueueGenericCreate
    xQueueCreate  与xQueueCreateStatic,调用宏受以下的配置参数影响
configSUPPORT_DYNAMIC_ALLOCATION,configSUPPORT_STATIC_ALLOCATION
参数不同调用的实体也不同:
( O8 a* E$ C7 [1 p- H2 ?, ]
xQueueGenericCreate 和xQueueGenericCreateStatic

6 y  W1 W6 k4 F2 z
将消息送入队列、从队列中提取消息的函数:
25.jpg
创建队列后,使用 xQueueSend();xQueueReceive();实现发送和接收消息。消息发送和接收操作可以通过队列实现任务间的数据通信;创建队列后,使用 xQueueSend();xQueueReceive();实现发送和接收消息。消息发送和接收操作可以通过队列实现任务间的数据通信;
4 i' A" m3 r. c  B( @( K
试验具体步骤:
9 H2 f+ |2 O# x. C+ W# \
1、继续上一个信号量试验的内容,在main.h中加入队列传递消息的常量定义:
  1. <font face="新宋体" size="3">enum Enum_Language {
    ( v& z: V  d7 p; M. O7 k
  2.     None =0,
    ! T* ~, A3 C4 j2 A5 }, i( b
  3.     English = 1,& Y1 B" S: L7 a2 I7 W/ u
  4.     Deutsch = 2; K& f( S& n' \4 Z+ X3 F5 v
  5. };5 e$ J: t7 C$ h; R3 J
  6. </font>
复制代码
2、main.c中定义队列的数据类型、队列长度等内容
  1. <font face="新宋体" size="3">typedef struct QueueTypedef {
    : L2 o4 s' G4 h
  2.     enum Enum_Language Lanuage;: \$ X. ~- H8 X
  3.     uint32_t ToggleCount;
    6 b- G1 Y9 l( s- q: f+ H% w
  4. } QueueType;
    ! w+ W: @. P  I( t
  5.     #define QUEUE_DEP (5U); A6 f; _/ N* T+ T" y# C" r
  6.     #define QUEUE_LEN sizeof(QueueType)
    ; ]9 p6 @3 ]8 ]6 s& o: a+ \
  7. </font>
复制代码

8 i7 L9 n! f9 e5 k+ T
3、定义消息消费任务:

5 J3 V' W) f4 X; v" ^  E& F) [' Q4 k$ {
接收到消息队列中的消息,根据消息种类,实现不同的信息回复与闪灯提示,判断为英语闪亮LED2,为德语闪亮LED3,根据消息的闪亮次数控制LED灯不同的闪亮次数。
  1. <font face="新宋体" size="3">void vStartLanTogTask(void const * argument);5 U( q$ X, W, a; _9 t+ H
  2. ……1 q: J1 h, p+ R& z9 S& U
  3. . [6 l* ~" @' ^( O( l/ F
  4. void vStartLanTogTask(void const * argument) {
    8 D# a+ F2 S/ X& @; E  S
  5.     QueueType usData;
      z" U9 m  V" w/ w& y$ A
  6.     uint8_t i;
    0 e9 p- q" D7 ?5 l# p
  7.     uint8_t sta = ON;
    % q( ^+ l+ X% `% v# t
  8.     uint16_t delay = 100;
    ( F6 n% \, Y- H+ v0 }" `. ~# L
  9.     const TickType_t xBlockTime = pdMS_TO_TICKS((TickType_t ) 1000);. X6 \9 [- s7 O- M; T3 A0 Q
  10.     for (;;) {3 i, y$ S$ `2 O4 V' Q
  11.       if ( xQueueReceive( xQueue, &usData, xBlockTime ) == pdPASS) {
    & H% S( \9 ^) t: i2 h
  12.           if (usData.Lanuage == English) {- P8 r* P9 Z* u) d
  13.                for (i = 0; i < usData.ToggleCount * 2; i++) {1 F+ p) \9 Y- B! B9 A+ }! ^
  14.                     LED2(sta);
    2 z! \+ j( a' {# J8 i
  15.                     sta = !sta;
    # m9 ?# R$ _0 {' V# }
  16.                     vTaskDelay(delay / portTICK_PERIOD_MS);
    ! F- `' S, L- u% Y8 _+ C1 g
  17.                 }  i: v4 P7 E! C( |! `, E: C
  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");
    , v& g0 [7 i, l( v
  19.          } else if (usData.Lanuage == Deutsch) {
    . i* N& ?; c: j. [9 C( f7 z. N4 [( J
  20.               for (i = 0; i < usData.ToggleCount * 2; i++) {
    ! F; @" d# i5 `. b7 e
  21.                   LED3(sta);
    5 C: G5 P6 e8 [
  22.                   sta = !sta;- E6 O7 V  y: U# Z2 ]4 [$ Y$ C
  23.                   vTaskDelay(delay / portTICK_PERIOD_MS);  N9 T9 p7 x$ O/ @6 J3 g( |5 a
  24.               }  ^8 d6 u+ S% m3 e: d
  25.               printf("Gut: nur attr , nicht adv \n");
    " C( x9 Q, d$ A: l: a, c2 {
  26.           }else{
    % T( d) x9 _) B
  27.               ;/ n' p. T8 n7 O  d+ o
  28.           }
    * B* L: `! y& ~/ `9 f
  29.        }/ v& d4 e  e" ~0 G
  30.     }4 g, z9 T* A+ d  {2 ~. r2 N9 V
  31. }8 E9 r! s& G; ?( `0 G% L( v
  32. ..................</font>
复制代码
4、改造串口消息解析任务,把串口接收到的字符串进行解析,并将解析的内容分解为队列中的不同值
  1. <font face="新宋体" size="3">……1 Z5 B6 {; t- ?: J9 F9 Q
  2.        //解析位Hello,识别为英语,传递消息内容:英语,闪亮LED次数2
    , O. Q% \  W% W
  3.                 strp = strstr((char *) ReceiveInfo, (char *) "Hello");$ \. a/ j  i& U" R, m
  4.                 if (NULL != strp) {
    * u7 u* i) R+ k) \$ G2 A
  5.                         printf("\n Nice to meet you! \n");
    & m0 O! _) Z3 K- ]( A
  6.                         usData.Lanuage = English;
    3 T. b% N) q& S
  7.                         usData.ToggleCount = 2;# X* C) U( i* [! _9 ^2 K
  8.                 };  
    , x/ U$ p& X3 `9 j$ t- J1 K
  9. ………
    - a/ c. F5 s2 K, A$ r0 x/ i6 J, P
  10. //回答guten tag/ guten morgen/ guten abend / guten nacht
    $ n, D' C/ K. F* f7 h0 q
  11. //解析为Guten morgen, 识别为德语,传递消息内容:德语,闪亮LED次数1;/ F7 s7 D: o3 J
  12. //解析为Guten tag, 识别为德语,传递消息内容:德语,闪亮LED次数2;0 @; y' H3 ]8 G( I% S
  13. //解析为Guten abend, 识别为德语,传递消息内容:德语,闪亮LED次数3;2 ]9 S$ U: ]- l- y
  14. //解析为Guten nacht, 识别为德语,传递消息内容:德语,闪亮LED次数4;) P1 l: ?! l& Q5 W7 n+ f
  15.                 strp = strstr((char *) ReceiveInfo, (char *) "Guten");
    / ]) p4 ~% O; m4 p3 h6 ]# b
  16.                 if (NULL != strp) {) w' s* \9 o) z* \" `6 l2 d# o
  17.                         strp1 = strstr((char *) ReceiveInfo, (char *) "morgen");% p0 y1 S1 o$ X/ Q7 L' f
  18.                         if (NULL != strp1) {" S& j9 S% t+ n' r0 D% e" v( j1 m/ R
  19.                                 printf("\n Guten Morgen ! \n");
    : R, [* Y7 n2 y0 u5 G! r
  20.                                 usData.Lanuage = Deutsch;
    " B, C: H. T/ D+ {1 n, `8 K
  21.                                 usData.ToggleCount = 1;8 p% ^  i6 B" T) _( L2 {
  22.                         }
    ! [! D* H4 I* c$ R
  23.                         strp1 = strstr((char *) ReceiveInfo, (char *) "tag");
    8 I/ o4 S# d+ u% |5 {/ U- q6 v
  24.                         if (NULL != strp1) {
    ; B$ F4 ]1 d3 r% X0 i% i! w
  25.                                 printf("\n Guten Tag ! \n");
    7 p- a2 w# ^# X7 S0 p* W5 j
  26.                                 usData.Lanuage = Deutsch;+ |( e% B1 J! Z# q
  27.                                 usData.ToggleCount = 2;3 C" t7 w& o" e1 o. J* L
  28.                         }- [. V) s# P9 U+ T  H
  29.                         strp1 = strstr((char *) ReceiveInfo, (char *) "abend");
    2 U) c$ R* q3 s$ m- @* M
  30.                         if (NULL != strp1) {& S! z& t/ i: f: ]) t
  31.                                 printf("\n Guten Abend ! \n");
    & E% [. t: w0 p5 Q! R
  32.                                 usData.Lanuage = Deutsch;3 |) u0 M5 k/ a7 d. w4 A# Y- P
  33.                                 usData.ToggleCount = 3;
    7 E$ L- r% h9 y' L8 Y+ Z7 {
  34.                         }
    / L% u0 g0 n7 s0 W* R. K
  35.                         strp1 = strstr((char *) ReceiveInfo, (char *) "nacht");
    7 K3 Q4 T- c8 [; k7 Q8 ^
  36.                         if (NULL != strp1) {
    9 {$ F' E0 m3 ?& _
  37.                                 printf("\n Gute Nacht ! die Nacht \n");
    1 |3 M& ^9 @9 q" S7 n+ Z6 p
  38.                                 usData.Lanuage = Deutsch;
    & `, C2 Y' M' g/ z
  39.                                 usData.ToggleCount = 4;
    - _/ b, w# {; J2 O. C, ^2 G
  40.                         }
    ; T- B6 ?* K- Y9 e! T: B
  41.                 }6 q4 V( @% Y0 i
  42. ……0 N& b) k+ P* R6 U' q
  43. $ ^/ n* c& p/ }1 u, k& u7 d
  44. </font>
复制代码
5、在main函数中创建队列、创建消费者任务
  1. <font face="新宋体" size="3">……; \( y3 C/ A) \- y1 O, m
  2.         xTaskCreate((TaskFunction_t) vStartLanTogTask, //任务函数
    0 Z& j0 V  S5 Z) X
  3.                   "LanTog",                                   //任务名称- [5 o/ S* ]0 Y% R+ n% R
  4.                   200,                                       //任务栈大小1 C0 Z  @, k# o$ Y
  5.                   NULL,                                     //任务函数参数, C9 t( Q1 Q; @5 J9 T2 k+ D# i( F
  6.                   Start_TASK_PRIORITY,                      //任务执行等级
    6 |' s/ F+ g( B' o4 g
  7.                    (TaskHandle_t *) NULL);                //任务句柄
    # M5 X# }: m0 r% C, {' f( r
  8. xQueue = xQueueCreate(QUEUE_DEP, QUEUE_LEN);
    % v0 u5 b) l  S1 ~; j
  9. ……. M1 I2 u7 {' V  M
  10. </font>
复制代码
/ j9 @5 Z# [! H
编译下载代码到开发板中,在串口工具中键入以下内容:
; _# C  X/ w% \+ Z
Hello、Guten morgen、Guten tag、Guten abend、Guten nacht
2 C7 X8 `7 _- J0 Z5 c
串口显示如下:
# H  {* L, w5 |9 ]
26.jpg
0 A* w/ s3 ?4 P& d' S2 e' d4 b
输入 Hello后,蓝灯闪亮2次
27.jpg

  p" [. p0 D5 y6 e! X% @3 f
5 Y4 Q6 B! d) p1 }/ h+ n6 t( s  z
输入:Guten morgen、Guten tag、Guten abend、Guten nacht后,红灯分别闪亮1、2、3、4次
28.jpg
/ k6 s/ U6 C2 y9 G# V: \! l
8 x9 H5 P# [/ ?5 u3 `* F
8 Y* m! ?( O$ N$ s2 T

6 o2 E: n2 @( h) f7 ]
; ~+ Y" J  B$ E5 v0 a, l
收藏 评论0 发布时间:2018-5-17 22:44

举报

0个回答

所属标签

相似分享

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