FreeRTOS笔记-中断管理

  1. 中断管理(Interrupt Management)
    1. 对中断管理的理解
      1. 主要API函数
      2. xHigherPriorityTaskWoken参数

中断管理(Interrupt Management)

对中断管理的理解

RTOS中,配置了专门用于中断函数里面的API。(函数一般以FromISR结尾)
主要是考虑到中断回调函数不能运行长时间的指令,以写队列为例:

xQueueSendToBackFromISR区别与xQueueSendToBack,在参数上削减了等待时间,
主要是考虑到中断函数中不能有较长的等待时间。
在调度上,如果被唤醒的任务优先级更高,也不会即可调度,而是记录下来表示需要调度。
在阻塞问题上,如果写的队列是满的,FromISR函数会即刻返回错误信息,而不会进行阻塞等待。

主要API函数

主要API表格

xHigherPriorityTaskWoken参数

如果任务在运行的过程中,由于数据传输可能会导致高优先级的任务被唤醒,
并且高优先级的任务会抢占运行,在中断中我们是不希望发生这样的事情的。

可以看到,在任务中调用API函数可能导致任务阻塞、任务切换,这叫做”context switch”,上下文切
换。这个函数可能很长时间才返回,在函数的内部实现了任务切换。

xQueueSendToBackFromISR() 函数也可能导致任务切换,但是不会在函数内部进行切换,而是返回一
个参数:表示是否需要切换。

1
2
3
4
5
6
BaseType_t xHigherPriorityTaskWoken = pdFALSE;
xQueueSendToBackFromISR(xQueue, pvItemToQueue, &xHigherPriorityTaskWoken);
if(xHigherPriorityTaskWoken == pdTRUE)
{
//任务切换
}

在示例代码中,xHigherPriorityTaskWoken用于保存函数的结果,
在外部对该结果进行判断,是否需要执行任务调度。

外部中断触发定时器实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
void EXTI0_IRQHandler(void)
{
BaseType_t xHigherPriorityTaskWoken;
if(EXTI_GetITStatus(EXTI_Line0))
{

xTimerResetFromISR(MyTimer_Handle_1, &xHigherPriorityTaskWoken);
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);

EXTI_ClearFlag(EXTI_Line0);
}
}

portYIELD_FROM_ISR(xHigherPriorityTaskWoken);代码为触发调度。


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以邮件至 1186703947@qq.com

💰

×

Help us with donation

相册 动态菜单1