最简单的多任务模型.ppt

上传人:sccc 文档编号:5820135 上传时间:2023-08-23 格式:PPT 页数:38 大小:3.27MB
返回 下载 相关 举报
最简单的多任务模型.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,任务0和1都初始化完成,双任务切换模型和程序分析,保存task0上下文,恢复task1上下文并跳转,保存task1上下文,恢复task0上下文并跳转,task 0.2,task 1.2,setjmp(jbTask1),longjmp(jbTask1),setjmp

8、(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=setjmp(jbTask1);if(ctmp=0)longjmp(jbTask0);task1_program2;,task 0.1,task 1.1,task 0,task 1,任务0和1都已运行,并

9、保存了各自的上下文,双任务切换模型和程序分析,保存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(jbTask1);task0_program2;,void task1(void)task1Init();

10、while(1)task1_program1;ctmp=setjmp(jbTask1);if(ctmp=0)longjmp(jbTask0);task1_program2;,task 0.1,task 1.1,task 0,task 1,则使用longjmp(jbTask1)后,切换到setjmp(jbTask1)保存的位置,0,运行task0.1,保存task0上下文,双任务切换模型和程序分析,task 0.2,task 1.2,setjmp(jbTask1),longjmp(jbTask1),longjmp(jbTask0),void task0(void)task0Init();whil

11、e(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),在5.1.2小节中,已约定setjmp()返回值是0,longjmp()返回值是1。,恢复task1上下文并

12、跳转,ctmp=,双任务切换模型和程序分析,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 task1(void)task1Init();while(1)task1_program1;ctmp=setjmp(jbTask1);if(ctmp=0)longjmp(jbTas

13、k0);task1_program2;,task 0.1,task 1.1,task 0,task 1,setjmp(jbTask0),在5.1.2小节中,已约定setjmp()返回值是0,longjmp()返回值是1。,ctmp=,目 录,任务切换模型范例分析,双任务切换模型,待解决的问题,setTaskJmp()的实现,待解决的问题,在上一小节的描述中,仅是说明任务正确运行后的模型,若要编写多任务操作系统,还有两个重要问题需要解决。,待解决的问题,在上一小节的描述中,仅是说明任务正确运行后的模型,若要编写多任务操作系统,还有两个重要问题需要解决。,在源代码层次,任务也是一个函数。,当函数在

14、运行期间被中断打断时,将如何处理?,void task0(void)task0Init();while(1)task0_program1;.task0_program2;,中断响应过程中的现场保护与恢复,函数,函数中断过程,堆栈指针与bp,SDCC编译器自动处理压栈出栈,无需软件干预。,返回地址,通用寄存器,中断请求,现场保护,时间,中断响应过程中的现场保护与恢复,中断服务,函数,函数中断过程,中断请求,现场恢复,时间,堆栈指针与bp,返回地址,通用寄存器,函数,现场保护,中断响应过程中的现场保护与恢复,函数,函数中断过程,中断请求,现场保护,时间,保证运行的函数在中断前后,执行结果不变的条件

15、:,如R0 R7、ACC、B、SP、DPL、DPH等寄存器,如函数内的局部变量、计算表达式的中间值,在源代码层次,任务也是一个函数,任务的正确运行条件与函数一致。,中断服务,现场恢复,函数,任务切换中的现场保护与恢复,任务切换过程,任务1,任务0,任务切换,时间,setjmp(jbTask0),longjmp(jbTask1),任务堆栈空间,任务堆栈空间,任务切换中的现场保护与恢复,任务切换过程,任务0,任务切换,时间,任务堆栈空间,每个任务的堆栈须相互独立,互不干扰,任务堆栈空间,任务1,setjmp(jbTask0),longjmp(jbTask1),任务切换中的现场保护与恢复,任务切换过

16、程,任务0,任务切换,任务0,时间,setjmp(jbTask0),longjmp(jbTask1),任务切换,任务堆栈空间,任务堆栈空间,任务1,任务切换互不干扰地运行条件,让任务互不干扰地运行条件:,解决方法:,任务切换过程,任务0,时间,setjmp(jbTask0),longjmp(jbTask1),任务切换,任务切换,任务1,任务0,待解决的问题,在上一小节的描述中,仅是说明任务正确运行后的模型,若要编写多任务操作系统,还有两个重要问题需要解决。,如何让任务运行,事实上,系统在启动时没有一个任务存在,即没有一个任务在运行。而任务的切换必须setjmp()和longjmp()函数配对调

17、用。,task0();,没setjmp(task1),则无法跳转,如何让任务运行,事实上,系统在启动时没有一个任务存在,即没有一个任务在运行。而任务的切换必须setjmp()和longjmp()函数配对调用。,task1();,没setjmp(task0),则无法跳转,如何让任务运行,事实上,系统在启动时没有一个任务存在,即没有一个任务在运行。而任务的切换必须setjmp()和longjmp()函数配对调用。,setTaskJmp();task1();,模拟setjmp()函数,目 录,任务切换模型范例分析,双任务切换模型,待解决的问题,setTaskJmp()的实现,setjmp()的工作内

18、容,若要用setTaskJmp()模拟任务调用setjmp(),需先明白任务调用setjmp()所做的工作。,堆栈指针SP的值增加2,int setjmp(jmp_buf environment);,是保存上下文信息的“缓冲区”,相当于“任务堆栈”,1、每个任务有指定的入口地址;,2、每个任务有各自独立的堆栈空间。,setTaskJmp()函数,setTaskJmp(task0,_GucTaskStks0,_GjbTask0);,task0任务函数的地址,task0任务堆栈的位置,保存task0的上下文信息,setTaskJmp()模拟调用setjmp()函数,setTaskJmp()模拟调用

19、setjmp()函数,模拟setjmp()调用压栈返回地址的操作,目 录,任务切换模型范例分析,双任务切换模型,待解决的问题,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,_GucTaskStks

20、0,GjbTask0);setTaskJmp(task1,_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);,任

21、务切换模型范例分析|任务0,跳转到task1的任务函数,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号