请教如何让系统实时性更强

2020-02-05 09:01发布

本帖最后由 fengtianzhifeng 于 2012-6-19 13:56 编辑

请问下大家~谁能给我说下
时间片轮转调度算法~举个很简单的例子我的小系统中有4*4的矩阵键盘,有LCD1602,还有ADC转换器。当我只测试LCD1602的时候没什么问题,测试键盘也没有什么问题~测试AD也没有问题,但是只要把这些模块集合到一起就会出问题,单片机的执行周期变的很大,浪费了很多很多时间,单片机就是属于站着等待了,而不是跑着等待,说的通俗点就是系统的实时性变的超级差~请问大家有什么解决的法子
更通俗点就是如何实现多任务
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
29条回答
cc2666
1楼-- · 2020-02-06 08:13
想办法把ms级的延时等待都用定时器来实现,效率应该能高不少
fengtianzhifeng
2楼-- · 2020-02-06 12:11
xiaoziwen 发表于 2012-6-19 14:38
http://www.amobbs.com/thread-5468237-1-1.html

谢谢我看看~谢谢
jpchen
3楼-- · 2020-02-06 13:44
你这个程序的delay函数是采用for循环实现的,这样在延时函数里无法做任何事情。可以将delay函数改造成检查是否有其他任务需要运行,如果有,就切换到其他任务。它的核心思想是在一个任务的等待期间做其他任务,当等待时间到了后,再切回这个任务继续运行,所以延时函数一般采用定时器计时的方式来进行,而不是for循环。

多任务系统的书有很多,你随便找一般看一下里面的概念。实现上需要注意一下细节,免得任务切换出错。

简单的多任务可以采用状态机实现,论坛有很多这方面的帖子,你搜索关键词“状态机”即可。
fengtianzhifeng
4楼-- · 2020-02-06 14:09
 精彩回答 2  元偷偷看……
mored
5楼-- · 2020-02-06 17:23
keytest算法挺好,不过这个消除不了键盘的抖动。
检测按键过于频繁,这样导致按键的抖动被检测为按键的变化导致连续刷新lcd
建议把keytest放到定时中断中,每10或20ms执行一次
kebaojun305
6楼-- · 2020-02-06 21:44
本帖最后由 kebaojun305 于 2012-6-19 17:06 编辑

简单点就是用定时器 定时  来设置标志位  使用状态机来处理你的功能。比如按键  一般是20~30ms检测一次   那就整个定时标记 20~30ms标记一次  主程序中扫描这个标记  标记置位 才检测按键一次(按键中也用状态机 就相当于20~30ms检测一次  这样和你的软件延时 实现的功能一样 但是MCU不空跑了其他的类似。  这种方法  和系统的概念基本是一样的。就是不能让MCU空跑。

一周热门 更多>