学习FreeRTOS之路(六):FreeRTOS 的启动流程

使用FreeRTOS的常用编程思路

第一种:万事俱备法

在 main 函数中将硬件初始化,RTOS 系统初始化,所有任务的创建这些都弄好,最后在启动任务调度器

1 int main (void)
2 {
     
3 /* 硬件初始化 */
4 HardWare_Init(); (1)
5 
6 /* RTOS 系统初始化 */
7 RTOS_Init(); (2)
8 
9 /* 创建任务 1,但任务 1 不会执行,因为调度器还没有开启 */ (3)
10 RTOS_TaskCreate(Task1);
11 /* 创建任务 2,但任务 2 不会执行,因为调度器还没有开启 */
12 RTOS_TaskCreate(Task2);
13 
14 /* ......继续创建各种任务 */
15 
16 /* 启动 RTOS,开始调度 */
17 RTOS_Start(); (4)
18 }
19 
20 void Task1( void *arg ) (5)
21 {
     
22 while (1)
23 {
     
24 /* 任务实体,必须有阻塞的情况出现 */
25 }
26 }
27 
28 void Task1( void *arg ) (6)
29 {
     
30 while (1)
31 {
     
32 /* 任务实体,必须有阻塞的情况出现 */
33 }
34 }

第二种:且行且看法

在 main 函数中将硬件和 RTOS系统先初始化好,然后创建一个启动任务后就启动调度器,然后在启动任务里面创建各种应用任务,当所有任务都创建成功后,启动任务把自己删除。

1 int main (void)
2 {
     
3 /* 硬件初始化 */
4 HardWare_Init(); (1)
5 
6 /* RTOS 系统初始化 */
7 RTOS_Init(); (2)
8 
9 /* 创建一个任务 */
10 RTOS_TaskCreate(AppTaskCreate); (3)
11 
12 /* 启动 RTOS,开始调度 */
13 RTOS_Start(); (4)
14 }
15 
16 /* 起始任务,在里面创建任务 */
17 void AppTaskCreate( void *arg ) (5)
18 {
     
19 /* 创建任务 1,然后执行 */
20 RTOS_TaskCreate(Task1); (6)
21 
22 /* 当任务 1 阻塞时,继续创建任务 2,然后执行 */
23 RTOS_TaskCreate(Task2);
24 
25 /* ......继续创建各种任务 */
26 
27 /* 当任务创建完成,删除起始任务 */
28 RTOS _ TaskDelete(AppTaskCreate); (7)
29 }
30 
31 void Task1( void *arg ) (8)
32 {
     
33 while (1)
34 {
     
35 /* 任务实体,必须有阻塞的情况出现 */
36 }
37 }
38 
39 void Task2( void *arg ) (9)
40 {
     
41 while (1)
42 {
     
43 /* 任务实体,必须有阻塞的情况出现 */
44 }
45 }

FreeRTOS 的启动流程

我们知道,在系统上电的时候第一个执行的是启动文件里面由汇编编写的复位函数Reset_Handler。复位函数的最后会调用 C 库函数__main。__main 函数的主要工作是初始化系统的堆和栈,最后调用 C 中的 main 函数,从而进入 C语言程序。

main()中创建任务 xTaskCreate()函数

在 main()函数中,我们直接可以对 FreeRTOS进行创建任务操作,因为 FreeRTOS会自动帮我们做初始化的事情,比如初始化堆内存。FreeRTOS 的简单方便是在别的实时操作系统上都没有的。

我们自己在 main()函数中直接初始化我们的硬件外设,然后进行任务的创建即可——xTaskCreate(),在任务创建中,FreeRTOS 会帮我们进行一系列的系统初始化,在创建任务的时候,会帮我们初始化堆内存

开启任务调度器vTaskStartScheduler()函数

在创建完任务的时候,我们需要开启调度器,因为创建仅仅是把任务添加到系统中,还没真正调度,并且空闲任务也没实现,定时器任务也没实现,这些都是在开启调度函数vTaskStartScheduler()中实现的。

为什么要空闲任务?因为 FreeRTOS 一旦启动,就必须要保证系统中每时每刻都有一个任务处于运行态(Runing),并且空闲任务不可以被挂起与删除。

空闲任务的优先级是最低的,以便系统中其他任务能随时抢占空闲任务的 CPU 使用权。这些都是系统必要的东西,也无需用户自己实现,FreeRTOS 全部帮我们搞定了。处理完这些必要的东西之后,系统才真正开始启动

你可能感兴趣的:(FreeRTOS学习之路)