最简单的多任务模型.ppt

上传人:本田雅阁 文档编号:2740821 上传时间:2019-05-10 格式: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 上下文并跳转,双任务切换模型|set

4、jmp和longjmp的作用,保存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上下文,恢复t

5、ask1上下文并跳转,保存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(); wh

6、ile (1) task1_program1; ctmp = 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;

7、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都 初始化完成,双任务切换模型和程序分析,保存task0上下文,恢复task1上下文并跳转,保存task1上下文,恢复ta

8、sk0上下文并跳转,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 = setjmp(jbTask1

9、); 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(jbTask0),longjmp(jbTask0),void task0(void) task0Init(); while (1) task0_p

10、rogram1; 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,则使用longjmp(jbTask1)后, 切换到setjmp(jbTask1) 保存的位置,0,运行task0.

11、1,保存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 task1(void) task1Init(); while (1) task1_program1; ctmp = setjmp(jbTask

12、1); 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 上下文并跳转,ctmp =,双任务切换模型和程序分析,task 0.2,task 1.2,setjmp(jbTask1),longjmp(jbTask1),longjmp(jbTask0),void task0(void) task0Init(); while (1) task0_progr

13、am1; 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。,

14、ctmp =,目 录,任务切换模型范例分析,双任务切换模型,待解决的问题,setTaskJmp()的实现,待解决的问题,在上一小节的描述中,仅是说明任务正确运行后的模型,若要编写 多任务操作系统,还有两个重要问题需要解决。,待解决的问题,在上一小节的描述中,仅是说明任务正确运行后的模型,若要编写 多任务操作系统,还有两个重要问题需要解决。,在源代码层次,任务也是一个函数。,当函数在运行期间被中断打断时,将如何处理?,void task0(void) task0Init(); while (1) task0_program1; . task0_program2; ,中断响应过程中的现场保护与恢复

15、,函数,函数中断过程,堆栈指针与bp,SDCC编译器自动处理压栈出栈,无需软件干预。,返回地址,通用寄存器,中断请求,现场保护,时 间,中断响应过程中的现场保护与恢复,中断服务,函数,函数中断过程,中断请求,现场恢复,时 间,堆栈指针与bp,返回地址,通用寄存器,函数,现场保护,中断响应过程中的现场保护与恢复,函数,函数中断过程,中断请求,现场保护,时 间,保证运行的函数在中断前后,执行结果不变的条件:,如R0 R7、ACC、B、SP、DPL、DPH等寄存器,如函数内的局部变量、计算表达式的中间值,在源代码层次,任务也是一个函数, 任务的正确运行条件与函数一致。,中断服务,现场恢复,函数,任务

16、切换中的现场保护与恢复,任务切换过程,任务 1,任务0,任务切换,时 间,setjmp(jbTask0),longjmp(jbTask1),任务堆栈空间,任务堆栈空间,任务切换中的现场保护与恢复,任务切换过程,任务0,任务切换,时 间,任务堆栈空间,每个任务的堆栈须 相互独立,互不干扰,任务堆栈空间,任务 1,setjmp(jbTask0),longjmp(jbTask1),任务切换中的现场保护与恢复,任务切换过程,任务0,任务切换,任务 0,时 间,setjmp(jbTask0),longjmp(jbTask1),任务切换,任务堆栈空间,任务堆栈空间,任务 1,任务切换互不干扰地运行条件,让

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

18、jmp()和longjmp()函数配对调用。,task1();,没setjmp(task0), 则无法跳转,如何让任务运行,事实上,系统在启动时没有一个任务存在,即没有一个任务在运行。 而任务的切换必须setjmp()和longjmp()函数配对调用。,setTaskJmp(); task1(); ,模拟setjmp()函数,目 录,任务切换模型范例分析,双任务切换模型,待解决的问题,setTaskJmp()的实现,setjmp()的工作内容,若要用setTaskJmp()模拟任务调用setjmp(),需先明白 任务调用setjmp()所做的工作。,堆栈指针SP的值增加2,int setjmp

19、( jmp_buf environment );,是保存上下文信息的“缓冲区”,相当于“任务堆栈”,1、每个任务有指定的入口地址;,2、每个任务有各自独立的堆栈空间。,setTaskJmp()函数,setTaskJmp( task0, _GucTaskStks0, _GjbTask0);,task0任务函数的地址,task0任务堆栈的位置,保存task0的上下文信息,setTaskJmp()模拟调用setjmp()函数,setTaskJmp()模拟调用setjmp()函数,模拟setjmp()调用压栈返回地址的操作,目 录,任务切换模型范例分析,双任务切换模型,待解决的问题,setTaskJm

20、p()的实现,任务切换模型范例分析|主函数,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(task1,_GucTaskStks1,GjbTask1); longjmp(_Gj

21、bTask0); ,主函数的工作内容:,跳转到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的任务函数,1、为每个任务分配独立的堆栈空间; 2、调用setTas

22、kJmp()函数,模拟任务调用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备18001539号-1