首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FreeRtos上下文切换

FreeRtos上下文切换
EN

Stack Overflow用户
提问于 2019-12-04 02:18:54
回答 2查看 460关注 0票数 0

如果较高优先级任务正在等待事件,而较低优先级任务正在运行。在节拍中断之前,高优先级任务准备就绪,那么在节拍中断之前,上下文切换将如何发生?直到滴答中断更高优先级的任务将等待滴答中断到上下文切换?

我需要知道在freertos中,上下文切换只在节拍中断时发生?如果不是,那么高优先级任务如何在节拍中断之前抢占低优先级任务,如果它在节拍中断之前准备好?

EN

回答 2

Stack Overflow用户

发布于 2019-12-04 03:39:51

如果在FreeRTOSConfig.h中将configUSE_PREEMPTION设置为1,那么FreeRTOS将始终运行能够运行的最高优先级任务,即使任务可以在节拍中断之间运行。这是因为发送解除阻塞任务的事件需要调用FreeRTOS接口函数,而上下文切换发生在接口函数中。我建议reading the free book了解更多有关调度策略的信息。

(已在此处https://forums.freertos.org/t/freertos-context-switch/8333提供的回复的转载)

票数 1
EN

Stack Overflow用户

发布于 2019-12-04 03:40:42

为了澄清你的问题并提供一个更完整的答案,让我们先给事物命名。您提到您有两个任务-让我们称它们为HighPriorityTaskLowPriorityTask。在这种情况下,只有在HighPriorityTask被阻塞的情况下,LowPriorityTask才会运行,这是在执行以下任一操作时发生的:

  • HighPriorityTask调用显式停止执行给定时间或永远的vTaskDelay函数或类似函数,例如
  • HighPriorityTask调用xQueueReceive或类似函数,阻塞时间不为零且队列中没有元素;xQueueSend调用xQueueSend函数或类似函数时阻塞时间非零且队列中没有剩余空间。

如果以上或类似的情况都不会导致HighPriorityTask被阻塞,那么HighPriorityTask将永远运行。这包括任务抢占(我假设你将其称为“滴答中断”),它不会导致LowPriorityTask运行,因为这两个任务不是相同的优先级,只有具有相同优先级的任务才会被赋予抢占的时间片。这甚至包括从HighPriorityTask调用taskYIELD,这会显式地导致FreeRTOS执行上下文切换,但在这种情况下,它要做的就是返回执行HighPriorityTask代码,因为这仍然是当前执行的最高级别的非阻塞任务。

因此,总结一下--如果你有两个不同优先级的任务处于“运行”状态,那么低优先级任务将永远不会运行(任务抢占不会分配任何时间给低优先级任务),除非高优先级任务显式阻塞。

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

https://stackoverflow.com/questions/59163136

复制
相关文章

相似问题

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