转载 关于多线程工作(2)

图 6 CPU运行情况示意图
CPU运行情况如图 6 所示,黑色区域表示 CPU进程,系统启动后, CPU将无休止的运行,
CPU资源将如何分配呢?程序首先进入“任务切换”进程,如果当前没有任务就绪,就在任
务切换进程循环(也可以理解为空闲进程),定时中断将 CPU 当前进程打断,在定时中断进
程可能让某些任务就绪,中断返回任务切换进程,很快会进入就绪任务 0,CPU“关照”完
任务 0,再次回到任务切换进程,如果还有其它任务就绪,还会再次进入其它任务,没有任
务就循环等待,定时中断会不断让新的任务就绪,CPU 也会不断进入任务“关照” 。这样不
同的任务就会获得不同的CPU资源,每一个任务都像是拥有一个独立的CPU 为之服务。
从这种进程切换我们可以看出,在定时中断和任务切换过程中,额外的占用了一些 CPU
资源, 这就是定时中断频度不宜太快, 否则将大大降低CPU的有效资源率, 当然太慢也不行。
另外就是 CPU每次关照任务的时间不能太长,如果超过一个中断周期,就会影响到其它任务
的实时性。所谓的实时性就是按定时中断设定的节拍,准时得到CPU关照。这样,每一个子
任务就必须简单,每次“关照”时间最好不要超过定时中断节拍周期(5ms 或 10ms,初学者
要对 ms 有一个概念,机器周期为 us 级的单片机,1ms 可以执行上千条指令,对于像数码管
扫描,键盘扫描,LCD显示等常规任务都是绰绰有余的,只是遇到大型计算,数据排序就显
得短了)
关于任务优先级的问题:一个复杂系统,多个任务之间总有“轻重缓急”之区别,那些
需要严格实时的任务通常用中断实现,中断能够保证第一时间相应,我们这里讨论的不是那
种实时概念,是指在最大允许时差内能够得到 CPU“关照” ,例如键盘扫描,为了保证较好
的操作效果,快的/慢的/长的/短的(不同人按键不一样)都能够正确识别,这就要保证足够
的扫描速度,这种扫描速度对不同的按键最好均等,如果我们按 50Hz 来设计,那么就要保
证键盘扫描速度在任何情况下都能够做到 50Hz 扫描频度,不会因为某个新任务的开启而被
破坏,如果确实有新的任务有可能破坏这个 50Hz 扫描频度,我们就应该在优先级安排上让
键盘扫描优先级高于那个可能影响键盘扫描的任务。这里体现的就是当同时多个任务就绪时,
最先执行哪个的问题,任务调度时要优先执行级别高的任务。
关于“长”任务的问题:有些任务虽然很独立,但完成一次任务执行需要很长时间,例
如 DS18B20,从复位初始化到读回温度值,最长接近 1s,这主要是 DS18B20 温度传感器完
成一次温度转换需要500 到 750ms,这个时间对 CPU 而言,简直是太长了,就像一件事情需
要我们人等待 10 年一样,显然这样的任务是其它任务所耽搁不起的。像类似 DS18B20 这样
的器件(不少 ADC 也是这样) ,怎么设计任务体解决“长”的问题。进一步研究这些器件发
现,真正需要CPU“关照”它们的时间并不长,关键是等待结果要很长时间。解决的办法就
是把类似的器件驱动分成多个段:初始化段、启动段、读结果段,而在需要花长时间等待时
间段,不要 CPU关照,允许 CPU去关照其它任务。


将一个任务分成若干段,确保每段需要CPU 关照时长小于定时器
中断节拍长,这样CPU在处理这些长任务时,就不会影响到其它任务的执行。

 

posted @ 2015-01-21 09:14  MRzhaoly  阅读(157)  评论(0编辑  收藏  举报