野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4689|回复: 4

[freertos] 请教一个freertos任务状态切换问题?

[复制链接]
发表于 2019-10-23 15:02:31 | 显示全部楼层 |阅读模式
我有一个液晶屏显示任务,平时的时候显示温度和湿度,每隔3s切换一次温湿度的显示;但中途我想显示其他内容,比如按键后显示“KEY...”,接收到串口数据后显示“USART RECIV...”。我只想用一个任务来实现,可以实现吗?
回复

使用道具 举报

发表于 2019-10-23 18:42:48 | 显示全部楼层
学习下教程里面消息队列和后面一点的部分应该有头绪的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-10-24 14:13:13 | 显示全部楼层
WishWish 发表于 2019-10-23 18:42
学习下教程里面消息队列和后面一点的部分应该有头绪的

嗯嗯,多谢,一语惊醒梦中人,我大概知道了
回复 支持 反对

使用道具 举报

发表于 2020-1-21 09:48:17 | 显示全部楼层
肯定要用一个任务进行设计的呀!
  
    否则就会面临函数重入的问题。为什么这么说呀!如果你定义2个任务,有可能在任务1中调用函数A(显示子函数),有可能在任务2中调用函数A(显示子函数),这就需要考虑函数A的重入问题。

     常规任务设计方案:
           (1)、设计1个显示任务
           (2)、设计1个按键采样任务
           (3)、设计1个温度采样任务
   
    通信:
            (1)、按键采样任采集到按键后,给显示任务发送消息队列
            (2)、温度采样任务采集到温度后给显示任务发送消息队列
            (3)、显示任务等待消息队列
   显示任务如何知道数据是来自于按键采集任务发送的还是温度采样任务发送的呢?为此自定义消息队列格式如下:

            MSG[0] = 1 ---> 表示是按键任务发送的消息
                MSG[1] = 按键码
           MSG[0] = 2  --->表示是温度采样任务发送的消息
                MSG[1] = 温度1
                MSG[2] = 温度2



回复 支持 反对

使用道具 举报

发表于 2020-1-21 09:59:26 | 显示全部楼层


void TASK_KEY(void)   --->按键采集任务
  {
      uint8_t Buffer[10];

      while (1)
     {
            读按键按;
            if (读到按键)
               vTaskDelay(20 / portTICK_RATE_MS);  //延时节拍20毫秒,去抖动
            再次读取按键
            
            if (读到按键)
            {              
               填写消息队列格式
                  Buffer[0] = 1 ; //----------表示按键任务
                  Buffer[1] = 按键码;
                xQueueSend(xQueue, (void *) &Buffer , portMAX_DELAY);
             }  
      }  



  void TASK_AD(void)   --->采样任务
  {
      uint8_t Buffer[10];

      while (1)
     {
            采样;
            填写消息队列格式
                 Buffer[0] = 2 ; //----------表示采样任务
                 Buffer[1] = 温度1;
                 Buffer[2] = 温度2;
            xQueueSend(xQueue, (void *) &Buffer , portMAX_DELAY);   
      }  


  void TASK_DISP(void) --->显示任务
  {
        BaseType_t xStatus;       
        uint8_t disp_buffer[10];

      while (1)
      {
                xStatus = xQueueReceive( xQueue, &disp_buffer,  portMAX_DELAY );
                if( xStatus == pdPASS )
                                {                       
                switch (disp_buffer[0])
                {
                        case 1:
                           从disp_buffer[1]中取出按键码并显示
                           break;
                        case 2:
                           从disp_buffer[1]中取出温度1;
                           从disp_buffer[2]中取出温度2;
                           显示温度
                           break;

                }                                       
         
       }      
   }
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-21 23:28 , Processed in 0.051447 second(s), 25 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表