本帖最后由 wolfgang2015 于 2018-5-17 22:49 编辑
. P5 y. {, x5 A' x, S3 {5 d" w! q3 ~
队列的使用,试验的内容如下图: 队列的创建、使用以下函数创建队列。 xQueueCreate 使用宏 调用 xQueueGenericCreate xQueueCreate 与xQueueCreateStatic,调用宏受以下的配置参数影响 configSUPPORT_DYNAMIC_ALLOCATION,configSUPPORT_STATIC_ALLOCATION 参数不同调用的实体也不同:
4 L5 ^6 o* ]: u2 Z# n7 yxQueueGenericCreate 和xQueueGenericCreateStatic 0 {1 R7 p. k% y$ y9 E
将消息送入队列、从队列中提取消息的函数: 创建队列后,使用 xQueueSend();xQueueReceive();实现发送和接收消息。消息发送和接收操作可以通过队列实现任务间的数据通信;创建队列后,使用 xQueueSend();xQueueReceive();实现发送和接收消息。消息发送和接收操作可以通过队列实现任务间的数据通信;
/ ^/ w9 L, c8 ]8 F" q4 D8 q) o试验具体步骤: ' `. _1 h) w/ [" D2 l3 o
1、继续上一个信号量试验的内容,在main.h中加入队列传递消息的常量定义: - <font face="新宋体" size="3">enum Enum_Language {9 X/ w, G4 B4 h
- None =0,
. k# \- E, I" b# K T, U/ v- V - English = 1,
* I; ~5 K3 V' ^0 m: ?/ E - Deutsch = 2
5 h" O) U( [% B( Z/ V& W - };
6 \5 {. z4 }7 ~ L7 k: ] - </font>
复制代码2、main.c中定义队列的数据类型、队列长度等内容 - <font face="新宋体" size="3">typedef struct QueueTypedef {! w E8 `8 A- s1 ^: @4 U
- enum Enum_Language Lanuage;
s3 p0 v% g0 i) [ - uint32_t ToggleCount;; k" D2 e5 L; e% q3 a. u) Y
- } QueueType;# [: p( l0 t C9 w) V
- #define QUEUE_DEP (5U)
1 ]9 ]$ e% N6 U9 g- W - #define QUEUE_LEN sizeof(QueueType): s6 c% p& e3 D @* P* u6 B3 d
- </font>
复制代码
( \$ M2 D( W/ |5 k( m1 _* z3、定义消息消费任务:
/ h1 d S q" e. G1 x8 A 接收到消息队列中的消息,根据消息种类,实现不同的信息回复与闪灯提示,判断为英语闪亮LED2,为德语闪亮LED3,根据消息的闪亮次数控制LED灯不同的闪亮次数。 - <font face="新宋体" size="3">void vStartLanTogTask(void const * argument);
$ H2 @. \" \; d! @ @: o+ n - ……
: Y; n2 X4 U' K7 I+ u: a
6 `- K: M: y* ~' [- void vStartLanTogTask(void const * argument) {
) O9 s3 y9 B9 D - QueueType usData;& g9 g# z% D) N
- uint8_t i;
1 `+ @; D. Z) Q- p( B - uint8_t sta = ON;
$ D( d9 X G8 P) ^ - uint16_t delay = 100;
7 q9 _# l: W( p- u- d - const TickType_t xBlockTime = pdMS_TO_TICKS((TickType_t ) 1000);
8 x0 Q; |$ l' i - for (;;) {# r# J! C. r9 S. y1 M
- if ( xQueueReceive( xQueue, &usData, xBlockTime ) == pdPASS) {
2 F9 i6 _; w3 g1 a% d% ]3 m# X8 n - if (usData.Lanuage == English) {0 S) V- t5 R* J. e9 S! V
- for (i = 0; i < usData.ToggleCount * 2; i++) {: U$ u- s& ?) n4 `7 A4 z) A* q
- LED2(sta);
3 ^8 q1 V, |7 \9 f6 l; y - sta = !sta;, Q# k+ c- p# Z" c, K* y' [
- vTaskDelay(delay / portTICK_PERIOD_MS);
1 ?* t* e1 e$ o" N4 ? - }
8 k9 ?3 z! Z* Q - 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 - } else if (usData.Lanuage == Deutsch) {: M" K B s1 U2 g( p9 j$ }4 J
- for (i = 0; i < usData.ToggleCount * 2; i++) {
' }( ]4 T; e" B( h9 q9 r - LED3(sta);9 u# u' v5 @7 D. v _# v3 m1 o$ `
- sta = !sta;. @+ G" M; \3 Y/ z$ ?' p
- vTaskDelay(delay / portTICK_PERIOD_MS);) K/ b( [- V. W* _! N7 q7 U
- }; C7 B, j8 r3 N! X
- printf("Gut: nur attr , nicht adv \n");+ d6 i6 x& P* \5 E6 @. D
- }else{5 J8 \4 A0 q C1 O1 e2 \# @% R
- ;$ t3 A& e- o6 R5 Z9 u' C9 }
- }
8 U2 V4 A, ~! w - }" Z, [# W& H3 E2 ^1 W1 ]$ d
- }- I9 e( T& f* Q+ v% F: c
- }
5 N! y3 l9 U6 y* h$ |4 Q8 B; K - ..................</font>
复制代码4、改造串口消息解析任务,把串口接收到的字符串进行解析,并将解析的内容分解为队列中的不同值 - <font face="新宋体" size="3">……
' p& [+ M$ u* W0 y' U3 o - //解析位Hello,识别为英语,传递消息内容:英语,闪亮LED次数2
6 i, j$ L1 t0 ?0 h! y; S - strp = strstr((char *) ReceiveInfo, (char *) "Hello");* F8 q2 D3 `3 V0 c) m1 m) B
- if (NULL != strp) {
+ G5 X$ }% @. Y/ k2 ^6 w8 f - printf("\n Nice to meet you! \n");
- {8 r6 e, k# T) G Z4 i. C p - usData.Lanuage = English;
; s; n5 d; t3 G - usData.ToggleCount = 2;; v' }' D, \4 K$ l% A$ w1 I
- };
V9 `+ _% D% u1 e' {( a - ……… 9 c! R! @1 A% R" A/ Y: {
- //回答guten tag/ guten morgen/ guten abend / guten nacht
3 F9 J9 ^8 s! @. a7 a. s - //解析为Guten morgen, 识别为德语,传递消息内容:德语,闪亮LED次数1;9 n% l$ Q4 o: w* U
- //解析为Guten tag, 识别为德语,传递消息内容:德语,闪亮LED次数2;" |( |7 x [: U( Q8 b' @# P
- //解析为Guten abend, 识别为德语,传递消息内容:德语,闪亮LED次数3;
9 \5 `4 U& J1 n! E% T5 @, L3 u3 Q, w - //解析为Guten nacht, 识别为德语,传递消息内容:德语,闪亮LED次数4;" i5 o+ ^9 h# [& s
- strp = strstr((char *) ReceiveInfo, (char *) "Guten");6 }" M1 X4 Y2 M* D0 J# T
- if (NULL != strp) {
2 c7 N6 r2 W& ^- ?4 g8 L - strp1 = strstr((char *) ReceiveInfo, (char *) "morgen");$ h3 g! P6 K9 K
- if (NULL != strp1) {
' X0 Q& g! @& O - printf("\n Guten Morgen ! \n");
# [ Y( e3 m2 e0 ~ - usData.Lanuage = Deutsch; B' o$ h. @# U
- usData.ToggleCount = 1;
$ B. q9 r4 y5 T3 j$ l3 z8 u - }, Z+ P+ t: ~& K d3 h: ]
- strp1 = strstr((char *) ReceiveInfo, (char *) "tag");9 n8 k4 i, g3 a }
- if (NULL != strp1) {9 x+ R4 T6 H. Z
- printf("\n Guten Tag ! \n");2 s' @; \2 [, a8 f+ Y6 M
- usData.Lanuage = Deutsch;
" X- k* w, `. R# O8 K* [( r7 v - usData.ToggleCount = 2; v* {: U5 R1 j# [ a
- }2 a7 T+ f3 d8 ~* Q+ y, ?
- strp1 = strstr((char *) ReceiveInfo, (char *) "abend");
+ ~# `3 i, `# V5 E. k' T( z% k - if (NULL != strp1) {0 ^3 v1 x$ h* p' k
- printf("\n Guten Abend ! \n");
! p8 c2 T4 ~4 N A3 {8 U - usData.Lanuage = Deutsch;
. u! g& H- U' E. C* ]- _5 | - usData.ToggleCount = 3;& f; g# D5 [1 j& V: c( |
- }- l7 y6 W1 x& a$ _) O9 ~! B; N( H, }4 f
- strp1 = strstr((char *) ReceiveInfo, (char *) "nacht");
1 @4 B" h( Y+ y/ e3 Z7 F - if (NULL != strp1) {
: ~0 Q3 [; i/ w' E - printf("\n Gute Nacht ! die Nacht \n");
6 x5 I: @. e1 t. v& { n9 V+ @ - usData.Lanuage = Deutsch;
8 u9 v, }+ B7 h - usData.ToggleCount = 4;' S2 }: _9 |- c$ |1 W! [8 I
- }* c8 [5 l) z& P K( j. h9 k
- }
" t$ T) O0 E3 r" p2 W - ……
/ n/ P6 Q r! `: R5 n. f& G
1 {0 h# o6 r$ s- </font>
复制代码5、在main函数中创建队列、创建消费者任务 - <font face="新宋体" size="3">……$ O h% J3 J. K9 y. \9 t& m/ ^
- xTaskCreate((TaskFunction_t) vStartLanTogTask, //任务函数/ h* V |9 Z- `: A3 H& H4 w1 G
- "LanTog", //任务名称( y& G8 Z( \4 k( D1 ]1 r( ]) l
- 200, //任务栈大小3 N$ D2 t! H: |$ P
- NULL, //任务函数参数 H4 H' p: p) R: a- [
- Start_TASK_PRIORITY, //任务执行等级
) c% U$ }0 G, A - (TaskHandle_t *) NULL); //任务句柄" L8 F- J$ t. x5 ^
- xQueue = xQueueCreate(QUEUE_DEP, QUEUE_LEN);9 }8 j( ]% g+ o& r: |% t$ {
- ……
" I, h! n+ h) ^) G- [* J - </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
' M; n. E4 \ H) l" m) O
输入 Hello后,蓝灯闪亮2次
" 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次 7 i" ~; O* @# y! q. [# }
4 [0 F U$ G X1 |0 P( ~. q t
* p0 z% d- c( }# w0 D1 ?8 T
1 ?6 I' i' @) k2 V' q3 w" y& N+ Y* z
" B& f" i2 |0 J7 s( C+ Y- j
0 Z; N8 b4 b) u9 J4 d2 x3 M
|