新闻中心

EEPW首页>嵌入式系统>设计应用> 单片机多任务的时间片方式实现

单片机多任务的时间片方式实现

作者: 时间:2013-07-22 来源:网络 收藏

初始化定时器后,要进入某个的死循环当中。假设我们要进入1中,则如下所示:
d.JPG
TaskIndex为全局变量,用以存储当前执行的序号;难点在于ret的妙用。ret一般用于子函数的最后一条,以回到调用函数前下一条指令的地址。ret的实质是取出此时堆栈中栈顶的两个字节赋给PC寄存器,以返回调用函数前的位置。所以,上述代码是先把任务1的地址放进堆栈中,然后调用ret来取出地址给PC,以重新跳到任务1中去执行。
3.2 多任务切换的主循环
进入某个任务进行死循环后,程序的主循环流程如图3所示。当程序进入到某个任务进行死循环时,如上面的任务i,定时器中断周期发生,发生时意味着该任务的片结束,准备执行下一个任务。这些准备工作是在中断里做的,如图3所示。首先,应保存此时用到的各个寄存器值,以便下次轮到该任务时取出继续执行,还要保存栈顶的位置,以便下次能取出所保存的值;然后通过全局变量TaskIndex取得下一个任务的序号,通过任务序号,得到下一个任务的堆栈栈顶的地址,赋给栈顶寄存器SP;然后通过SP取出保存的各个通用寄存器值;最后,重设定时器值,使中断能够再次进行任务切换。

本文引用地址://m.amcfsurvey.com/article/170457.htm

e.JPG


这里重要的是整个思路,没有比较难的代码,故没有贴出代码。值得提醒的是,保存通用寄存器值时,并不需要保存所有的通用寄存器值,只需要保存任务中用到的就可以。这里解释前面程序中提及的45H、55H、65H:各个任务堆栈的开始处存储各个任务的地址,然后再把要保护的寄存器值入栈,栈顶抬高;而要恢复下一个任务时,需将上次保护寄存器后的栈顶值赋给SP寄存器,然后逐个出栈赋值给各个寄存器值,直到栈底处存储的上次任务暂停处的地址。因为本文的验证程序只保护了A、B、R0、R2 4个寄存器值,堆栈刚好到达45H、55H、65H。

总结
多任务的另一种常用是把任务切成小片,然后放在主循环里。这样,每个循环执行一次各个任务的一小片,从而看起来所有的任务都同时进行。切片的思想是把一个任务细分成多个步骤,而每次只执行其中一小步。如多段数码管的显示可以每次只显示一段,这是更常用的,但并不是每个任务都可以切片的。
本文所讲的这种多任务的要求程序员要有比较好的汇编基础,要求对中断的过程比较熟悉,对ret指令的实质要理解,能够根据任务来分配堆栈,对操作系统管理CPU片有大致理解,因此要求比较高。另一方面,片定多少需要程序员根据任务的不同来选择,需要测试多次来达到性能的最优化。


上一页 1 2 3 下一页

评论


相关推荐

技术专区

关闭