首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FreeRTOS中的抢占

FreeRTOS中的抢占
EN

Stack Overflow用户
提问于 2016-10-09 13:53:10
回答 4查看 4.1K关注 0票数 2

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

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

EN

回答 4

Stack Overflow用户

发布于 2016-10-09 22:40:26

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

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

票数 4
EN

Stack Overflow用户

发布于 2016-10-09 14:36:32

您可以使用xTaskResumeFromISR来完成此操作。

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

票数 1
EN

Stack Overflow用户

发布于 2016-10-09 15:06:02

1.启用抢占:

这很容易做到。

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

代码语言:javascript
复制
#define configUSE_PREEMPTION                    1

您可以将其设置为1以使用抢占式RTOS调度器,或设置为0以使用协作式RTOS调度器。

有关更多信息,请查看this link

ISR 2.使用中的临界区

代码语言:javascript
复制
void taskENTER_CRITICAL( void );
//action

void taskEXIT_CRITICAL( void );

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

参考:here

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39940487

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档