最简单的多任务模型ppt课件_第1页
最简单的多任务模型ppt课件_第2页
最简单的多任务模型ppt课件_第3页
最简单的多任务模型ppt课件_第4页
最简单的多任务模型ppt课件_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、5.2 最简单的多任务模型目 录任务切换模型范例分析任务切换模型范例分析双任务切换模型双任务切换模型 待解决的问题待解决的问题setTaskJmp()的实现task 1双任务切换模型task 0任务切换 双任务是多任务最简单的典型情况,而任务切换是学习多任务操作系统的重点和难点。多任务操作系统核心的基本原理在源代码层次,任务也是一个函数。task 1task 0双任务切换模型 双任务是多任务最简单的典型情况,而任务切换是学习多任务操作系统的重点和难点。任务切换task 0.1task 0.2task 1.1task 1.2可将任务函数分成若干程序段。在源代码层次,任务也是一个函数。longjm

2、p(jbTask0)setjmp(jbTask1)longjmp(jbTask1)setjmp(jbTask0)双任务切换模型|setjmp和longjmp的作用 双任务是多任务最简单的典型情况,而任务切换是学习多任务操作系统的重点和难点。任务切换task 0.1task 0.2task 1.1task 1.2若要实现函数之间的跳转,可使用非局部跳转函数setjmp()和longjmp()。双任务切换模型|setjmp和longjmp的作用 双任务是多任务最简单的典型情况,而任务切换是学习多任务操作系统的重点和难点。任务切换task 0.1task 0.2task 1.1task 1.2保存t

3、ask0上下文setjmp(jbTask1)longjmp(jbTask1)setjmp(jbTask0)longjmp(jbTask0)若要实现函数之间的跳转,可使用非局部跳转函数setjmp()和longjmp()。恢复task1上下文并跳转双任务切换模型|setjmp和longjmp的作用 双任务是多任务最简单的典型情况,而任务切换是学习多任务操作系统的重点和难点。任务切换task 0.1task 0.2task 1.1task 1.2setjmp(jbTask1)longjmp(jbTask1)setjmp(jbTask0)longjmp(jbTask0)若要实现函数之间的跳转,可使用

4、非局部跳转函数setjmp()和longjmp()。task 0.1task 1.1双任务切换模型和程序分析任务切换task 0.2task 1.2setjmp(jbTask1)longjmp(jbTask1)setjmp(jbTask0)longjmp(jbTask0)task 0task 1void task0(void) task0Init(); while (1) task0_program1; ctmp = setjmp(jbTask0); if (ctmp = 0) longjmp(jbTask1); task0_program2; void task1(void) task1In

5、it(); while (1) task1_program1; ctmp = setjmp(jbTask1); if (ctmp = 0) longjmp(jbTask0); task1_program2; 双任务切换模型和程序分析task 0.2task 1.2setjmp(jbTask1)longjmp(jbTask1)setjmp(jbTask0)longjmp(jbTask0)void task0(void) task0Init(); while (1) task0_program1; ctmp = setjmp(jbTask0); if (ctmp = 0) longjmp(jbTa

6、sk1); task0_program2; void task1(void) task1Init(); while (1) task1_program1; ctmp = setjmp(jbTask1); if (ctmp = 0) longjmp(jbTask0); task1_program2; task 0.1task 1.1task 0task 1任务0和1都初始化完成双任务切换模型和程序分析task 0.2task 1.2setjmp(jbTask1)longjmp(jbTask1)setjmp(jbTask0)longjmp(jbTask0)void task0(void) task

7、0Init(); 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.1task 1.1task 0task 1任务0和1都已运行,并保存了各自的上下文双任务切换模型和程序分析task

8、0.2task 1.2setjmp(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); if (ctmp = 0) longj

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

10、longjmp(jbTask1); task0_program2; void task1(void) task1Init(); while (1) task1_program1; ctmp = setjmp(jbTask1); if (ctmp = 0) longjmp(jbTask0); task1_program2; task 0.1task 1.1task 0task 1setjmp(jbTask0)在5.1.2小节中,已约定setjmp()返回值是0,longjmp()返回值是1。恢复task1上下文并跳转1ctmp =双任务切换模型和程序分析task 0.2task 1.2setjm

