FreeRTOS中的抢占

时间:2016-10-09 05:53:10

标签: c freertos microblaze

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

有没有办法在FreeRTOS中执行此操作? (这是通过任务优先级来实现的吗?)

4 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:1)

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

要生成的任务有许多条件不被其他任务中断(比如它的优先级必须足够高)以及要满足的其他一些条件以确保没有中断可以去服务(就像产生的任务必须保证在下一次中断之前完成)

答案 2 :(得分:1)

<强> 1。启用抢占:

这很简单。

FreeRTOS的所有配置选项都在&#34; FreeRTOSConfig.h&#34;

#define configUSE_PREEMPTION                    1

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

查看DecimalPlaces了解详情

<强> 2。在ISR中使用关键部分

void taskENTER_CRITICAL( void );
//action

void taskEXIT_CRITICAL( void );

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

参考:this link

答案 3 :(得分:1)

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

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

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

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