欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    简单的多任务模型.ppt

    • 资源ID:6440726       资源大小:1.33MB        全文页数:38页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    简单的多任务模型.ppt

    5.2 最简单的多任务模型,目 录,任务切换模型范例分析,双任务切换模型,待解决的问题,setTaskJmp()的实现,task 1,双任务切换模型,保存task0上下文,恢复task1上下文并跳转,保存task1上下文,恢复task0上下文并跳转,task 0,任务切换,双任务是多任务最简单的典型情况,而任务切换是学习多任务操作系统的重点和难点。,多任务操作系统核心的基本原理,在源代码层次,任务也是一个函数。,双任务切换模型,双任务是多任务最简单的典型情况,而任务切换是学习多任务操作系统的重点和难点。,任务切换,task 0.1,task 0.2,task 1.1,task 1.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()。,双任务切换模型|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和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上下文,恢复task1上下文并跳转,保存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=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(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上下文,恢复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=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),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,保存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(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),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,setjmp(jbTask0),在小节中,已约定setjmp()返回值是0,longjmp()返回值是1。,ctmp=,目 录,任务切换模型范例分析,双任务切换模型,待解决的问题,setTaskJmp()的实现,待解决的问题,在上一小节的描述中,仅是说明任务正确运行后的模型,若要编写多任务操作系统,还有两个重要问题需要解决。,待解决的问题,在上一小节的描述中,仅是说明任务正确运行后的模型,若要编写多任务操作系统,还有两个重要问题需要解决。,在源代码层次,任务也是一个函数。,当函数在运行期间被中断打断时,将如何处理?,void task0(void)task0Init();while(1)task0_program1;.task0_program2;,中断响应过程中的现场保护与恢复,函数中断过程,堆栈指针与bp,SDCC编译器自动处理压栈出栈,无需软件干预。,返回地址,通用寄存器,中断响应过程中的现场保护与恢复,函数中断过程,堆栈指针与bp,返回地址,通用寄存器,中断响应过程中的现场保护与恢复,函数中断过程,保证运行的函数在中断前后,执行结果不变的条件:,如R0 R7、ACC、B、SP、DPL、DPH等寄存器,如函数内的局部变量、计算表达式的中间值,在源代码层次,任务也是一个函数,任务的正确运行条件与函数一致。,任务切换中的现场保护与恢复,任务切换过程,setjmp(jbTask0),longjmp(jbTask1),任务堆栈空间,任务堆栈空间,任务切换中的现场保护与恢复,任务切换过程,任务堆栈空间,任务堆栈空间,setjmp(jbTask0),longjmp(jbTask1),任务切换中的现场保护与恢复,任务切换过程,setjmp(jbTask0),longjmp(jbTask1),任务堆栈空间,任务堆栈空间,任务切换互不干扰地运行条件,让任务互不干扰地运行条件:,解决方法:,任务切换过程,setjmp(jbTask0),longjmp(jbTask1),待解决的问题,在上一小节的描述中,仅是说明任务正确运行后的模型,若要编写多任务操作系统,还有两个重要问题需要解决。,如何让任务运行,事实上,系统在启动时没有一个任务存在,即没有一个任务在运行。而任务的切换必须setjmp()和longjmp()函数配对调用。,task0();,如何让任务运行,事实上,系统在启动时没有一个任务存在,即没有一个任务在运行。而任务的切换必须setjmp()和longjmp()函数配对调用。,task1();,如何让任务运行,事实上,系统在启动时没有一个任务存在,即没有一个任务在运行。而任务的切换必须setjmp()和longjmp()函数配对调用。,setTaskJmp();task1();,目 录,任务切换模型范例分析,双任务切换模型,待解决的问题,setTaskJmp()的实现,setjmp()的工作内容,若要用setTaskJmp()模拟任务调用setjmp(),需先明白任务调用setjmp()所做的工作。,堆栈指针SP的值增加2,int setjmp(jmp_buf environment);,是保存上下文信息的“缓冲区”,相当于“任务堆栈”,1、每个任务有指定的入口地址;,2、每个任务有各自独立的堆栈空间。,setTaskJmp()函数,setTaskJmp(task0,_GucTaskStks0,_GjbTask0);,task0任务函数的地址,task0任务堆栈的位置,保存task0的上下文信息,setTaskJmp()模拟调用setjmp()函数,setTaskJmp()模拟调用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,_GucTaskStks0,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);,任务切换模型范例分析|任务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,谢 谢 观 赏,

    注意事项

    本文(简单的多任务模型.ppt)为本站会员(小飞机)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开