FreeRTOS系列第21篇---FreeRTOS调度器启动过程分析
扫描二维码
随时随地手机看文章
关注、星标公众号,直达精彩内容ID:技术让梦想更伟大整理:李肖遥
使用FreeRTOS,一个最基本的程序架构如下所示:
int main(void)
{
必要的初始化工作;
创建任务1;
创建任务2;
...
vTaskStartScheduler(); /*启动调度器*/
while(1);
}
任务创建完成后,静态变量指针pxCurrentTCB
(见《FreeRTOS高级篇2---FreeRTOS任务创建分析》第7节内容)指向优先级最高的就绪任务。但此时任务并不能运行,因为接下来还有关键的一步:启动FreeRTOS调度器。调度器是FreeRTOS操作系统的核心,主要负责任务切换,即找出最高优先级的就绪任务,并使之获得CPU运行权。调度器并非自动运行的,需要人为启动它。API函数vTaskStartScheduler()
用于启动调度器,它会创建一个空闲任务、初始化一些静态变量,最主要的,它会初始化系统节拍定时器并设置好相应的中断,然后启动第一个任务。这篇文章用于「分析启动调度器的过程」,和上一篇文章一样,启动调度器也涉及到硬件特性(比如系统节拍定时器初始化等)。❝本文仍然以Cortex-M3架构为例。❞启动调度器的API函数
vTaskStartScheduler()
的源码精简后如下所示:void vTaskStartScheduler( void )
{
BaseType_t xReturn;
StaticTask_t *pxIdleTaskTCBBuffer= NULL;
StackType_t *pxIdleTaskStackBuffer= NULL;
uint16_t usIdleTaskStackSize =tskIDLE_STACK_SIZE;
/*如果使用静态内存分配任务堆栈和任务TCB,则需要为空闲任务预先定义好任务内存和任务TCB空间*/
#if(configSUPPORT_STATIC_ALLOCATION == 1 )
{
vApplicationGetIdleTaskMemory(