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两个函数对堆栈的影像。

 

 

你可能感兴趣的:(源码分析)