本帖最后由 wolfgang2015 于 2018-5-17 22:49 编辑
队列的使用,试验的内容如下图: 队列的创建、使用以下函数创建队列。 xQueueCreate 使用宏 调用 xQueueGenericCreate xQueueCreate 与xQueueCreateStatic,调用宏受以下的配置参数影响 configSUPPORT_DYNAMIC_ALLOCATION,configSUPPORT_STATIC_ALLOCATION 参数不同调用的实体也不同:
xQueueGenericCreate 和xQueueGenericCreateStatic
将消息送入队列、从队列中提取消息的函数: 创建队列后,使用 xQueueSend();xQueueReceive();实现发送和接收消息。消息发送和接收操作可以通过队列实现任务间的数据通信;创建队列后,使用 xQueueSend();xQueueReceive();实现发送和接收消息。消息发送和接收操作可以通过队列实现任务间的数据通信;
试验具体步骤:
1、继续上一个信号量试验的内容,在main.h中加入队列传递消息的常量定义: - <font face="新宋体" size="3">enum Enum_Language {
- None =0,
- English = 1,
- Deutsch = 2
- };
- </font>
复制代码2、main.c中定义队列的数据类型、队列长度等内容 - <font face="新宋体" size="3">typedef struct QueueTypedef {
- enum Enum_Language Lanuage;
- uint32_t ToggleCount;
- } QueueType;
- #define QUEUE_DEP (5U)
- #define QUEUE_LEN sizeof(QueueType)
- </font>
复制代码
3、定义消息消费任务:
接收到消息队列中的消息,根据消息种类,实现不同的信息回复与闪灯提示,判断为英语闪亮LED2,为德语闪亮LED3,根据消息的闪亮次数控制LED灯不同的闪亮次数。 - <font face="新宋体" size="3">void vStartLanTogTask(void const * argument);
- ……
- void vStartLanTogTask(void const * argument) {
- QueueType usData;
- uint8_t i;
- uint8_t sta = ON;
- uint16_t delay = 100;
- const TickType_t xBlockTime = pdMS_TO_TICKS((TickType_t ) 1000);
- for (;;) {
- if ( xQueueReceive( xQueue, &usData, xBlockTime ) == pdPASS) {
- if (usData.Lanuage == English) {
- for (i = 0; i < usData.ToggleCount * 2; i++) {
- LED2(sta);
- sta = !sta;
- vTaskDelay(delay / portTICK_PERIOD_MS);
- }
- 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");
- } else if (usData.Lanuage == Deutsch) {
- for (i = 0; i < usData.ToggleCount * 2; i++) {
- LED3(sta);
- sta = !sta;
- vTaskDelay(delay / portTICK_PERIOD_MS);
- }
- printf("Gut: nur attr , nicht adv \n");
- }else{
- ;
- }
- }
- }
- }
- ..................</font>
复制代码4、改造串口消息解析任务,把串口接收到的字符串进行解析,并将解析的内容分解为队列中的不同值 - <font face="新宋体" size="3">……
- //解析位Hello,识别为英语,传递消息内容:英语,闪亮LED次数2
- strp = strstr((char *) ReceiveInfo, (char *) "Hello");
- if (NULL != strp) {
- printf("\n Nice to meet you! \n");
- usData.Lanuage = English;
- usData.ToggleCount = 2;
- };
- ………
- //回答guten tag/ guten morgen/ guten abend / guten nacht
- //解析为Guten morgen, 识别为德语,传递消息内容:德语,闪亮LED次数1;
- //解析为Guten tag, 识别为德语,传递消息内容:德语,闪亮LED次数2;
- //解析为Guten abend, 识别为德语,传递消息内容:德语,闪亮LED次数3;
- //解析为Guten nacht, 识别为德语,传递消息内容:德语,闪亮LED次数4;
- strp = strstr((char *) ReceiveInfo, (char *) "Guten");
- if (NULL != strp) {
- strp1 = strstr((char *) ReceiveInfo, (char *) "morgen");
- if (NULL != strp1) {
- printf("\n Guten Morgen ! \n");
- usData.Lanuage = Deutsch;
- usData.ToggleCount = 1;
- }
- strp1 = strstr((char *) ReceiveInfo, (char *) "tag");
- if (NULL != strp1) {
- printf("\n Guten Tag ! \n");
- usData.Lanuage = Deutsch;
- usData.ToggleCount = 2;
- }
- strp1 = strstr((char *) ReceiveInfo, (char *) "abend");
- if (NULL != strp1) {
- printf("\n Guten Abend ! \n");
- usData.Lanuage = Deutsch;
- usData.ToggleCount = 3;
- }
- strp1 = strstr((char *) ReceiveInfo, (char *) "nacht");
- if (NULL != strp1) {
- printf("\n Gute Nacht ! die Nacht \n");
- usData.Lanuage = Deutsch;
- usData.ToggleCount = 4;
- }
- }
- ……
- </font>
复制代码5、在main函数中创建队列、创建消费者任务 - <font face="新宋体" size="3">……
- xTaskCreate((TaskFunction_t) vStartLanTogTask, //任务函数
- "LanTog", //任务名称
- 200, //任务栈大小
- NULL, //任务函数参数
- Start_TASK_PRIORITY, //任务执行等级
- (TaskHandle_t *) NULL); //任务句柄
- xQueue = xQueueCreate(QUEUE_DEP, QUEUE_LEN);
- ……
- </font>
复制代码
编译下载代码到开发板中,在串口工具中键入以下内容:
Hello、Guten morgen、Guten tag、Guten abend、Guten nacht
串口显示如下:
输入 Hello后,蓝灯闪亮2次
输入:Guten morgen、Guten tag、Guten abend、Guten nacht后,红灯分别闪亮1、2、3、4次
|