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

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

[复制链接]
wolfgang2015 发布时间:2018-5-17 22:44
本帖最后由 wolfgang2015 于 2018-5-17 22:49 编辑

队列的使用,试验的内容如下图:
23.jpg
队列的创建、使用以下函数创建队列。
24.jpg
xQueueCreate 使用宏 调用 xQueueGenericCreate
    xQueueCreate  与xQueueCreateStatic,调用宏受以下的配置参数影响
configSUPPORT_DYNAMIC_ALLOCATION,configSUPPORT_STATIC_ALLOCATION
参数不同调用的实体也不同:

xQueueGenericCreate 和xQueueGenericCreateStatic

将消息送入队列、从队列中提取消息的函数:
25.jpg
创建队列后,使用 xQueueSend();xQueueReceive();实现发送和接收消息。消息发送和接收操作可以通过队列实现任务间的数据通信;创建队列后,使用 xQueueSend();xQueueReceive();实现发送和接收消息。消息发送和接收操作可以通过队列实现任务间的数据通信;

试验具体步骤:

1、继续上一个信号量试验的内容,在main.h中加入队列传递消息的常量定义:
  1. <font face="新宋体" size="3">enum Enum_Language {
  2.     None =0,
  3.     English = 1,
  4.     Deutsch = 2
  5. };
  6. </font>
复制代码
2、main.c中定义队列的数据类型、队列长度等内容
  1. <font face="新宋体" size="3">typedef struct QueueTypedef {
  2.     enum Enum_Language Lanuage;
  3.     uint32_t ToggleCount;
  4. } QueueType;
  5.     #define QUEUE_DEP (5U)
  6.     #define QUEUE_LEN sizeof(QueueType)
  7. </font>
复制代码

3、定义消息消费任务:

接收到消息队列中的消息,根据消息种类,实现不同的信息回复与闪灯提示,判断为英语闪亮LED2,为德语闪亮LED3,根据消息的闪亮次数控制LED灯不同的闪亮次数。
  1. <font face="新宋体" size="3">void vStartLanTogTask(void const * argument);
  2. ……

  3. void vStartLanTogTask(void const * argument) {
  4.     QueueType usData;
  5.     uint8_t i;
  6.     uint8_t sta = ON;
  7.     uint16_t delay = 100;
  8.     const TickType_t xBlockTime = pdMS_TO_TICKS((TickType_t ) 1000);
  9.     for (;;) {
  10.       if ( xQueueReceive( xQueue, &usData, xBlockTime ) == pdPASS) {
  11.           if (usData.Lanuage == English) {
  12.                for (i = 0; i < usData.ToggleCount * 2; i++) {
  13.                     LED2(sta);
  14.                     sta = !sta;
  15.                     vTaskDelay(delay / portTICK_PERIOD_MS);
  16.                 }
  17.                 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");
  18.          } else if (usData.Lanuage == Deutsch) {
  19.               for (i = 0; i < usData.ToggleCount * 2; i++) {
  20.                   LED3(sta);
  21.                   sta = !sta;
  22.                   vTaskDelay(delay / portTICK_PERIOD_MS);
  23.               }
  24.               printf("Gut: nur attr , nicht adv \n");
  25.           }else{
  26.               ;
  27.           }
  28.        }
  29.     }
  30. }
  31. ..................</font>
复制代码
4、改造串口消息解析任务,把串口接收到的字符串进行解析,并将解析的内容分解为队列中的不同值
  1. <font face="新宋体" size="3">……
  2.        //解析位Hello,识别为英语,传递消息内容:英语,闪亮LED次数2
  3.                 strp = strstr((char *) ReceiveInfo, (char *) "Hello");
  4.                 if (NULL != strp) {
  5.                         printf("\n Nice to meet you! \n");
  6.                         usData.Lanuage = English;
  7.                         usData.ToggleCount = 2;
  8.                 };  
  9. ………
  10. //回答guten tag/ guten morgen/ guten abend / guten nacht
  11. //解析为Guten morgen, 识别为德语,传递消息内容:德语,闪亮LED次数1;
  12. //解析为Guten tag, 识别为德语,传递消息内容:德语,闪亮LED次数2;
  13. //解析为Guten abend, 识别为德语,传递消息内容:德语,闪亮LED次数3;
  14. //解析为Guten nacht, 识别为德语,传递消息内容:德语,闪亮LED次数4;
  15.                 strp = strstr((char *) ReceiveInfo, (char *) "Guten");
  16.                 if (NULL != strp) {
  17.                         strp1 = strstr((char *) ReceiveInfo, (char *) "morgen");
  18.                         if (NULL != strp1) {
  19.                                 printf("\n Guten Morgen ! \n");
  20.                                 usData.Lanuage = Deutsch;
  21.                                 usData.ToggleCount = 1;
  22.                         }
  23.                         strp1 = strstr((char *) ReceiveInfo, (char *) "tag");
  24.                         if (NULL != strp1) {
  25.                                 printf("\n Guten Tag ! \n");
  26.                                 usData.Lanuage = Deutsch;
  27.                                 usData.ToggleCount = 2;
  28.                         }
  29.                         strp1 = strstr((char *) ReceiveInfo, (char *) "abend");
  30.                         if (NULL != strp1) {
  31.                                 printf("\n Guten Abend ! \n");
  32.                                 usData.Lanuage = Deutsch;
  33.                                 usData.ToggleCount = 3;
  34.                         }
  35.                         strp1 = strstr((char *) ReceiveInfo, (char *) "nacht");
  36.                         if (NULL != strp1) {
  37.                                 printf("\n Gute Nacht ! die Nacht \n");
  38.                                 usData.Lanuage = Deutsch;
  39.                                 usData.ToggleCount = 4;
  40.                         }
  41.                 }
  42. ……

  43. </font>
复制代码
5、在main函数中创建队列、创建消费者任务
  1. <font face="新宋体" size="3">……
  2.         xTaskCreate((TaskFunction_t) vStartLanTogTask, //任务函数
  3.                   "LanTog",                                   //任务名称
  4.                   200,                                       //任务栈大小
  5.                   NULL,                                     //任务函数参数
  6.                   Start_TASK_PRIORITY,                      //任务执行等级
  7.                    (TaskHandle_t *) NULL);                //任务句柄
  8. xQueue = xQueueCreate(QUEUE_DEP, QUEUE_LEN);
  9. ……
  10. </font>
复制代码

编译下载代码到开发板中,在串口工具中键入以下内容:

Hello、Guten morgen、Guten tag、Guten abend、Guten nacht

串口显示如下:

26.jpg

输入 Hello后,蓝灯闪亮2次
27.jpg


输入:Guten morgen、Guten tag、Guten abend、Guten nacht后,红灯分别闪亮1、2、3、4次
28.jpg





收藏 评论0 发布时间:2018-5-17 22:44

举报

0个回答

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版