网站大量收购独家精品文档,联系QQ:2885784924

第4章uCOSII的时钟和中断研讨.ppt

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
4.4 小结 1. 在uC/OS-II中,中断服务子程序运行结束之后,系统将会根据情况进行一次中断级的任务调度去运行优先级更高的就绪任务,而不一定要接续运行被中断的任务。 2. uC/OS-II的中断允许嵌套,用全局变量OSIntNesting来记录中断的嵌套数。 3. uC/OS-II的中断服务程序的工作通常是由中断激活的一个任务来完成的。这样的优点是可以使应用程序的设计更为灵活。 4. 在任务中可以用设置临界区的方法来屏蔽中断。设置临界区的宏有3种实现方法。 5. uC/OS-II的时钟通常是一个由硬件计数器定时产生周期性中断信号来实现的,每一次中断叫做一个节拍,其中断服务程序叫做节拍服务程序。 6. uC/OS-II在每一个节拍服务里要遍历系统中的全部任务的任务控制块,把其中记录任务延时时间的成员OSTCBDly减1,并使延时时间到的任务进入就绪态。 7. uC/OS-II有10个函数提供了钩子函数,应用程序设计人员可以在钩子函数中编写一些自己的代码。 8. 在uC/OS-I进行时间管理的函数中,最重要的是延时函数OSTimeDly()和I OSTimeHMSM()。他们的作用不仅仅是使任务的运行停止并等待一段时间,更重要的是,他们都要调用任务调度器进行一次任务调度,这样就使低优先级别的任务有了运行的机会。 术语 缩语、术语 英文全称 解 释 ISR Interrupt service routines 中断服务程序 * * 中断是计算机系统处理异步事件的重要机制。当异步事件发生时,事件通常是通过硬件向CPU发出中断请求的。在一般情况下,CPU响应这个请求后会立即运行中断服务程序来处理该事件。 为了处理任务延时、任务调度等一些与时间有关的事件,任何一个计算机系统都应该有一个系统时钟。与其他计算机系统一样,uc/os-ii的时钟是通过硬件定时器产生定时中断来实现的。 * 中断响应过程:系统接收到中断请求后,如果这时CPU处于中断允许状态(及中断是开放的),系统就会中止正在运行的当前任务,而按照中断向量的指向转而去运行中断服务子程序;当中断服务子程序运行结束后,系统将会根据情况返回到被终止的任务继续运行,或者转向运行另一个具有更高优先级的就绪任务。 uc/os-ii系统允许中断嵌套,即高优先级的中断源的中断请求可以中断低优先级的中断服务程序的运行,为记录中断嵌套的层数,uc/os-ii定义了一个全局变量OSIntNesting。 * 在编写uc/os-ii的中断服务程序时,要用到两个重要的函数OSIntEnter()和OSIntExit()。 函数OSIntEnter()比较简单,它的作用就是把全局变量OSIntNesting加1,从而用它来记录中断嵌套的层数。函数OSIntExit()经常在中断服务程序保护被中断任务的断点数据之后,运行用户中断服务代码之前来调用。 另一个在中断服务程序中要调用的函数叫做退出中断服务函数OSIntExit()。从图4-2可以看到,这个函数在中断嵌套层数计数器为0、调度器未被锁定且从任务就绪表中查找到的最高级就绪任务又不是被中断的任务的条件下将要进行任务切换,否则就返回被中断的服务程序。 * 中断时的栈空间使用量是随中断嵌套的深度而不断增加的,是不确定的,一般方法是定义一个充分大的栈空间,使之不会溢出。但为每个任务都定义一个充分大的栈空间,会导致栈空间的浪费。如果将中断栈区独立出来,单独为它定义一个较大的空间,这样,就可大大减少栈空间的浪费,减少对内存的需求。实际上,这是可行的。在μC/OS-II中,内核为中断嵌套的层数定义了一个全局变量OSIntNesting。系统在进行任务调度时,先要判断OSIntNesting是否为0,如果OSIntNesting不为0,则不进行任务切换。也就是说:在OSIntNesting为1(当前只有一个中断,并且没有嵌套中断)时,如果发生了嵌套的中断(不管嵌套的层数有多深),那么所有嵌套的中断一层一层地都返回,直到OSIntNesting再次为1时止,任务栈是不会切换的,栈指针始终在同一个任务的栈空间中变化。因而,可以为中断嵌套单独定义一个中断嵌套栈。在发生第1次中断时,中断服务程序将栈空间切换到中断嵌套栈,这样,以后发生的嵌套中断就一直使用这个栈空间。在中断返回到第1次中断时,即OSIntNesting为1时,中断服务程序再从中断嵌套栈切换回任务栈。这样就实现了中断任务的切换,减少了内存需求。 * uc/os-ii在运行完中断服务程序后,并不一定返回到被中断的任务上去,而是要进行一次任务调度来决定是返回被中断的任务还是运行一个具有更高优先级的就绪任务,因此系统需要一个中断级任务调度器。 从图4-2的函数OSIntExit()流程图及其源代码中已经

文档评论(0)

502992 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档