文件名称:非占用式程序的一般结构-张孝祥java就业培训教程(带完整目录高清扫描版)
文件大小:1007KB
文件格式:PDF
更新时间:2024-06-27 18:04:21
单片机 操作系统
4.5 非占用式程序结构的优势 1、非占用式程序相比于占用式程序,增加了一定的代码,虽然会使整体效率降低,但 是提高了各个任务之间的切换速度,可以对各个任务都能很快地响应。这点类似于操作系统, 虽然降低了效率,但是各个任务间的快速切换可以达到各个任务“并行处理”的效果,光是 这点的好处就已经很大了。 2、非占用式程序结构可以放进定时器 第 3 章已经发现用定时器分配任务的好处,有些简短的代码可以直接放进定时器里。 在改造之前的扫描程序是不适合放在定时器中断处理程序里执行的,因为太长,可能还 没执行完就来了下一个中断。就算勉强执行完了,留给主进程处理其他事情的时间也不多了。 而改为非占用式之后,可以在中断处理程序里直接调用扫描程序,它会很快地执行完, 然后有充足的时间留给其他任务。 3、非占用式程序并不是一定会降低效率。 就拿“三大改造”的第三点说明,它虽然形式上消除了延时函数,但是每次调用此函数 时对 num 变量的处理,以及有其产生的相关判断语句,总的代码量比原来的要多。 但是,这真的就仅仅是这样了吗?改造之前的函数,执行完退出之后所有的 led 全是熄 灭的,只有在此函数执行过程中(延时阶段)才会点亮(传统数码管扫描亦是如此)。 而改造之后的函数,它的功能就是指定一下每个灯的亮灭,然后立马退出,在执行其他 任务的过程中该点亮的灯是在点亮的状态。这样就提高了整体的亮度,在执行其他任务的过 程中,从某种意义上说也是在执行当前任务。 这可能还不能太清楚地说明问题,下面再举一例,传统的按键扫描一般是这样: if(key==0) //key是某个引脚 { delay5(1); if(key==0) //确认按键已按下 { /*do something*/ } } 这段代码也是很浪费时间的,中间有个 5ms 延时白白浪费。 通过对它改造之后,结合定时器,可以几乎完全地把这 5ms 时间省出来,把如下代码 放进定时器中断处理程序: static unsigned char keylast; //保存上次的按键值 if(key==0 && keylast==1) //检测到一个下降沿 { /*do something*/ } keylast=key; 这段代码每 5ms 执行一次,而执行的时间是非常短的,剩下有大量的时间可留给其他 任务。 结合定时器进行改造,是真的可以把占用式函数的延时时间节省出来的。 4.6 非占用式程序的一般结构 非占用式程序将占用式程序分割执行,需要用到静态变量对当前步骤进行记忆,其一般 结构如下: 17