完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我们在入门阶段,一般面对的设计都是单一的简单的任务,流程图可以如图 1 所示,通常会用踏步循环延时来满足任务需要。面对多任务,稍微复杂的程序设计,沿用图 1 的思想,我们会做出如图 2 所示的程序,在大循环体中不断增加任务,通常还要用延时来满足特定任务节拍,这种程序设计思想它有明显的不足,主要是各个任务之间相互影响,增加新的任何之后,以前很好的运行的任务有可能不正常,例如数码管动态扫描,本来显示效果很好的驱动函数,在增加新的任务后出现闪烁,显示效果变差了。
很明显,初学者在设计程序时,需要从程序构架思想上下功夫,在做了大量基本模块练习之后,需要总结提炼自己的程序设计思路(程序架构思想)。首先我们来理解“任务”,所谓任务,就是需要 CPU 周期“关照”的事件,绝大多数任务不需要 CPU 一直“关照”,例如启动 ADC 的启动读取。甚至有些任务“害怕” CPU 一直“关照”例如 LCD 的刷新,因为 LCD 是显示给人看的,并不需要高速刷新,即便是显示的内容在高速变化,也不需要高速刷新,道理是一样的。这样看来,让 CPU 做简单任务一定很浪费,事实也是如此,绝大多数简单任务, CPU 都是在“空转”(循环踏步延时)。对任务总结还可以知道,很多任务需要 CPU 不断“关照”,其实这种“不断”也是有极限的,比如数码管动态扫描,能够做到 40Hz 就可以了,又如键盘扫描,能够做到 20Hz(经验值),基本上也就不会丢有效按键键值了,再如 LCD 刷新,我觉得做到 10Hz 就可以了,等等。看来,绝大多数任务都是工作在低速频度。而我们的 CPU 一旦运行起来,速度又很快, CPU 本身就是靠很快的速度执行很简单的指令来胜任复杂的任务(逻辑)的。如果有办法把“快”的 CPU分成多个慢的 CPU,然后给不同的任务分配不同速度的 CPU,这种设想是不是很好呢!确实很好,下面就看如何将“快”的 CPU 划分成多个“慢”的 CPU。根据这种想法,我们需要合理分配 CPU 资源来“关照”不同的任务,最好能够根据任务本身合理占用 CPU 资源,首先看如图 3 所示的流程图,各个任务流程独立,各任务通过全局变量来交互信息,在流程中有一个重要的模块“任务切换”,就是任务切换模块实现 CPU 合理分配,这个任务切换模块是怎么实现的呢? 首先需要理解, CPU 一旦运行起来,就无法停止(硬件支持时钟停止的不在这里讨论),谁能够控制一批脱缰的马呢?对了,有中断,中断能够让 CPU 回到特定的位置,设想,能不能用一个定时中断,周期性的将 CPU 这匹运行着的脱缰的马召唤回来,重新给它安排特定的任务,事实上,任务切换就是这样实现的。如图 4A 所示, CPU 在空闲任务循环等待,定时中断将 CPU 周期性唤回,根据任务设计了不同的响应频度,满足条件的任务将获得 CPU 资源, CPU 为不同任务“关照”完成后,再次返回空闲任务,如此周而复始,对于各个任务而言,好像各自拥有一个独立的 CPU,各自独立运行。用这种思想构建的程序框架,最大的好处是任务很容易裁剪,系统能够做得很复杂。在充分考虑单片机中断特性(在哪里中断就返回到哪里)后,实际可行的任务切换如图4B 所示,定时中断可能发生在任务调度,随机任务执行的任何时候,图中最大的框框所示,不管中断在何时发生,它都会正常返回,定时中断所产生的影响只在任务调度模块起作用,即依次让不同的任务按不同的节拍就绪。任务调度会按一定的优先级执行就绪任务。总结不同的任务需要 CPU 关照的频度,选择最快的那个频度来设定定时器中断的节拍,一般选择 200Hz,或者 100Hz 都可以。另外再给每个任务设定一个节拍控制计数器 C,也就是定时器每中断多少次后执行任务一次。例如取定时中断节拍为 200Hz,给任务设定的 C=10,则任务执行频度为 200/10=20Hz,如果是数码管扫描,按 40Hz 不闪烁规律,则任务节拍控制计数器 C=5 即可。在程序设计中, C 代表着任务运行的节拍控制参数,我们习惯用 delay 来描述,不同的任务用 task0, task1……来描述。 未完待续。。。。。。。。。。。。 下次说说代码如何实现 |
|
相关推荐
3个回答
|
|
这是要做系统吗?
|
|
|
|
有点像Protothreads
|
|
|
|
謝謝樓主 解決困擾我多天的問題
|
|
|
|
只有小组成员才能发言,加入小组>>
3311 浏览 9 评论
2994 浏览 16 评论
3493 浏览 1 评论
9058 浏览 16 评论
4087 浏览 18 评论
1178浏览 3评论
605浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
599浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2335浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1896浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-23 00:50 , Processed in 1.142152 second(s), Total 54, Slave 44 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号