OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 7084|回复: 13

关于RTOS任务如何划分的问题

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
16
金钱
16
注册时间
2019-4-1
在线时间
5 小时
发表于 2019-4-1 15:47:44 | 显示全部楼层 |阅读模式
1金钱
萌新一个,对freertos的认识还不深,我比较疑惑该如何划分任务,在这方面没有正确的认识。有大神讲解一下么?
比如我的设计有以下几个功能:
1.电流电压采样,通过采样128次的瞬时值,计算有效值、功率因数、电量等等
2.远程通信,把计算结果发送到平台,设计发送登录码的登录,发送计算的结果等到
3.接收解析,接收数据,比如登录成功、登录失败,控制指令等等
4.反复闪烁指示灯

对于这么一个简单的采样、计算、上传、接收功能,该怎么来划分任务呢?
采样初始化任务:初始化采样功能
采样任务:就是每次采样
计算任务:采样次数达到后,进行计算
串口配置任务:串口初始化
发送任务:发送任意内容的函数,发送内容通过参数来传递
接收任务:读取收到的数据
解析任务:类似modbus通信时的解析,分析收到的数据是登录成功,还是其他的指令
指示灯任务:切换亮灭

如果是按照以上划分,感觉任务的划分跟函数的划分类似,初始化函数、计算函数、发送函数、接收函数、解析函数等等
但是我感觉事实上应该不是这样划分的。




正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

153

主题

310

帖子

0

精华

高级会员

Rank: 4

积分
673
金钱
673
注册时间
2019-3-26
在线时间
18 小时
发表于 2019-4-1 17:38:42 | 显示全部楼层
http://www.iis7.com/c/90/
回复

使用道具 举报

0

主题

20

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2017-11-2
在线时间
10 小时
发表于 2021-12-14 17:41:37 | 显示全部楼层
关注下,刚开始学RTOS
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2021-12-14 22:32:12 | 显示全部楼层
初始化什么的,这种一次性操作,根本不用单独创建任务。。。
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2021-1-16
在线时间
4 小时
发表于 2022-1-2 18:44:15 | 显示全部楼层
和你一样,刚开始学,我的理解是任务和裸机的while里面的各个模块就是一个东西,系统自动在几个模块之间切换。初始化都是一锤子买卖,和裸机一样即可;
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2021-1-16
在线时间
4 小时
发表于 2022-1-2 18:46:24 | 显示全部楼层
刚写了一个串口收命令,然后根据 命令类型做不同的事情。感觉没啥区别。没搞懂每个任务都要加vTaskDelay这个函数是啥意思?没这个函数还不进行任务切换,
回复

使用道具 举报

23

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2017-2-19
在线时间
133 小时
发表于 2022-1-3 09:49:29 | 显示全部楼层
这个的主要作用是让任务响应速度更快,可以处理更好的实时性
回复

使用道具 举报

1

主题

15

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2021-1-16
在线时间
4 小时
发表于 2022-1-5 18:30:21 | 显示全部楼层
任务都是死循环,里面有个vTaskDelay的延时函数,想问一下没有MCU没事干的时候他在干嘛?是空闲的还是在这些任务里面轮询?   
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-1-26 11:46:34 | 显示全部楼层
初始化只是执行一次,不能安排任务,否则系统中的任务太多了,要那么多空任务再啥呀!

1、采样任务
         sample_task()
         {
             初始化采样功能
             while (1)
            {
                   1、通过采样128次的瞬时值,计算有效值、功率因数、电量等等
                   2、通过消息队列发送给  【作业控制】任务
             }
         }
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-1-26 11:54:35 | 显示全部楼层
也不能像你这样安排任务:
        串口配置任务:串口初始化
        发送任务:发送任意内容的函数,发送内容通过参数来传递
        接收任务:读取收到的数据
        解析任务:类似modbus通信时的解析,分析收到的数据是登录成功,还是其他的指令

  1、串口初始化只是执行一次,不能安排任务,否则系统中的任务太多了,要那么多空任务干啥呀!
  2、 一般不会安排接收任务(系统中的任务太多了,会严重降低系统的实时性,同时占用大量宝贵的RAM空间),一般是在串口中断中读取通信数据,退出中断之前,通过发送消息队列或者信号量激活【解析任务】
  3、一般不会安排发送任务(系统中的任务太多了,会严重降低系统的实时性,同时占用大量宝贵的RAM空间), 一般是在【作业控制任务】中发送数据。
  4、解析任务:要安排解析任务,当收到中断服务程序发送的消息队列或者信号量时,对类似modbus通信时的解析,分析收到的数据是登录成功,还是其他的指令。
  5、计算任务和指示灯任务
            可以合并为一个任务,我们称之为【作业控制任务】
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-1-26 12:16:46 | 显示全部楼层
以下是我进入实战编程阶段遇到的困惑

   1、http://www.openedv.com/forum.php ... d=304560&extra=
        前后台模式编程转到RTOS模式编程的痛苦历程
   2、USART1和USART2串口分别读通信数据,加工处理后通过USART2和UART4发送出去,如何组织和创建任务?
    http://www.openedv.com/forum.php ... d=295698&extra=
   3、tm32单片机下使用FreeRTOS编程,如何划分任务及任务间如何通信呢?
