《简单的多任务模型.ppt》由会员分享,可在线阅读,更多相关《简单的多任务模型.ppt(38页珍藏版)》请在三一办公上搜索。
1、5.2 最简单的多任务模型,目 录,任务切换模型范例分析,双任务切换模型,待解决的问题,setTaskJmp()的实现,task 1,双任务切换模型,保存task0上下文,恢复task1上下文并跳转,保存task1上下文,恢复task0上下文并跳转,task 0,任务切换,双任务是多任务最简单的典型情况,而任务切换是学习多任务操作系统的重点和难点。,多任务操作系统核心的基本原理,在源代码层次,任务也是一个函数。,双任务切换模型,双任务是多任务最简单的典型情况,而任务切换是学习多任务操作系统的重点和难点。,任务切换,task 0.1,task 0.2,task 1.1,task 1.2,可将任务
2、函数分成若干程序段。,在源代码层次,任务也是一个函数。,longjmp(jbTask0),setjmp(jbTask1),longjmp(jbTask1),setjmp(jbTask0),双任务切换模型|setjmp和longjmp的作用,保存task0上下文,恢复task1上下文并跳转,保存task1上下文,恢复task0上下文并跳转,双任务是多任务最简单的典型情况,而任务切换是学习多任务操作系统的重点和难点。,任务切换,task 0.1,task 0.2,task 1.1,task 1.2,若要实现函数之间的跳转,可使用非局部跳转函数setjmp()和longjmp()。,双任务切换模型|
3、setjmp和longjmp的作用,保存task0上下文,恢复task1上下文并跳转,保存task1上下文,恢复task0上下文并跳转,双任务是多任务最简单的典型情况,而任务切换是学习多任务操作系统的重点和难点。,任务切换,task 0.1,task 0.2,task 1.1,task 1.2,保存task0上下文,setjmp(jbTask1),longjmp(jbTask1),setjmp(jbTask0),longjmp(jbTask0),若要实现函数之间的跳转,可使用非局部跳转函数setjmp()和longjmp()。,恢复task1上下文并跳转,双任务切换模型|setjmp和long
4、jmp的作用,保存task0上下文,恢复task1上下文并跳转,保存task1上下文,恢复task0上下文并跳转,双任务是多任务最简单的典型情况,而任务切换是学习多任务操作系统的重点和难点。,任务切换,task 0.1,task 0.2,task 1.1,task 1.2,setjmp(jbTask1),longjmp(jbTask1),setjmp(jbTask0),longjmp(jbTask0),若要实现函数之间的跳转,可使用非局部跳转函数setjmp()和longjmp()。,task 0.1,task 1.1,双任务切换模型和程序分析,保存task0上下文,恢复task1上下文并跳转
5、,保存task1上下文,恢复task0上下文并跳转,任务切换,task 0.2,task 1.2,setjmp(jbTask1),longjmp(jbTask1),setjmp(jbTask0),longjmp(jbTask0),task 0,task 1,void task0(void)task0Init();while(1)task0_program1;ctmp=setjmp(jbTask0);if(ctmp=0)longjmp(jbTask1);task0_program2;,void task1(void)task1Init();while(1)task1_program1;ctmp=
6、setjmp(jbTask1);if(ctmp=0)longjmp(jbTask0);task1_program2;,双任务切换模型和程序分析,保存task0上下文,恢复task1上下文并跳转,保存task1上下文,恢复task0上下文并跳转,task 0.2,task 1.2,setjmp(jbTask1),longjmp(jbTask1),setjmp(jbTask0),longjmp(jbTask0),void task0(void)task0Init();while(1)task0_program1;ctmp=setjmp(jbTask0);if(ctmp=0)longjmp(jbTa
7、sk1);task0_program2;,void task1(void)task1Init();while(1)task1_program1;ctmp=setjmp(jbTask1);if(ctmp=0)longjmp(jbTask0);task1_program2;,task 0.1,task 1.1,task 0,task 1,双任务切换模型和程序分析,保存task0上下文,恢复task1上下文并跳转,保存task1上下文,恢复task0上下文并跳转,task 0.2,task 1.2,setjmp(jbTask1),longjmp(jbTask1),setjmp(jbTask0),lo
8、ngjmp(jbTask0),void task0(void)task0Init();while(1)task0_program1;ctmp=setjmp(jbTask0);if(ctmp=0)longjmp(jbTask1);task0_program2;,void task1(void)task1Init();while(1)task1_program1;ctmp=setjmp(jbTask1);if(ctmp=0)longjmp(jbTask0);task1_program2;,task 0.1,task 1.1,task 0,task 1,双任务切换模型和程序分析,保存task0上下文
9、,恢复task1上下文并跳转,保存task1上下文,恢复task0上下文并跳转,task 0.2,task 1.2,setjmp(jbTask1),longjmp(jbTask1),setjmp(jbTask0),longjmp(jbTask0),void task0(void)task0Init();while(1)task0_program1;ctmp=setjmp(jbTask0);if(ctmp=0)longjmp(jbTask1);task0_program2;,void task1(void)task1Init();while(1)task1_program1;ctmp=setjm
10、p(jbTask1);if(ctmp=0)longjmp(jbTask0);task1_program2;,task 0.1,task 1.1,task 0,task 1,0,保存task0上下文,双任务切换模型和程序分析,task 0.2,task 1.2,setjmp(jbTask1),longjmp(jbTask1),longjmp(jbTask0),void task0(void)task0Init();while(1)task0_program1;ctmp=setjmp(jbTask0);if(ctmp=0)longjmp(jbTask1);task0_program2;,void
11、task1(void)task1Init();while(1)task1_program1;ctmp=setjmp(jbTask1);if(ctmp=0)longjmp(jbTask0);task1_program2;,task 0.1,task 1.1,task 0,task 1,setjmp(jbTask0),在小节中,已约定setjmp()返回值是0,longjmp()返回值是1。,恢复task1上下文并跳转,ctmp=,双任务切换模型和程序分析,task 0.2,task 1.2,setjmp(jbTask1),longjmp(jbTask1),longjmp(jbTask0),voi
12、d task0(void)task0Init();while(1)task0_program1;ctmp=setjmp(jbTask0);if(ctmp=0)longjmp(jbTask1);task0_program2;,void task1(void)task1Init();while(1)task1_program1;ctmp=setjmp(jbTask1);if(ctmp=0)longjmp(jbTask0);task1_program2;,task 0.1,task 1.1,task 0,task 1,setjmp(jbTask0),在小节中,已约定setjmp()返回值是0,lon
13、gjmp()返回值是1。,ctmp=,目 录,任务切换模型范例分析,双任务切换模型,待解决的问题,setTaskJmp()的实现,待解决的问题,在上一小节的描述中,仅是说明任务正确运行后的模型,若要编写多任务操作系统,还有两个重要问题需要解决。,待解决的问题,在上一小节的描述中,仅是说明任务正确运行后的模型,若要编写多任务操作系统,还有两个重要问题需要解决。,在源代码层次,任务也是一个函数。,当函数在运行期间被中断打断时,将如何处理?,void task0(void)task0Init();while(1)task0_program1;.task0_program2;,中断响应过程中的现场保护
14、与恢复,函数中断过程,堆栈指针与bp,SDCC编译器自动处理压栈出栈,无需软件干预。,返回地址,通用寄存器,中断响应过程中的现场保护与恢复,函数中断过程,堆栈指针与bp,返回地址,通用寄存器,中断响应过程中的现场保护与恢复,函数中断过程,保证运行的函数在中断前后,执行结果不变的条件:,如R0 R7、ACC、B、SP、DPL、DPH等寄存器,如函数内的局部变量、计算表达式的中间值,在源代码层次,任务也是一个函数,任务的正确运行条件与函数一致。,任务切换中的现场保护与恢复,任务切换过程,setjmp(jbTask0),longjmp(jbTask1),任务堆栈空间,任务堆栈空间,任务切换中的现场保
15、护与恢复,任务切换过程,任务堆栈空间,任务堆栈空间,setjmp(jbTask0),longjmp(jbTask1),任务切换中的现场保护与恢复,任务切换过程,setjmp(jbTask0),longjmp(jbTask1),任务堆栈空间,任务堆栈空间,任务切换互不干扰地运行条件,让任务互不干扰地运行条件:,解决方法:,任务切换过程,setjmp(jbTask0),longjmp(jbTask1),待解决的问题,在上一小节的描述中,仅是说明任务正确运行后的模型,若要编写多任务操作系统,还有两个重要问题需要解决。,如何让任务运行,事实上,系统在启动时没有一个任务存在,即没有一个任务在运行。而任务
16、的切换必须setjmp()和longjmp()函数配对调用。,task0();,如何让任务运行,事实上,系统在启动时没有一个任务存在,即没有一个任务在运行。而任务的切换必须setjmp()和longjmp()函数配对调用。,task1();,如何让任务运行,事实上,系统在启动时没有一个任务存在,即没有一个任务在运行。而任务的切换必须setjmp()和longjmp()函数配对调用。,setTaskJmp();task1();,目 录,任务切换模型范例分析,双任务切换模型,待解决的问题,setTaskJmp()的实现,setjmp()的工作内容,若要用setTaskJmp()模拟任务调用setj
17、mp(),需先明白任务调用setjmp()所做的工作。,堆栈指针SP的值增加2,int setjmp(jmp_buf environment);,是保存上下文信息的“缓冲区”,相当于“任务堆栈”,1、每个任务有指定的入口地址;,2、每个任务有各自独立的堆栈空间。,setTaskJmp()函数,setTaskJmp(task0,_GucTaskStks0,_GjbTask0);,task0任务函数的地址,task0任务堆栈的位置,保存task0的上下文信息,setTaskJmp()模拟调用setjmp()函数,setTaskJmp()模拟调用setjmp()函数,模拟setjmp()调用压栈返回
18、地址的操作,目 录,任务切换模型范例分析,双任务切换模型,待解决的问题,setTaskJmp()的实现,任务切换模型范例分析|主函数,1、为每个任务分配独立的堆栈空间;2、调用setTaskJmp()函数,模拟任务调用setjmp()函数;3、调用longjmp进入任务0,并开始运行。,static idata uchar _GucTaskStks232;static jmp_buf _GjbTask0;static jmp_buf _GjbTask1;void main(void)setTaskJmp(task0,_GucTaskStks0,GjbTask0);setTaskJmp(task
19、1,_GucTaskStks1,GjbTask1);longjmp(_GjbTask0);,主函数的工作内容:,跳转到task0的任务函数,static idata uchar _GucTaskStks232;static jmp_buf _GjbTask0;static jmp_buf _GjbTask1;void main(void)setTaskJmp(task0,_GucTaskStks0,GjbTask0);setTaskJmp(task1,_GucTaskStks1,GjbTask1);longjmp(_GjbTask0);,任务切换模型范例分析|任务0,跳转到task1的任务函数
20、,1、为每个任务分配独立的堆栈空间;2、调用setTaskJmp()函数,模拟任务调用setjmp()函数;3、调用longjmp进入任务0,并开始运行。,主函数的工作内容:,双任务切换图,task0,setjmp(jbTask0),longjmp(jbTask1),task0程序段2,task1,task1程序段1,setjmp(jbTask1),longjmp(jbTask1),task1程序段2,main(),setTaskJmp(jbTask0),setTaskJmp(jbTask1),longjmp(jbTask0),第一次任务切换,task0程序段1,task0和task1的交替切换,双任务切换流程,保存task0上下文,恢复task1上下文并跳转,保存task1上下文,恢复task0上下文并跳转,ctmp=1,谢 谢 观 赏,