一、基本介绍
这一章主要介绍freeRTOS是如何在底层开启任务调度器和启动第一个任务的,以为底层太过复杂,且都是基于Contex-M3/4的架构实现的,基本上都是在内核的寄存器进行操作,所以制作简单介绍,详细的内容可以看Contex-M3/4的权威指南,也可以找正点原子的b站视频观看。
开启任务调度器会调用函数vTaskStartScheduler(),并在该函数内部实现六个主要操作,分别是:
1.创建空闲任务,防止CPU空转。
2.如果使能乐软件定时器,则创建定时器任务。
3.关中断,避免调度器开启过程中受到干扰,会在启动第一个任务时再次开中断。
4.初始化全局变量,并设置任务调度器的运行标志为已运行。
5.初始化任务运行时间统计功能的时基定时器,但是只有声明,没有定义。
6.调用函数xPortStartScheduler()。
开启第一个任务实在开启任务调度器时发生的,xPortStartScheduler()函数的作用就是在完成启动任务调度器中与硬件架构的相关配置部分后,启动第一个任务。它的主要操作也分为六个,分别是:
1.检查freeRTOS的freeRTOSConfig.h文件对中断的相关配置是否正确。
2.配置PendSV和Systick的中断优先级为最低优先级(15)。
3.配置SysTick,调用vPortSetupTimerInterrupt()。
4.初始化临界区嵌套计数器为0。
5.调用函数prvEnableVFP()使能FPU,Contex-M3没有使用FPU,这段代码对其无效。
6.调用prvStartFirstTask()启动第一个任务。该函数内部就是对寄存器的操作,主要是出栈和入栈以及SVC中断的使能,而在SVC中断服务函数中,会将第一个任务的堆栈数据出栈到CPU中,这样CPU就会开始运行第一个任务。
二、问题与总结
1.如果只管用,那么只需要知道vTaskStartScheduler()怎么用即可,即在开始任务调度时,调用一次即可。
2.如果想知道底层,那么配合freeRTOS的源码和Contex-M3/4权威指南一起享用。