FreeRTOS任务调度程序如何工作的

2021-09-11 08:45发布

我一直在阅读官网文档:

Https://www.freertos.org/a00132.html

我不明白如何使用vTaskStartScheduler()。我可以创建任务,但据我所知,仅创建任务是不够的。只有在调度程序启动时才会执行任务。

示例用法:

void vAFunction( void )
{
     // Tasks can be created before or after starting the RTOS
     scheduler
     xTaskCreate( vTaskCode,
                  "NAME",
                  STACK_SIZE,
                  NULL,
                  tskIDLE_PRIORITY,
                  NULL );

     // Start the real time scheduler.
     vTaskStartScheduler();

     // Will not get here unless there is insufficient RAM.
}


3条回答
wupeng1
1楼 · 2021-09-11 09:11.采纳回答

我从来没用过FreeRTOS,但我根据多年来使用其他RTOS的经验来回答您的这个问题。

你的理解是正确的。

创建任务只会在调度程序使用的数据结构中创建一些程序入口。

当您的代码调用vTaskStartScheduler()时,您的代码将任务执行的控制权交给调度程序。

这一点从这句注释中可以看到:"Will not get here unless there is insufficient RAM"。

在调用vTaskStartScheduler()之后,调度程序将根据任务的优先级运行您的任务,不管它们是否被阻塞,等等。


eric111
2楼-- · 2021-09-11 10:51

任务是创建的,然后调度程序就启动了。当存在不同的优先级时,任务调度程序首先执行较高优先级的任务。我怀疑,当任务优先级相同时,调度程序如何在FreeRTOS中执行任务?

电子技术百科
3楼-- · 2021-09-11 10:53

任何数量的任务都可以共享相同的优先级。如果configUSE_time_sling未定义,或者configUSE_time_sling设置为1,则同等优先级的就绪状态任务将使用时间切片循环调度方案共享可用的处理时间。

一周热门 更多>