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. */
5条答案
按热度按时间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
zlwx9yxi2#
简单的回答是:是的,这是通过任务优先级实现的。
FreeRTOS内核将考虑在ISR完成后交换任何处于就绪状态的任务,因此如果更高优先级的任务现在就绪,它将抢占当前正在运行的任务。
应该提到的是,只有通过FreeRTOS调用处理程序时,这才是真的。在Cortex-A处理器上,IRQ或FIQ异常处理程序中有一个常见的IRQ入口点,最有可能由FreeRTOS处理,或者由FreeRTOS很容易 Package 的IRQ调度程序处理,通常由端口层中名为vApplicationIRQHandler()的函数处理。
在Cortex-M上,情况不一定如此,因为向量通常由供应商的MCU API操纵。在Cortex-M上,我会在ISR中使用portYIELD_FROM_ISR()来防止这种情况,应该实现它来为内核提供执行上下文切换的机会。
7ajki6be3#
您可以使用xTaskResumeFromISR来完成此操作。
有许多条件需要满足,以使产出的任务不会被其他任务中断(比如它的优先级必须足够高),还有许多其他条件需要满足,以确保没有中断可以不被服务(比如产出的任务必须保证在下一个中断之前完成)
xnifntxz4#
1.启用抢占:
这很容易做到。
FreeRTOS的所有配置选项都在“FreeRTOSConfig”下。h”
您可以将其设置为1以使用抢占式RTOS调度程序,或设置为0以使用协作式RTOS调度程序。
查看this link了解更多信息
2.使用ISR内部的临界区
RTOS不会在这个关键部分做任何额外的事情
参考:here
cgh8pdjw5#
这个很简单
当你创建任务时,你可以分配优先级。
考虑到0是最高的性能,例如在M4处理器中15是最低的,你只需要给这个任务一个较低的优先级.FreeRTOS还提供了一些宏来使其更容易,例如,您可以只输入osPriorityHigh而不是数字
这里有一个任务配置示例: