C语言 FreeRTOS中的抢占

nkoocmlb  于 2023-04-29  发布在  其他
关注(0)|答案(5)|浏览(170)

我开始使用FreeRTOS,我想中断抢占任何任务即将运行和运行的任务,我需要运行的关键。
有没有办法在FreeRTOS中做到这一点?(这是通过任务优先级来实现的吗?)

rxztt3cl

rxztt3cl1#

不!以上两个答案都是危险的。
请勿在ISR中使用taskENTER_CRITICAL()或taskEXIT_CRITICAL()-ISR中通常不需要临界区,但如果需要,请使用taskENTER_CRITICAL_FROM_ISR()/taskEXIT_CRITICAL_FROM_ISR()。(AVR 32端口可能是该规则的例外?)
不要使用xTaskResumeFromISR()将任务与中断同步。已经发布到该函数文档的链接甚至这样说。
如果我对你的问题的理解是正确的,你希望有一个中断解除阻塞任务的能力,然后如果该任务是能够运行的最高优先级任务,让中断直接返回到解除阻塞的任务。如果我的理解是正确的,那么在下面的页面上有一个如何以有效的方式做到这一点的例子:http://www.freertos.org/RTOS_Task_Notification_As_Counting_Semaphore.html

zlwx9yxi

zlwx9yxi2#

简单的回答是:是的,这是通过任务优先级实现的。
FreeRTOS内核将考虑在ISR完成后交换任何处于就绪状态的任务,因此如果更高优先级的任务现在就绪,它将抢占当前正在运行的任务。
应该提到的是,只有通过FreeRTOS调用处理程序时,这才是真的。在Cortex-A处理器上,IRQ或FIQ异常处理程序中有一个常见的IRQ入口点,最有可能由FreeRTOS处理,或者由FreeRTOS很容易 Package 的IRQ调度程序处理,通常由端口层中名为vApplicationIRQHandler()的函数处理。
在Cortex-M上,情况不一定如此,因为向量通常由供应商的MCU API操纵。在Cortex-M上,我会在ISR中使用portYIELD_FROM_ISR()来防止这种情况,应该实现它来为内核提供执行上下文切换的机会。

7ajki6be

7ajki6be3#

您可以使用xTaskResumeFromISR来完成此操作。
有许多条件需要满足,以使产出的任务不会被其他任务中断(比如它的优先级必须足够高),还有许多其他条件需要满足,以确保没有中断可以不被服务(比如产出的任务必须保证在下一个中断之前完成)

xnifntxz

xnifntxz4#

1.启用抢占:

这很容易做到。
FreeRTOS的所有配置选项都在“FreeRTOSConfig”下。h”

#define configUSE_PREEMPTION                    1

您可以将其设置为1以使用抢占式RTOS调度程序,或设置为0以使用协作式RTOS调度程序。
查看this link了解更多信息

2.使用ISR内部的临界区

void taskENTER_CRITICAL( void );
//action

void taskEXIT_CRITICAL( void );

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

cgh8pdjw

cgh8pdjw5#

这个很简单
当你创建任务时,你可以分配优先级。
考虑到0是最高的性能,例如在M4处理器中15是最低的,你只需要给这个任务一个较低的优先级.FreeRTOS还提供了一些宏来使其更容易,例如,您可以只输入osPriorityHigh而不是数字
这里有一个任务配置示例:

xReturned = xTaskCreate(
                   vSafety_Inputs,       /* Function that implements the task*/
                   "NAME",          /* Text name for the task. */
                  configMINIMAL_STACK_SIZE,/* Stack size in words, not bytes. */
                   ( void * ) 1,    /* Parameter passed into the task. */
               osPriorityHigh,/* Priority at which the task is created. */
                  &xHandle );  /* Used to pass out the created task's handle. */

相关问题