UCOS学习笔记(五)中断管理

    中断:应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程
    及编写中断服务函数时,加上OSIntEnter()和OSIntExit
    中断嵌套最大250层

    中断处理流程

    (1)ISR

    (2)在进入临界段之前,关中断。有些处理器进入中断服务程序时会自动关中断,有些则需要用户手动关中断。

    (3)保存CPU上文到中断堆栈

    (4)中断嵌套层数计数值递增

    (5)如果这是嵌套的第一层将中断前的任务的TSP 保存到任务的OS_TCB。指针OSTCBCurPtr 指向中断前的任务的OS_TCB。OSTCBCurPtr->StkPtr 保存为OS_TCB 中偏移量为0 的地址。{OSTCBCurPtr->StkPtr 等价于当前任务的TCB->StkPtr}

    (6)清空中断标志文

    (7)重新开中断(可选)

    (8)调用用户ISR程序

    (9)调用OSIntExit()告诉UCOS中断服务程序已经完成。其中将中断嵌套计数值递减,如果减为0,返回任务级代码,若不为0返回到上一级中断

    (10)如果ISR 使能了一个更低优先级的任务,OSIntExit()返回原任务。

    (11)ISR 返回,恢复原任务的状态


    临界段代码(临界区):需要保证其完成运行的代码,不能被打断,进入和退出临界区的处理在选择直接发布还是延时发布时有条件编译,若是直接发布,进入和退出临界区的方法为关闭和打开中断;而在延时发时,采取的方法是给调度器上锁和解锁。
    在实时系统中,关中断的时间越短越好,长时间关中断可能会导致中断来不及响应而发生重叠,即多次中断被当成一次中断。
    关中断:CPU忽视中断控制器的中断请求,但这些请求会在中断控制器中被挂起直到CPU重新开启中断
    中断响应时间、中断恢复时间、任务延迟时间(中断发生到恢复到任务级代码)
    宏OS_CFG_ISR_POST_DEFERRED_EN来选择直接发布还是延时发布(1为延时发布,0位直接发布)
    直接发布

         
    (1)中断产生
    (2)中断服务程序开始执行。通常中断中包含着任务等待的事件。
    (3)若ISR 使能了低于或等于原任务优先级的任务,ISR结束时,uC/OS-III 返回原任务并从被中断处继续执行。
    (4)若ISR 使能了高于原任务优先级的任务,ISR 结束后,进入调度。uC/OS-III 切换到高优先级任务。
    (5)在直接提交方法中,uC/OS-III 必须保护好临界段(通过关中断方式)。
       延迟发布
        
    (1)中断产生
    (2)ISR 被执行。
    (3)ISR 中调用"post"函数发送信号量或消息给任务。然而,它不是直接发送给任务,而是先发送到中断队列。然后中断处理函数被就绪。这是uC/OS-III 的内部任务且具有最高优先级(优先级为0)。
    (4)ISR 的最后,uC/OS-III 会切换到中断处理任务,它将中断队列中消息发送给任务。在此,我们关闭中断防止在处理中断队列时被另外的中断程序打断。最后,该任务使能中断,锁住调度器,提交信息。信息是在任务级被提交的。这样,就是在任务级完成临界段的处理了。
    (5)当中断处理任务清空中断队列时,它就会将自己停止,重
    新开启调度器,调用调度器选择下一个任务运行。
    (6)如果优先级更高的任务被使能,uC/OS-III 会马上换到该任务。


    使用延迟发布关中断的时间会非常短(且相当固定),但是任务延迟会加长,因为UCOSIII会锁住调度器并访问临界段
    uC/CPU 中提供了测量最大中断时间的功能
    uC/OS-III 的ISR 前序,ISR 后序,OSIntExit(),OSIntCtxSw()操作的时间可以被测量。
    调用OS_TS_GET()也可以测量“post”函数的处理时间。
    只有在处理定时器任务时才会锁调度器。如果定时器任务中创建的定时器不多的话,任务延迟将会很短。uC/OS-III也可以测量锁调度器时间。
    
 

猜你喜欢

转载自blog.csdn.net/a568713197/article/details/83591387