繁体   English   中英

FreeRTOS中的抢占

[英]Preemption in FreeRTOS

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

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

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

不要在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

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

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

1.启用抢占:

这很简单。

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

#define configUSE_PREEMPTION                    1

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

请查看此链接以获取更多信息

2.在ISR中使用关键部分

void taskENTER_CRITICAL( void );
//action

void taskEXIT_CRITICAL( void );

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

参考: 这里

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM