RTOS系统5-中断管理

1、概览

    嵌入式实时系统需要对整个系统环境产生的事件作出反应。 这些事件对处理时间响应时间都有不同的要求。在各种情况下,都需要作出合理的判断,以达到最佳事件处理的实现策略:

  • 事件如何被检测到?通常采用中断方式,但是事件输入也可以通过查询方式(例如:查询电平高低)获得。
  • 什么时候采用中断方式?中断服务例程(ISR)中的处理量有多大?以及 ISR 外的任务量有多大?通常情况下, ISR 应当越短越好
  • 事件如何通知到主程序(这里指非 ISR 程序,而非 main()程序)代码?这些代码要如何架构才能最好地适应异步处理?

值得注意的是:只有以”FromISR””FROM_ISR”结束的 API 函数或宏才可以在中断服务例程中。

2、延迟中断

2.1 采用二值信号量同步

 概念:  

        二值信号量可以在某个特殊的中断发生时,让任务解除阻塞,相当于让任务与中断同步。这样就可以让中断事件处理量大的工作在同步任务中完成,中断服务例程(ISR)中只是快速处理少部份工作。 如此,中断处理可以说是被推迟(deferred)”到一个处理(handler)”任务。

        如果某个中断处理要求特别紧急,其延迟处理任务的优先级可以设为最高,

API函数:

FreeRTOS的各种信号量都被存储在xSemaphoreHandle类型的变量中

创建二值信号量:

void vSemaphoreCreateBinary( xSemaphoreHandle xSemaphore );

除了互斥信号量,所有 类型信号量都可以用函数xSemaphoreTake获取:(返回值:pdPASS pdFALSE)

portBASE_TYPE xSemaphoreTake( xSemaphoreHandle xSemaphore, portTickType xTicksToWait );//参数:获取的信号,超时等待时间
//如 果 把 xTicksToWait 设 置 为 portMAX_DELAY , 并 且 在FreeRTOSConig.h 中设定 INCLUDE_vTaskSuspend 为 1,那么阻塞等待将没有超时限制

除 互 斥 信 号 量 外 , FreeRTOS 支 持 的 其 它 类 型 的 信 号 量 都 可 以 通 过 调 用
xSemaphoreGiveFromISR()给出

portBASE_TYPE xSemaphoreGiveFromISR( xSemaphoreHandle xSemaphore,
                                     portBASE_TYPE *pxHigherPriorityTaskWoken );

参数解释:

pxHigherPriorityTaskWoken    :

扫描二维码关注公众号,回复: 1574015 查看本文章

  对某个信号量而言,可能有不止一个任务处于阻塞态在等待其有效。调用 xSemaphoreGiveFromISR()会让信号量变为有效,所以会让其中一个等待任务切出阻塞态。如果调用 xSemaphoreGiveFromISR()使得一个任务解除阻塞,并且这个任务的优先级高于当前任务(也就是被中断的任务),那么 xSemaphoreGiveFromISR()会在 函 数 内 部 将 *pxHigherPriorityTaskWoken 设 为pdTRUE。如 果 xSemaphoreGiveFromISR() 将 此 值 设 为pdTRUE,则在中断退出前应当进行一次上下文切换。这样才能保证中断直接返回到就绪态任务中优先级最高的任务中。






猜你喜欢

转载自blog.csdn.net/weixin_37058227/article/details/80653788