简单的多任务模型.ppt

上传人:小飞机 文档编号:6440726 上传时间:2023-10-31 格式:PPT 页数:38 大小:1.33MB
返回 下载 相关 举报
简单的多任务模型.ppt_第1页
第1页 / 共38页
简单的多任务模型.ppt_第2页
第2页 / 共38页
简单的多任务模型.ppt_第3页
第3页 / 共38页
简单的多任务模型.ppt_第4页
第4页 / 共38页
简单的多任务模型.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《简单的多任务模型.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,谢 谢 观 赏,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 生活休闲 > 在线阅读


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号