1.前言
嵌入式实时操作系统需要对整个系统环境产生的事件作出响应。可以采用中断方式也可以采用轮询方式来进行处理。如果采用中断方式,则希望ISR(中断服务例程)的处理时间越短越好。
注:必须说明的是,只有以”FromISR”或”FROM_ISR”结束的API 函数或宏才可以在中断服务例程中。
2. 延迟中断处理
图 利用二值信号量实现中断与任务同步
通过在中断处理中增加二值信号量从而解除任务的阻塞状态,让任务得以执行,这样中断处理例程中就可以做少量的事情,将工作量大的事情交给解除阻塞的任务来执行,从这个角度上看,中断处理被延迟了,所以称为延迟中断处理。
二值信号量可以理解成一个深度为1的队列。
3. 相关处理流程
handler具有比periodic高的优先级,periodic中触发中断,进行P操作后,切换handler处理,之后在执行periodic任务:
相关的API处理
API | 说明 | 参数及返回值 |
vSemaphoreCreateBinary | 创建二值信号量 |
xSemaphore 创建的信号量 |
xSemaphoreTake |
获取(Obtain)”或”接收(Receive)”信号量。只有当信 号量有效的时候才可以被获取。。在经典信号量术中,SemaphoreTake()等同于一次P()操作。不能在中断服务例程中调用 |
xSemaphore 获取得到的信号量 xTicksToWait 阻塞超时时间。如果把xTicksToWait 设置为portMAX_DELAY , 并且在 FreeRTOSConig.h 中设定INCLUDE_vTaskSuspend 为1,那么阻塞等待将没有超时限制。 |
xSemaphoreGiveFromISR |
是xSemaphoreGive()的特殊形式,专门用于中断服务例程中 |
xSemaphore 给出的信号量 pxHigherPriorityTaskWoken 对某个信号量而言,可能有不止一个任务处于阻塞态在等待其有效。调用xSemaphoreGiveFromISR()会让信 |