【文件属性】:
文件名称:任务分割-张孝祥java就业培训教程(带完整目录高清扫描版)
文件大小:1007KB
文件格式:PDF
更新时间:2021-06-08 00:17:40
单片机 操作系统
3.3 任务分割
所谓任务分割就是把不能在一个定时器中断时间里完成的任务分割成多个可以在一个
定时器中断时间里完成的任务。在这里,把分割完成之后的任务函数仍然放在主进程里。
要完成任务分割,首先需要让定时器的计时功能可以被外部使用,设一个全局变量
TimeNum,然后在定时器中断处理程序里让 TimeNum 自减:
unsigned char TimeNum=0;
void t0_int() interrupt 1
{
/*Do Something*/
if(TimeNum!=0)
TimeNum--;
}
这样,外部就可以通过 TimeNum 变量使用定时器的计时资源了。在主进程里只要这么
做就行:
/*Do Something*/
TimeNum=100; //准备等待个定时器中断周期
while(TimeNum) //等待
{
/*Do Something*/
}
/*继续 Do Something*/
可以利用定时器延时之后就可以对主进程里的长任务进行分割了,分割方法就是把原来
顺序执行的任务函数,找到合适的节点,在节点处进行合适时间的延时。
这个步骤做起来是比较麻烦的,因为要进行任务分割的任务一般对时间精确性要求是比
较高的(否则直接放到主进程就可以了),需要充分了解运行过程。既要保证每个节点之间
的运行时间小于一个定时器中断周期,又要保证任务时序的正确性。
需要强调一下,任务分割这个方法是个下策,是在没办法的情况下才进行这种处理,我
也只在这个电子钟工程的温度测量用过。
这种情况在操作系统中也是不好处理的,当某个不能被中断的函数的运行时间确实长于
时钟节拍周期的话,也只有先关闭中断,等该函数运行结束后再打开中断。操作系统中把这
种函数叫做“临界段”代码。而在电子中这个例子中,由于要进行精确的计时,是不可以关
闭中断的,只有进行任务分割(当然也有其他的处理方式,加个协处理器什么的)。
11