找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2785|回复: 19
收起左侧

关于单片机任务模式的解惑,时间片轮询法

[复制链接]
ID:728915 发表于 2022-12-14 22:44 | 显示全部楼层 |阅读模式
从接触单片机开始,从开始的Delay延时,经同事提醒Delay函数会空耗CPU弊端,所以逐渐少用Delay函数。因为考虑通用性(可能也因为懒),最近在封装模块函数,定时器、串口参数,还有I/O口的宏定义以便于硬件修改。类似于下面这种:
#include "OLED.h"                //OLED小屏幕,模拟IIC
//SDA:PA6
#define OLED_SDA_GPIO_PORT        GPIOA        
#define OLED_SDA_GPIO_PIN                GPIO_Pin_6
//SCL:PA7                                                                                                               
#define OLED_SCL_GPIO_PORT  GPIOA        
#define OLED_SCL_GPIO_PIN     GPIO_Pin_7
这周一开始,逐渐有封装任务函数的想法:时间片轮询法,至于短期用不到的系统就先不搞了。
今天晚上突然反省一下:用时间片轮询法,好处是什么?在数量比较少的情况下,用这种任务模式是不是多此一举?
也烦请路过的各位大佬解惑,感谢!

回复

使用道具 举报

ID:401564 发表于 2022-12-15 00:46 | 显示全部楼层
对于简单而且是单一的程序而言,所谓'效率'有时候并不重要
比如我就一个LED手电,按键就是开关的作用而已,这个时候,去抖动,没有什么比delay更爽的了,手电开了就开了,ADC用中断,就再也没有其它的事情做了,我还怕单片机累着了不成?
但是你也必须要学会提高单片机效率,有的系统对效率确实是有很高的要求的
对于你说的"时间片轮询法"我没学过,基于百度的理解,感觉这也不怎么好
我常用的办法是:
1,先声明一个全局变量 time,key结构体其实也行,个人习惯而已
2,按键按下之后,time清除,key置位
3,在systick或者定时器中断中,time++
4,主函数就是  if(key&&(time >= 50ms)//50mS由自己决定延时时间
{
key = 0;
执行按键相关处理
}
这样一来,随便你按键怎么按,怎么抖动,它只作一个处理:       time = 0;  key = 1;
永远是以你最后松开按键之后,稳定了之后的50mS,再执行按键相关操作
按键读取就只占用两个语句的时间而已
回复

使用道具 举报

ID:883242 发表于 2022-12-15 07:50 | 显示全部楼层
看样子你用的是STM32,用CMSIS自带的RTX5好了。
回复

使用道具 举报

ID:728915 发表于 2022-12-15 08:44 | 显示全部楼层
Y_G_G 发表于 2022-12-15 00:46
对于简单而且是单一的程序而言,所谓'效率'有时候并不重要
比如我就一个LED手电,按键就是开关的作用而已,这 ...

有道理。所以我昨天晚上就突然反思了一下,好像没什么明显的提升,但是又想不出个所以然来。
回复

使用道具 举报

ID:728915 发表于 2022-12-15 08:46 | 显示全部楼层
Hephaestus 发表于 2022-12-15 07:50
看样子你用的是STM32,用CMSIS自带的RTX5好了。

对,虽然具体芯片不是STM的,但是用的是STM32的库。CMSIS自带的RTX5,我去搜一下。感谢
回复

使用道具 举报

ID:1034262 发表于 2022-12-15 12:23 | 显示全部楼层
其实就是不用软件延时,不要空耗时间,实现方式各种各样,RTOS、时间片、时间触发等等均可。
回复

使用道具 举报

ID:883242 发表于 2022-12-15 16:44 | 显示全部楼层
我,菜鸡 发表于 2022-12-15 08:46
对,虽然具体芯片不是STM的,但是用的是STM32的库。CMSIS自带的RTX5,我去搜一下。感谢

我似乎发过一个完整的Cortex-M0 RTX5工程,你用“53岁”做关键字搜一下旧帖子。
回复

使用道具 举报

ID:332444 发表于 2022-12-15 17:28 | 显示全部楼层
对于中高级开发来说时间安排就必须考虑,论坛有的是因为时间安排不好提问的,因此,在帖子里面提及了对时间安排的一点思路.
回复

使用道具 举报

ID:883242 发表于 2022-12-15 19:14 | 显示全部楼层
用过TCP协议栈、FATFS、GUI等等复杂中间件就知道好处了,这里面到处都是delay,如果用傻等那种delay,系统早就卡死了。用RTOS时间片,OSTimeDly的概念是把CPU控制权交给OS,如果有任务就绪,就让那个任务去执行,效率高太多了。如果不用RTOS,自己写任务调度理论上可行,实际上太复杂了,个人很难做到没有bug。
回复

使用道具 举报

ID:728915 发表于 2022-12-15 22:33 | 显示全部楼层
coody_sz 发表于 2022-12-15 12:23
其实就是不用软件延时,不要空耗时间,实现方式各种各样,RTOS、时间片、时间触发等等均可。

也就是说,可以生成一个类似中断,来打破一些死循环。从而让单片机不会一直进入无意义死循环。
回复

使用道具 举报

ID:728915 发表于 2022-12-15 22:34 | 显示全部楼层
Hephaestus 发表于 2022-12-15 16:44
我似乎发过一个完整的Cortex-M0 RTX5工程,你用“53岁”做关键字搜一下旧帖子。

厉害,53岁仍继续奔跑啊。
回复

使用道具 举报

ID:728915 发表于 2022-12-15 22:37 | 显示全部楼层
xianfajushi 发表于 2022-12-15 17:28
对于中高级开发来说时间安排就必须考虑,论坛有的是因为时间安排不好提问的,因此,在帖子里面提及了对时间安 ...

类比于公司,上了一定规模,就要考虑制度,提高效率?
回复

使用道具 举报

ID:728915 发表于 2022-12-16 08:49 | 显示全部楼层
Hephaestus 发表于 2022-12-15 19:14
用过TCP协议栈、FATFS、GUI等等复杂中间件就知道好处了,这里面到处都是delay,如果用傻等那种delay,系统 ...

虽然那种中间件我没怎么用过,但是你说的道理我大概明白了。感谢
回复

使用道具 举报

ID:332444 发表于 2022-12-16 08:50 | 显示全部楼层
我,菜鸡 发表于 2022-12-15 22:37
类比于公司,上了一定规模,就要考虑制度,提高效率?

打个比方,任务分配多人,那么,是要等待某个完成后再问下一个,还是只问所有任务是否完成,然后就去做自己的事,哪个更好?所谓的多任务无非如此而已.
回复

使用道具 举报

ID:728915 发表于 2022-12-17 11:26 | 显示全部楼层
xianfajushi 发表于 2022-12-16 08:50
打个比方,任务分配多人,那么,是要等待某个完成后再问下一个,还是只问所有任务是否完成,然后就去做自己的 ...

原来如此
回复

使用道具 举报

ID:77589 发表于 2022-12-19 14:43 | 显示全部楼层
大家都讲的好!
回复

使用道具 举报

ID:1058417 发表于 2022-12-20 13:34 | 显示全部楼层
xianfajushi 发表于 2022-12-16 08:50
打个比方,任务分配多人,那么,是要等待某个完成后再问下一个,还是只问所有任务是否完成,然后就去做自己的 ...

明白了
回复

使用道具 举报

ID:513507 发表于 2022-12-28 16:59 | 显示全部楼层
Y_G_G 发表于 2022-12-15 00:46
对于简单而且是单一的程序而言,所谓'效率'有时候并不重要
比如我就一个LED手电,按键就是开关的作用而已,这 ...

学习啦,学习啦
回复

使用道具 举报

ID:513507 发表于 2022-12-28 17:03 | 显示全部楼层
单片机多任务处理,了解下
回复

使用道具 举报

ID:1059383 发表于 2022-12-29 18:18 | 显示全部楼层
就算用不到操作系统也该去了解一下时间片轮询这个东西  并不是只有操作系统才能用到 这只是一个方法而已
回复

使用道具 举报

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

本版积分规则

小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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