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