标题: 关于单片机主程序任务调度问题 [打印本页]

作者: SHANWAZI    时间: 2021-2-19 10:36
标题: 关于单片机主程序任务调度问题
在写程序时通常做法是把一些应用程序驱动程序打包到一个子程序例如
void display_Drive()数码管底层驱动函数(数码管驱动扫描时间是1ms通过定时器控制标志位在主程序查询标志位)
void KEY_Scan()按键扫描函数
void Display_data()数码管数据分配函数
void Key_serve()按键服务函数
根据以上的函数通过多文件编程外部声名后在主程序中调用那么怎么样才能尽可能的减少主程序大循环里执行一次的时间把这个时间节省下来让cpu去处理别的事情  上面的子函数为例  哪些又需要实时扫描哪些又可以不用扫描这么快可以放后一点这种又应该怎么实现呢?

作者: liuliya21c    时间: 2021-2-19 11:15
比如外部按键的采样等信息,有实时查询(即一段时间后查询一次)和中断处理(即用中断的方式去采样),一般不采用查询的方式,那样耗费时间。显示部分一般注意一个鬼影问题就可以了,就是人眼在20ms以内的变化是看不出来的,看不出闪烁的问题即可。
至于具体怎么用,要结合你项目上的问题来决定,如果按键优先级很低,而且又需要中断处理多个任务,资源受限,也可改用查询的方式处理按键。
对MCU来说,顺序执行放在main函数中的函数尽量封装一下,比如init函数、main_loop函数等,具体函数实现不要在main中,这样看着更清爽
作者: she    时间: 2021-2-19 11:40
我其实没怎么看懂你的问题;不过我通常的写法是设置一个定时器计时20ms左右,然后在里面执行扫描按键,按键处理函数等;其他如果要1ms的可以再用一个定时器计时然后在主程序执行,不知道你懂不懂我的意思😂
作者: robinsonlin    时间: 2021-2-19 11:58
很多种方法都可以实现啊,首先要弄清楚定时器的工作机制,你这个问题就迎刃而解了。给你一个思路,用定时器做个时间定标。每200ms定标自加,然后switch(定标)。自加到最大值时归零。  当然,为了保证按键响应的及时性,要给按键分配一个特殊的定标,每50ms检测一次,如果检测到按键响应,就优先执行按键服务。
作者: xstong    时间: 2021-2-19 12:29
1.优化任务实现方式,尽可能的减少纯延迟的等待操作。
2.避免不了使用纯延迟,且有其它应急处理,可以设计一个专用延迟函数,根据事件类型,标识等,在延迟函数中处理一些应急数据。
3.没有较长延时的,能利用中断快速处理的,则不要麻烦主任务。
4.任务相对复杂,功能较多,可以考虑使用嵌入式操作系统。
作者: SHANWAZI    时间: 2021-2-19 15:57
robinsonlin 发表于 2021-2-19 11:58
很多种方法都可以实现啊,首先要弄清楚定时器的工作机制,你这个问题就迎刃而解了。给你一个思路,用定时器 ...

非常感谢非常感谢我明白你意思!我先去试试看去
作者: SHANWAZI    时间: 2021-2-19 17:16
xstong 发表于 2021-2-19 12:29
1.优化任务实现方式,尽可能的减少纯延迟的等待操作。
2.避免不了使用纯延迟,且有其它应急处理,可以设计 ...

感谢提出建议
作者: cn_zhx    时间: 2021-2-21 10:49
可根据任务的实时性要求不同来划分,尽量少用软件延时,定时中断的方式可采纳
作者: 人人学会单片机    时间: 2021-2-22 17:08
你的这个要求 就是《人人学会单片机》视频教程讲解的东西,框架式编程方式




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1