2

我开始使用 FreeRTOS,我想要一个中断来抢占任何即将运行的任务并运行我需要严格运行的任务。

有没有办法在 FreeRTOS 中做到这一点?(这是通过任务优先级实现的吗?)

4

4 回答 4

4

不!以上两个答案都是危险的。

不要在 ISR 中使用 taskENTER_CRITICAL() 或 taskEXIT_CRITICAL() - 在 ISR 中需要关键部分是不常见的,但如果你这样做了,请使用taskENTER_CRITICAL_FROM_ISR()/taskEXIT_CRITICAL_FROM_ISR()。(可能 AVR32 端口是该规则的一个例外?)

不要使用 xTaskResumeFromISR() 将任务与中断同步。已经发布到该功能文档的链接甚至说明了这一点。

如果我对您的问题的理解是正确的,您希望能够让中断解除阻塞任务,然后如果该任务是能够运行的最高优先级任务,则让中断直接返回到解除阻塞的任务。如果我的理解是正确的,那么在以下页面上有一个如何以有效方式执行此操作的示例:http ://www.freertos.org/RTOS_Task_Notification_As_Counting_Semaphore.html

于 2016-10-09T14:40:25.823 回答
1

简短的回答是:是的,这是通过任务优先级实现的。

FreeRTOS 内核将考虑在 ISR 完成后交换任何处于就绪状态的任务,因此如果更高优先级的任务现在已就绪,它将抢占当前正在运行的任务。

应该提到的是,只有通过 FreeRTOS 调用处理程序时,这才是真的。在 Cortex-A 处理器上,IRQ 或 FIQ 异常处理程序中有一个公共 IRQ 入口点,该入口点很可能由 FreeRTOS 处理,或者由易于被 FreeRTOS 包装的 IRQ 调度程序处理,通常由端口层中的函数处理称为 vApplicationIRQHandler()。

在 Cortex-M 上,情况不一定如此,因为向量通常由供应商的 MCU API 操作。在 Cortex-M 上,我会在 ISR 中使用 portYIELD_FROM_ISR() 来防范这种情况,这应该被实现为内核提供执行上下文切换的机会。

于 2018-03-03T12:48:31.443 回答
1

您可以使用xTaskResumeFromISR来执行此操作。

产生的任务不被其他任务中断需要满足许多条件(例如它的优先级必须足够高),并且需要满足许多其他条件以确保没有中断可以被取消服务(例如产生的任务必须保证在下一次中断之前完成)

于 2016-10-09T06:36:32.357 回答
1

1.启用抢占:

这很简单。

FreeRTOS 的所有配置选项都在“FreeRTOSConfig.h”下

#define configUSE_PREEMPTION                    1

您可以将此设置为 1 以使用抢占式 RTOS 调度程序,或将其设置为 0 以使用协作式 RTOS 调度程序。

检查此链接以获取更多信息

2. 在 ISR 中使用临界区

void taskENTER_CRITICAL( void );
//action

void taskEXIT_CRITICAL( void );

RTOS 不会在这个关键部分做任何额外的事情

参考:这里

于 2016-10-09T07:06:02.330 回答