野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 4387|回复: 7

FREE RTOS有没有非阻塞的任务通信

[复制链接]
发表于 2019-8-7 10:54:27 | 显示全部楼层 |阅读模式
FREE RTOS的事件通信是阻塞的,有没有非阻塞的任务通信方式,例如一个LCD页面中,要动态刷新传感器数据,而且还需要接收按键扫描任务的按键事件,怎么办?
如果LCD页面在读取按键事件阻塞了,那么传感器刷新就会受到影响吧


这种大家是如何处理的呢?
回复

使用道具 举报

发表于 2019-8-7 19:51:30 | 显示全部楼层
lcd阻塞时间短,基本没什么影响,传感器数据也不需要ms级别的精度要求
回复 支持 反对

使用道具 举报

发表于 2019-8-7 21:01:32 | 显示全部楼层
你用多个事件信号不久好了。。收到任意一个信号退出阻塞。。然后根据收到的信号。。做处理不就完事了,。。
回复 支持 反对

使用道具 举报

发表于 2019-11-9 18:22:56 | 显示全部楼层
用事件标志组啊,等待多个信号量,(不管是二值信号量,还是队列)都可用事件标志组,队列麻烦点,事件组接收时不要清空事件,而是计数队列中所有消息都没了再清空事件
回复 支持 反对

使用道具 举报

发表于 2020-1-2 17:18:52 | 显示全部楼层
xTicksToWait 设置为0 ,
回复 支持 反对

使用道具 举报

发表于 2020-1-17 11:43:20 | 显示全部楼层
兄弟,你的想法就不对,既然想使用FREERTOS编程,就要摒弃前后台编程的思路。通过你的提问可以看出,你还是站在前后台编程的角度思考问题
回复 支持 反对

使用道具 举报

发表于 2020-1-17 12:47:07 | 显示全部楼层
例如一个LCD页面中,要动态刷新传感器数据,而且还需要接收按键扫描任务的按键事件,怎么办?
如果LCD页面在读取按键事件阻塞了,那么传感器刷新就会受到影响吧

    一、设计3个任务
    任务1:LCD页面刷新任务,优先级最低
    任务2:按键任务,周期性执行,优先级居中
    任务3:传感器采集任务,优先级最高
    二、任务类型
    任务1,LCD页面刷新任务是一个等待消息队列的任务
    任务2,按钮扫描任务是一个周期性执行的任务
    任务3,传感器采集任务是一个等待中服服务程序释放信号量的任务。

   三、规划任务间通过消息队列传递消息的自定义协议
         消息队列定义如下:
              MSG[0] = 1 --- 表示是按键任务给LCD任务发送的消息队列
                         MSG[1] = 1 表示按键码1
                         MSG[1] = 2 表示按键码2
                         MSG[1] = 3 表示按键码3
              MSG[0] = 2 --- 表示是采集任务给LCD任务发送的消息队列
                         MSG[1] = 采集任务传输的采样数据1
                         MSG[2] = 采集任务传输的采样数据2
                         MSG[3] = 采集任务传输的采样数据3
                         MSG[4] = 采集任务传输的采样数据4
                         MSG[5] = 采集任务传输的采样数据5
     四、任务大致代码

              1、采样中断服务程序
                        发送信号量,同步采样任务

              2、采样任务
                      while (1)
                      {
                              等待中断服务程序释放的信号量
                              if (接收信号量成功)
                              {
                                    处理采样数据
                                    填写消息队列,格式如下:
                                            MSG[0] = 2 --- 表示是采集任务给LCD任务发送的消息队列
                                            MSG[1] = 采集任务传输的采样数据1
                                            MSG[2] = 采集任务传输的采样数据2
                                            MSG[3] = 采集任务传输的采样数据3
                                            MSG[4] = 采集任务传输的采样数据4
                                            MSG[5] = 采集任务传输的采样数据5
                                    发送消息队列
                      }


            3、按键任务
                      while (1)
                      {
                              检测按键
                              if (检测到按键按下)
                                  延时节拍20毫秒,用于防抖动
                               再次检测按键
                              if (检测到按键按下)
                               {
                                    填写消息队列,格式如下:
                                            MSG[0] = 1 --- 表示是按键任务给LCD任务发送的消息队列
                                            MSG[1] = 按键码
                                     发送消息队列
                                }
                               延时节拍100毫秒
                      }


            4、LCD任务
                       
                    while (1)
                    {
                            等待消息队列
                            if (接收消息队列成功)
                            {
                                 从消息队列取出数据到MMS
                                 switch (MMS[0])
                                 {
                                     case 1:     --->  收到按键码
                                          取出按键码MMS[1];
                                          按键处理;
                                          break;
                                      case 2:    --->  收到采样数据
                                          采样数据MMS[1]---MMS[5]显示到LCD
                                          break;
                                }
                             }
                    }


    总结:
          (1)、采样中断服务程序按照一定的周期给采样任务发信号量,采样任务收到信号量立即将采样数据通过消息队列传递给LCD任务,即实现了动态刷新采样数据的要求。
          (2)、按键任务只有检测到按键被按下才会给LCD任务发送消息队列。  
          (3)、当多个任务给某一个任务发送消息队列传递数值时,必须自定义消息队列的格式,用来区分到底是哪个任务的消息队列数据。
                  上面的规划中 MSG[0]=1 ,代表按键任务发送的消息队列数据
                               MSG[0]=2,代表采样 任务发送的消息队列数据

           唉!所有的论坛和网页都没有这方面的介绍,都只是介绍了最简单的应用,而没有介绍复杂的应用,让习惯了前后台编程的程序员真的很难真正领会和跨入FREERTOS编程大门呀!
回复 支持 反对

使用道具 举报

发表于 2020-2-3 22:43:18 | 显示全部楼层
我的项目也用到这方面的知识,最近正在努力中,系统通讯LCD,
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-21 20:24 , Processed in 0.030604 second(s), 23 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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