ucos-II 任务调度源码分析(三)

ucos-II并不像linux等操作系统一样提供中断程序处理的框架,更合理的说法是用户必须在自己的中断服务程序中适配ucos的任务调度机制。这个适配就是在OSIntEnter和OSIntExit。ucos-II在中断机制中考虑如下两点设计:

  1. 中断是可以嵌套的,但所有嵌套的中断必须一次处理完;
  2. 当所有嵌套的中断处理完成后,选择优先级最高的任务执行,而非被中断的任务;

ucos-II中中断的例子(STC单片机串口中断):

SerialISR:
    USING 0
    CLR EA
    LCALL_? OSIntEnter
    LCALL_? serial
    LCALL_? OSIntExit
    SETB EA
    POPALL
    RETI

函数OSIntEnter中全局变量OSIntNesting++,表示中断的嵌套程度;

函数OSIntExit完成如下工作:

  1. 如果OSIntNesting为0,即所有的嵌套中断都已经完成,调用OS_SchedNew,获取当前最高优先级的就绪任务;
  2. 如果获取到任务不是当前的任务,调用OSIntCtxSw(定义在OS_CPU_A.ASM中),找到待执行任务的SP进行切换;(其中的机制与普通任务调度的原理一样,见ucos-II 任务调度(二))。

      注:堆栈指针需要SP=SP-4,退回OSIntEnter和OSIntExit两个函数对堆栈的影像。

 

 

posted @ 2013-01-24 09:13  Fredric_2013  阅读(591)  评论(0编辑  收藏  举报