- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
“备”则“倍” 有准备、有规划的人生更精彩! 任务的调度(续) 2. 任务切换宏OS_TASK_SW() SP R1 R2 … … Rn PC PSW R1 R2 …… Rn PC PSW R1 R2 …… Rn PC PSW CPU的各寄存器 被中止任务TCB 待运行任务TCB OSTCBStkPtr OSTCBStkPtr 被中止任务堆栈 待运行任务堆栈 图2-11 调度器进行 任务切换时的动作 断点:任务被中止运行时的位置。 断点数据:当时存放在CPU的各寄存器中的数据。 “无缝”接续:当任务恢复运行时,必须在断点处以断点数据作为初始数据接着运行。 正确地恢复断点数据的关键: CPU的堆栈指针SP是否有正确的指向。 在系统中存在多个任务时,如果在恢复断点数据使用另一个任务的任务堆栈指针(存放在TCB的OSTCBStkPtr中)来改变CPU的堆栈指针SP,那么CPU运行的就不是刚才被中止运行的任务,而使另一个任务了,也就是实现任务切换了。 任务的调度(续) 2. 任务切换宏OS_TASK_SW()-续 为了完成图2-11的操作,要依次做如下7项工作: 把被中止任务的断点指针保存到任务堆栈中; 把CPU通用寄存器的内容保存到任务堆栈中; 把被中止任务的任务堆栈指针保存到该任务的任务控制块的OSTCBStkPtr中; 获得待运行任务的任务控制块; 使CPU通过任务控制块获得待运行任务的任务堆栈指针; 把待运行任务堆栈中通用寄存器的内容恢复到CPU的通用寄存器中; 使CPU获得待运行任务的断点指针(该指针是待运行任务在上一次被调度器中止运行时保留在任务堆栈中的)。 用压栈指令把CPU通用寄存器R1、R2...压入堆栈; //把SP保存在中止任务控制块中 OSTCBCur - OSTCBStkPtr = SP; //使系统获得待运行任务控制块 OSTCBCur = OSTCBHighRdy; //把待运行任务堆栈指针赋给SP SP = OSTCBHighRdy - OSTCBStkPtr; 用出栈指令把R1、R2...弹入CPU的通用寄存器; 2. 任务切换宏OS_TASK_SW()-续 任务的调度(续) 任务切换过程 获得待运行任务的任务控制块 恢复待运行任务的运行环境 处理器的PC=任务堆栈中的断点地址 处理器的SP=任务块中保存的SP 如何获得待运行任务的任务控制块? 根据就绪表获得待运行任务的任务控制块指针 其实,调度器在进行调度时,在这个位置还要进行一下判断:究竟待运行任务是否为当前任务,如果是,则不切换;如果不是才切换,而且还要保存被中止任务的运行环境。 给调度器上锁 OSSchedlock():给调度器上锁函数,用于禁止任务调度,保持对CPU的控制权(即使有优先级更高的任务进入了就绪态); OSSchedUnlock():给调度器开锁函数,当任务完成后调用此函数,调度重新得到允许; 当低优先级的任务要发消息给多任务的邮箱、消息队列、信号量时,它不希望高优先级的任务在邮箱、队列和信号量还没有得到消息之前就取得了CPU的控制权,此时,可以使用调度器上锁函数。 谢 谢! 1.正确认识自我,尊重自我——人职和谐的基础 2.充分了解职场,努力做到人职匹配 3.适应社会需求与发展,选择最能发挥自己能力特长的职业。 没有最好的职业,只有最适合自己的职业,适合自己的才是最好的。 1.职业生涯开发与管理的观点是:只要开始,永远不晚; 只要进步,总有空间。 2.在职业生涯的道路上,重要的不是目前所处的位置, 而是迈出下一步的方向。 * * 1、系统在调用函数OSInit()对uC/OS-II系统进行初始化时,先在RAM中建立一个OS_TCB结构类型的数组OSTCBTbl[ ],每个数组元素就是一个任务控制块,然后把这些控制块链接成一个如图所示的链表。由于链表中的这些控制块还没有与具体任务相关联,因此这个链表叫做空任务块链表。 2、从图中可以看到,uC/OS-II初始化时建立的空任务链表元素一共是OS_MAX_TASKS+OS_N_SYS_TASKS个。其中定义在文件OS_CFG.H中的常数OS_MAX_TASKS 指明了用户任务的最大数目;而定义在文件UCOS_II.H中的常数OS_N_SYSTASKS指明了系统任务的数目(在图中,其值为2:一个空闲任务,一个统计任务)。 3、每当应用程序调用系统函数OSTaskCreate()或OSTaskCreateExt()创建一个任务时,系统就会将任务控制块链表头指针OSTCBFreeList指向的任务控制块分配给该任务。在给任务控制块中的各成员赋值后,就按任务控制块链表的头指针OSTCBList 将其加入到任务控制块链表中。 * 1、
您可能关注的文档
最近下载
- 江苏省连云港市东海县实验中学2024-2025学年九年级上学期第一次月考语文试题(含答案).pdf VIP
- Sharp夏普扫描仪DW-D20HZ-W DW-D20NZW3 CF-20HZW 3用户手册.pdf
- 2024-2025学年九年级语文上学期第一次月考试卷附答案解析.pdf VIP
- C站JUE-85中文操作说明书-07-9-10.pdf VIP
- 智能融合终端通用技术规范2025.docx
- 2024年中级经济师《经济基础》真题卷(1116下午).pdf VIP
- 660MW发电机内冷水系统漏氢原因分析处理.pdf VIP
- 管道命名及代码含义.docx VIP
- 认知心理学第四章记忆解析.ppt VIP
- 外墙抹灰安全技术交底.pdf VIP
文档评论(0)