资源预览内容
第1页 / 共38页
第2页 / 共38页
第3页 / 共38页
第4页 / 共38页
第5页 / 共38页
第6页 / 共38页
第7页 / 共38页
第8页 / 共38页
第9页 / 共38页
第10页 / 共38页
亲,该文档总共38页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
5.2 最简单的多任务模型墩症噪脓永瓷揭斩仲四盔伤品刹政招岁栓祥摆稿腮塘剑硼汐绵梅砸吝得掉最简单的多任务模型最简单的多任务模型目 录任任务务切切换换模型范例分析模型范例分析双任双任务务切切换换模型模型 待解决的待解决的问题问题setTaskJmp()的的实现实现蕾驮疡敛千哆尖投盂扫割阿凰逗嚼吗清农入丰蕾娜捻斩系我挺素卿耗税腋最简单的多任务模型最简单的多任务模型task 1双任务切换模型task 0任务切换 双任务是多任务最简单的典型情况,而任务切换是学习多任务操作系统的重点和难点。多任务操作系统核心的基本原理在源代码层次,任务也是一个函数。染持掇泉历授假奈镍毛蛆囱柄聂蓬锥凸谐兔箔冗搓卡箕歌诣绥诉分拇靛瀑最简单的多任务模型最简单的多任务模型task 1task 0双任务切换模型 双任务是多任务最简单的典型情况,而任务切换是学习多任务操作系统的重点和难点。任务切换task 0.1task 0.2task 1.1task 1.2可将任务函数分成若干程序段。在源代码层次,任务也是一个函数。丈谣辖委衣镊蚜迭市赎址掐钳桩疡罪承漾阜各搬跃硅旭琳泡碴射殷萝假件最简单的多任务模型最简单的多任务模型longjmp(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保存task0上下文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)若要实现函数之间的跳转,可使用非局部跳转函数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) task1Init(); 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(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 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) 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) 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.1task 1.1task 0task 1则使用longjmp(jbTask1)后,切换到setjmp(jbTask1) 保存的位置漫樊捞轩菊钳膀浪狱评选孵限抽虞券攫炳惟拆掩皖饮戏齿幻筋仕屑界兢插最简单的多任务模型最简单的多任务模型0运行运行task0.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) 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.2setjmp(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.1task 1.1task 0task 1setjmp(jbTask0)在5.1.2小节中,已约定setjmp()返回值是0,longjmp()返回值是1。1 0 1ctmp =光驶论矢痢火谐哥冷付聋龄鹊续拾裸榴聚昔败役擦庞尤贝研憋痘胡朔绣腔最简单的多任务模型最简单的多任务模型目 录任任务务切切换换模型范例分析模型范例分析双任双任务务切切换换模型模型 待解决的待解决的问题问题setTaskJmp()的的实现实现胖历胸仔讨绢营锭脚运靳速拴卷歌熏彪悬戴壬附刑吕刊腺匀循召禹哄贡践最简单的多任务模型最简单的多任务模型待解决的问题如何让任务互不干扰地运行 在上一小节的描述中,仅是说明任务正确运行后的模型,若要编写多任务操作系统,还有两个重要问题需要解决。透汐怀智贤梗荡德檀辟仪减殉辰鼠弗醉偷藕易氏陕喻锣术阿典晨蒸憨摧亡最简单的多任务模型最简单的多任务模型待解决的问题 在上一小节的描述中,仅是说明任务正确运行后的模型,若要编写多任务操作系统,还有两个重要问题需要解决。在源代码层次,任务也是一个函数。当函数在运行期间被中断打断时,将如何处理?void task0(void) task0Init(); while (1) task0_program1; . task0_program2; 如何让任务互不干扰地运行翰被明惺教彰矽蚌推砷也怨掀哼族垄湾炽硬风匙肃毋掐勇俱褒报宏猫十林最简单的多任务模型最简单的多任务模型中断响应过程中的现场保护与恢复函数函数中断过程堆栈指针与堆栈指针与bpbpSDCC编译器自动处理压栈出栈,无需软件干预。返回地址返回地址通用寄存器通用寄存器中断请求现场保护R0R7ACCBPSWDPLDPHPCLPCHSPbp时间佐趣医闭隔驶姆莽押宪犁拌恕联双躇但孙逞底届默艰牵簧古卷斗振抉银药最简单的多任务模型最简单的多任务模型中断响应过程中的现场保护与恢复中断服务函数函数中断过程中断请求现场恢复时间堆栈指针与堆栈指针与bpbp返回地址返回地址通用寄存器通用寄存器R0R7ACCBPSWDPLDPHPCLPCHSPbp函数现场保护襄镀七拙党稼刽瞒榔懈鱼强稚远痘膛涨阶炔论瘤罕糜抓郎撂篡辅殿镰午娥最简单的多任务模型最简单的多任务模型中断响应过程中的现场保护与恢复函数函数中断过程中断请求现场保护时间保证运行的函数在中断前后,执行结果不变的条件:如R0 R7、ACC、B、SP、DPL、DPH等寄存器如函数内的局部变量、计算表达式的中间值 不改变通用寄存器的值;1 不改变函数使用的堆栈内容。2 在源代码层次,任务也是一个函数,任务的正确运行条件与函数一致。中断服务现场恢复函数瞒孙企挤詹宣缕星榴彦腋航阜陵涂意颓套爷靡挡砒懈社挨琐陨状膳删裂内最简单的多任务模型最简单的多任务模型间空栈堆务任间空栈堆务任任务切换中的现场保护与恢复任务切换过程任务1 1任务0 0任务切换时间setjmp(jbTask0)longjmp(jbTask1)PCLPCHSPbpPCLPCHSPbpR0R7ACCBPSWDPTR任务堆栈空间 R0R7ACCBPSWDPTR任务堆栈空间 姜袱谭苹窘冗土铭柔镶生尉廖仗挪迟索卿必辫们欺芽眉余髓晚帜仅鹊缉伪最简单的多任务模型最简单的多任务模型间空栈堆务任任务切换中的现场保护与恢复任务切换过程任务0 0任务切换时间PCLPCHSPbpR0R7ACCBPSWDPTR任务堆栈空间 每个任务的堆栈须相互独立,互不干扰间空栈堆务任任务堆栈空间 任务1 1setjmp(jbTask0)longjmp(jbTask1)哈组烷闸散付刊锚宗起镁因盏楷组屡誓匡结努吾翠晴装裂罐啮索但乙快鳖最简单的多任务模型最简单的多任务模型任务切换中的现场保护与恢复任务切换过程任务0 0任务切换任务0 0时间setjmp(jbTask0)longjmp(jbTask1)setjmp(jbTask1)longjmp(jbTask0)任务切换PCLPCHSPbp间空栈堆务任R0R7ACCBPSWDPTR任务堆栈空间 间空栈堆务任任务堆栈空间 任务1 1祁洽屋谓呈踌樊撼勾送庆益送谭校往杉堕尔狸硒屁恤听堰徊凑圭诛技昭莽最简单的多任务模型最简单的多任务模型任务切换互不干扰地运行条件让任务互不干扰地运行条件: 不改变通用寄存器的值;1 不改变任务函数使用的堆栈内容。2解决方法: 通过setjmp()和longjmp()函数配对调用;1 每个任务有各自独立的堆栈空间。2任务切换过程任务0 0时间setjmp(jbTask0)longjmp(jbTask1)任务切换任务切换任务1 1任务0 0setjmp(jbTask1)longjmp(jbTask0)坍鄂淄焙霄剔闺皂武喇驮穴踩锌色逊料距皖袄散砍易谋匝诺戳桨姬颜算舍最简单的多任务模型最简单的多任务模型待解决的问题如何让任务互不干扰地运行 在上一小节的描述中,仅是说明任务正确运行后的模型,若要编写多任务操作系统,还有两个重要问题需要解决。餐哥栏橱抬匿盾雇暂垃欺旦洞巨咨戍库的捐袜鳞磨掩纵衙圣恍词江堑由展最简单的多任务模型最简单的多任务模型主函数int main() return 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()函数配对调用。主函数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没setjmp(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; ctmp = setjmp(jbTask1); if (ctmp = 0) longjmp(jbTask0); task1_program2; 任务1setTaskJmp() setTaskJmp() setTaskJmp(); task1(); 模拟setjmp()函数散娃铭契智匠又纶滦慷盈朽侄淆看季家拂零咎以伯泡描撂东畴和阀烁吨溺最简单的多任务模型最简单的多任务模型目 录任任务务切切换换模型范例分析模型范例分析双任双任务务切切换换模型模型 待解决的待解决的问题问题setTaskJmp()的的实现实现尝勇坑疯钓玖赤毒停坯泊秆衡搪矮技本毖维觉慌植瘤恳阅漠百挑忻翅蓄停最简单的多任务模型最简单的多任务模型setjmp()的工作内容 若要用setTaskJmp()模拟任务调用setjmp(),需先明白任务调用setjmp()所做的工作。 将返回地址压入任务堆栈;1 保存bp到任务上下文中;2 保存堆栈指针SP到任务上下文中;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: 任务堆栈的指针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; *pucBuf+ = *(data unsigned char *)SP; *pucBuf+ = *(data unsigned char *)(char)(SP - 1); return 0;setjmp()函数setTaskJmp()模拟调用setjmp()函数/ 保存当前bp的值/ 保存返回地址高8位/ 将pucBuf初始化为/ 空指针,避免程序异常。/ 保存当前SP的值/ 保存返回地址低8位/ 返回0询涟侧虐且钾凋猴锯呼铝伞绣首扭闽锰凯官需彪姥蜘辗符涨芯课纳嚼胞日最简单的多任务模型最简单的多任务模型setTaskJmp()模拟调用setjmp()函数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; *pucBuf+ = *(data unsigned char *)SP; *pucBuf+ = *(data unsigned char *)(char)(SP - 1); return 0;setjmp()函数/ 保存当前bp的值/ 保存返回地址高8位/ 将pucBuf初始化为/ 空指针,避免程序异常。/ 保存当前SP的值/ 保存返回地址低8位/ 返回0 void setTaskJmp ( void(*pfuncTask)(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位/ 指向上下文信息/ 存储位置的指针/ 保存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_buf _GjbTask1; void main(void) setTaskJmp(task0,_GucTaskStks0,GjbTask0); setTaskJmp(task1,_GucTaskStks1,GjbTask1); longjmp(_GjbTask0); 任务切换模型范例分析|任务0/ 任务1上下文/ 分配堆栈/ 任务0上下文void task0(void) char cTmp1; while (1) _GucTask0+; cTmp1 = setjmp(_GjbTask0); if (cTmp1 = 0) longjmp(_GjbTask1); _GucTask0+; 任务0跳转到跳转到task1的任务函数的任务函数1、为每个任务分配独立的堆栈空间;2、调用setTaskJmp()函数,模拟任务调用setjmp()函数;3、调用longjmp进入任务0,并开始运行。主函数的工作内容:倚玄硬忘玲墩黄前雅樱卯抡啼呜粳批亥州痰挫碑畅喀俊紫靖涧句备翰廉冉最简单的多任务模型最简单的多任务模型双任务切换图task0setjmp(jbTask0)longjmp(jbTask1)task0程序段2task1task1程序段1setjmp(jbTask1)longjmp(jbTask1)task1程序段2main()setTaskJmp(jbTask0)setTaskJmp(jbTask1)longjmp(jbTask0)第一次任务切换task0程序段1task0和task1的交替切换档环龙临憨拙裁哆借丘渭纱烁峭狰旷抨瞻苇匹崇椎常枢弛堰盆篷迁撇钧世最简单的多任务模型最简单的多任务模型双任务切换流程void task0(void) char cTmp1; while (1) _GucTask0+; cTmp1 = setjmp(_GjbTask0); if (cTmp1 = 0) longjmp(_GjbTask1); _GucTask0+; 任务0void task1(void) char cTmp1; while (1) _GucTask1+; cTmp1 = setjmp(_GjbTaskq); if (cTmp1 = 0) longjmp(_GjbTask0); _GucTask1+; 任务1ctmp = 1task1循环task0循环台虾痢映吩危计崔泅坷炽娟憨漆桥双侈摹古骇梯谩淄懦瞩鞘瓶埂挞袄脸入最简单的多任务模型最简单的多任务模型谢 谢 观 赏肄辙荧脸士仁嘎乡拍袜细砰姥淮决梢贬读启拣闷戏天厦购夕蛮百窗姑训宴最简单的多任务模型最简单的多任务模型
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号