11、p(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(jbTask0); task1_program2; ta

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

13、。当函数在运行期间被中断打断时,将如何处理?void task0(void) task0Init(); while (1) task0_program1; . task0_program2; 如何让任务互不干扰地运行中断响应过程中的现场保护与恢复函数函数中断过程堆栈指针与堆栈指针与bpbpSDCC编译器自动处理压栈出栈,无需软件干预。返回地址返回地址通用寄存器通用寄存器中断请求现场保护R0R7ACCBPSWDPLDPHPCLPCHSPbp时间中断响应过程中的现场保护与恢复中断服务函数函数中断过程中断请求现场恢复时间堆栈指针与堆栈指针与bpbp返回地址返回地址通用寄存器通用寄存器R0R7ACCB

14、PSWDPLDPHPCLPCHSPbp函数现场保护中断响应过程中的现场保护与恢复函数函数中断过程中断请求现场保护时间保证运行的函数在中断前后,执行结果不变的条件:如R0 R7、ACC、B、SP、DPL、DPH等寄存器如函数内的局部变量、计算表达式的中间值 不改变通用寄存器的值;1 不改变函数使用的堆栈内容。2 在源代码层次,任务也是一个函数,任务的正确运行条件与函数一致。中断服务现场恢复函数间空栈堆务任间空栈堆务任任务切换中的现场保护与恢复任务切换过程义务1任务0任务切换时间setjmp(jbTask0)longjmp(jbTask1)PCLPCHSPbpPCLPCHSPbpR0R7ACCBP

15、SWDPTR任务堆栈空间 R0R7ACCBPSWDPTR任务堆栈空间 间空栈堆务任任务切换中的现场保护与恢复任务切换过程任务0任务切换时间PCLPCHSPbpR0R7ACCBPSWDPTR任务堆栈空间 每个任务的堆栈须相互独立,互不干扰间空栈堆务任任务堆栈空间 义务1setjmp(jbTask0)longjmp(jbTask1)任务切换中的现场保护与恢复任务切换过程任务0任务切换义务0时间setjmp(jbTask0)longjmp(jbTask1)setjmp(jbTask1)longjmp(jbTask0)任务切换PCLPCHSPbp间空栈堆务任R0R7ACCBPSWDPTR任务堆栈空间

16、间空栈堆务任任务堆栈空间 义务1任务切换互不干扰地运行条件让任务互不干扰地运行条件: 不改变通用寄存器的值;1 不改变任务函数使用的堆栈内容。2解决方法: 通过setjmp()和longjmp()函数配对调用;1 每个任务有各自独立的堆栈空间。2任务切换过程任务0时间setjmp(jbTask0)longjmp(jbTask1)任务切换任务切换义务1义务0setjmp(jbTask1)longjmp(jbTask0)待解决的问题如何让任务互不干扰地运行 在上一小节的描述中,仅是说明任务正确运行后的模型,若要编写多任务操作系统,还有两个重要问题需要解决。主函数int main() return

17、0;如何让任务运行 事实上,系统在启动时没有一个任务存在,即没有一个任务在运行。而任务的切换必须setjmp()和longjmp()函数配对调用。void task0(void) task0Init(); while (1) task0_program1; ctmp = setjmp(jbTask0); if (ctmp = 0) longjmp(jbTask1); task0_program2; 任务0task0();没setjmp(task1),则无法跳转如何让任务运行 事实上,系统在启动时没有一个任务存在,即没有一个任务在运行。而任务的切换必须setjmp()和longjmp()函数配对

18、调用。主函数int main() return 0;task1();void task0(void) task0Init(); while (1) task0_program1; ctmp = setjmp(jbTask0); if (ctmp = 0) longjmp(jbTask1); task0_program2; 任务0void task1(void) task1Init(); while (1) task1_program1; ctmp = setjmp(jbTask1); if (ctmp = 0) longjmp(jbTask0); task1_program2; 任务1没set

19、jmp(task0),则无法跳转如何让任务运行 事实上,系统在启动时没有一个任务存在,即没有一个任务在运行。而任务的切换必须setjmp()和longjmp()函数配对调用。主函数int main() return 0;void task0(void) task0Init(); while (1) task0_program1; ctmp = setjmp(jbTask0); if (ctmp = 0) longjmp(jbTask1); task0_program2; 任务0void task1(void) task1Init(); while (1) task1_program1; ctm

20、p = setjmp(jbTask1); if (ctmp = 0) longjmp(jbTask0); task1_program2; 任务1setTaskJmp() setTaskJmp() setTaskJmp(); task1(); 模拟setjmp()函数目 录任务切换模型范例分析任务切换模型范例分析双任务切换模型双任务切换模型 待解决的问题待解决的问题setTaskJmp()的实现setjmp()的工作内容 若要用setTaskJmp()模拟任务调用setjmp(),需先明白任务调用setjmp()所做的工作。 将返回地址压入任务堆栈;1 保存bp到任务上下文中;2 保存堆栈指针S

21、P到任务上下文中;3 保存返回地址到任务上下文中。4堆栈指针SP的值增加2int setjmp( jmp_buf environment );是保存上下文信息的“缓冲区”,相当于“任务堆栈”1、每个任务有指定的入口地址;2、每个任务有各自独立的堆栈空间。setTaskJmp()函数名称名称setTaskJmp()函数原型函数原型void setTaskJmp(void (* pfuncTask)(void), idata unsigned char *pucStk, jmp_buf jbTaskContext)输入参数输入参数pfuncTask: 指向任务函数的指针pucStk: 任务堆栈的指

22、针jbTaskContext: 任务上下文的存储位置返回值返回值NONE描述描述模拟创建任务函数setTaskJmp( task0, _GucTaskStks0, _GjbTask0);task0任务函数的地址task0任务堆栈的位置保存task0的上下文信息extern unsigned char bp;char setjmp (jmp_buf jbBuf) data unsigned char *pucBuf = (data void *)0; pucBuf = (data unsigned char *)jbBuf; *pucBuf+ = bp; *pucBuf+ = SP; *pucB

23、uf+ = *(data unsigned char *)SP; *pucBuf+ = *(data unsigned char *)(char)(SP - 1); return 0;setjmp()函数setTaskJmp()模拟调用setjmp()函数/ 保存当前bp的值/ 保存返回地址高8位/ 将pucBuf初始化为/ 空指针,避免程序异常。/ 保存当前SP的值/ 保存返回地址低8位/ 返回0setTaskJmp()模拟调用setjmp()函数extern unsigned char bp;char setjmp (jmp_buf jbBuf) data unsigned char *p

24、ucBuf = (data void *)0; pucBuf = (data unsigned char *)jbBuf; *pucBuf+ = bp; *pucBuf+ = SP; *pucBuf+ = *(data unsigned char *)SP; *pucBuf+ = *(data unsigned char *)(char)(SP - 1); return 0;setjmp()函数/ 保存当前bp的值/ 保存返回地址高8位/ 将pucBuf初始化为/ 空指针,避免程序异常。/ 保存当前SP的值/ 保存返回地址低8位/ 返回0 void setTaskJmp ( void(*pfu

25、ncTask)(void), uchar *pucStk, jmp_buf TaskContext ) idata uchar *pucBuf = (data void *)0; *pucBuf = (uchar *) jbTaskContext; *pucBuf+ = 0; *pucBuf+ = (uchar *) (pucStk+2); *pucBuf+ = (uint) pfuncTask) / 256; *pucBuf = (uint) pfuncTask)%256 ;setTaskJmp()函数/ 指向jbTaskContex数组/ 保存返回地址高8位/ 指向上下文信息/ 存储位置的

26、指针/ 保存SP,SP + 2保存返回地址/ 保存返回地址低8位/ 保存bp模拟模拟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,_GucTaskStks0,GjbTask0); setTaskJmp(task1,_GucTaskStks1,GjbTask1); longjmp(_GjbTask0); / 任务1上下文/ 分配堆栈/ 任务0上下文主函数的工作内容:跳转到跳转到task0的任务函数的任务函数static idata uchar _GucTaskStks232; static jmp_buf _GjbTask0; static jmp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论