CMSIS-RTOS 中断处理Interrupt Handling

RTOS中断处理Interrupt Handling

在RTOS中使用信号来触发线程间的行为是比较简单和高效的,而对于Cortex-M微控制器来讲,从中断源获取信号来触发线程同样是一种重要的方式。虽然在中断服务程序ISR中运行一段代码也可以,但在RTOS系统中,在中断运行的时间越短越好,因为太长的时间会延长定时器的节拍,并破坏RTOS内核。系统节拍运行的优先级在NVIC中是最低的,因此任何中断服务程序都会打断它。

这里写图片描述

在RTOS中最好把中断服务代码设计成一个线程,并分配给它一个比较高的优先级。中断服务线程里的第一行代码应该是等待一个信号标志,当中断到来时,中断处理程序Handler唯一的任务就是设置信号标志,然后就结束运行。中断服务线程为中断事件提供服务,并在服务完成后重新进入循环等待信号标志的再次到来。

这里写图片描述

在RTOS里,中断服务代码作为线程运行,当中断到来时,中断处理程序Handler给中断服务线程发信号。然后交给内核根据线程的优先级进行调度。

void Thread3(void)
{
    while(1)
    {
        osSignalWait(isrSignal, waitForever);//等待ISR触发一个事件
        ...//处理中断
    }     
}

 

实际的中断程序只包含一点点代码:

void IRQ_Handler(void)
{
    osSignalSet(thread3, isrSignal);//给线程3发信号
}
posted @ 2018-08-28 12:42  小时候挺菜  阅读(752)  评论(0编辑  收藏  举报