http://www.openedv.com/forum.php ... d=303459&extra=
   4、一问一答的方式进行通信,如何设计任务呢?
http://www.openedv.com/forum.php ... d=304451&extra=
   5、类似于TCP三次握手、超时检测以及自动重发机制的通信任务该如何设计
http://www.openedv.com/forum.php ... d=304539&extra=
   6、类似于TCP三次握手、超时检测、自动重发机制以及主从应答方式的通信任务以及一个任务和多个任务通信时应该如何设计
http://www.openedv.com/forum.php ... d=306002&extra=
   7、FreeRTOS如何解决使用消息队列时,生产者可以随时生产消息,但是无法确定消费者何时消费消息的问题 [
http://www.openedv.com/forum.php ... d=315203&extra=
   8、仔细研读  北京航空航天大学出版社出版的《嵌入式实时操作系统μCOS-Ⅱ原理及应用》,作者:任哲
   9、仔细研读  北京航空航天大学出版社出版的《基于嵌入式实时操作系统的程序设计技术》,作者:周慈航
  10、仔细研读 清华大学出版社出版的《嵌入式实时多任务软件开发基础》,作者:晨风
回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-1-27 10:51:55 | 显示全部楼层
很多初次接触FreeRTOS编程的人主要是对:划分任务和任务之间的通信感到困惑。


     一、前后台
            主程序是顺序执行。

            定义一个全局变量AA

               void main(void)
               {
                      while (1)
                      {
                                 程序1;   --->读写全局变量AA
                                 程序2;   --->读写全局变量AA
                                 程序3;   --->读写全局变量AA
                       }
                  }

        1、 全局变量AA只在主程序中进行读写,没有在中断服务程序中进行读写
              由于主程序是顺序执行的,所以不存在全局变量AA的原子保护,也就是说,你可以在主程序的任何地方随意使用。

     2、全局变量AA既在主程序中进行读写,又在中断服务程序中进行读写
         (1)、主程序中读写全局变量AA之前:关中断  
         (2)、主程序中读写全局变量AA之后:开中断  


   二、FreeRTOS
          任务间由优先级从高到低执行,因此存在原子保护。
          操作系统给我们提供了消息队列这种方式传输数据,而消息列队本身就具备原子保护。

          你就不能像前后台那样,定义一个全局变量,随便在哪里用就在哪里用。
          在FreeRTOS下编程,一个任务想要获得另外一个任务的变量值,必须要通过FreeRTOS下提供的API函数才可以。因为FreeRTOS下提供的API函数本身就具备原子保护。

  三、前后台和FreeRTOS区别的形象比喻

         1、前后台就相当于你到菜市场拿着现金买菜
                  你、现金、菜、菜贩  
               双方都看得清清楚楚,交易过程双方全程可见--->就像你在前后台中使用全局变量一样,想在哪用就在哪用
               你把现金交给菜贩,菜贩把菜交给你。

          2、FreeRTOS就相当于在天猫买东西

                你首先要遵守天猫平台的规则(相当于你必须要用FreeRTOS提供的API函数从一个任务给另外一个任务传送变量值)

                 你在平台看上一款商品,点击下载,然后付款,你不是直接付款给商家,而是付给天猫平台。
           天猫平台收到货款,通知卖家发货。
           你收到货,签字,天猫平台给卖家打款。


          (1)、你  ---> 任务1
           (2)、卖家  --->任务2
           (3)、付款给天猫平台,天猫平台收到货款,通知卖家发货,你收到货,签字,天猫平台给卖家打款
                       相当于FreeRTOS提供的API函数

                    交易过程,买家和卖家都看不到对方。

                     你不能直接把现金交给卖家,必须要通过天猫平台---> 在FreeRTOS编程中,任务1给任务2传输变量值,必须要通过【FreeRTOS提供的API函数】消息队列传输变量值。













回复

使用道具 举报

19

主题

334

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1108
金钱
1108
注册时间
2018-11-6
在线时间
240 小时
发表于 2022-1-27 13:38:00 | 显示全部楼层
另外要注意一点,当一个任务和另外一个任务进行通信时,只能一对一或者多对一;禁止一对多或多对多。

   如果一对多或多对多,会造成系统死锁。
回复

使用道具 举报

23

主题

256

帖子

0

精华

高级会员

Rank: 4

积分
767
金钱
767
注册时间
2017-2-19
在线时间
133 小时
发表于 2022-2-5 17:37:55 | 显示全部楼层
关注下 写的不错
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-22 17:51

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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