我开始使用FreeRTOS,我想要一个中断来抢占任何即将运行的任务,并运行我需要批判运行的任务。
有没有办法在FreeRTOS中执行此操作? (这是通过任务优先级来实现的吗?)
答案 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()来防范这种情况,应该实现它以便为内核提供执行上下文切换的机会。