FreeRTOS学习笔记——二、裸机系统与任务系统

FreeRTOS学习笔记——二、裸机系统与任务系统

  • 1 裸机系统
    • 1.1 轮询系统
    • 1.2 前后台系统
  • 2 多任务系统
  • 3 三种系统对比

在真正开始动手写 RTOS 之前,我们先来讲解下 单片机编程中的 裸机系统多任务系统的区别。

1 裸机系统

裸机系统分为:

  • 轮询系统
  • 前后台系统

1.1 轮询系统

轮询系统

  • 在裸机编程的时候
    • 先初始化好相关的硬件
    • 然后让主程序在一个死循环里面不断循环
    • 顺序地做各种事情
  • 轮询系统只适合顺序执行的功能代码,当有外部事件驱动时实时性就会降低
  • 如果加入了按键操作等需要检测外部信号的事件,用来模拟紧急报警,那么整个系统的实时响应能力就不会那么好
    • 假设DoSomething3 是按键扫描,当外部按键被按下,相当于一个警报,这个时候,需要立马响应,并做紧急处理,而这个时候程序刚好执行到DoSomething1,要命的是DoSomethingg1需要执行的时间比较久,久到按键释放之后都没有执行完毕,那么当执行到DoSomething3的时候就会丢失掉一次事件
1 int main(void)
2 {
3 		/* 硬件相关初始化 */
4 		HardWareInit();
5
6 		/* 无限循环 */
7 		for (;;) {
8 				/* 处理事情1 */
9 				DoSomething1();
10
11 				/* 处理事情2 */
12 				DoSomething2();
13
14 				/* 处理事情3 */
15 				DoSomething3();
16 		}
17 }

1.2 前后台系统

  • 相比轮询系统,前后台系统是在轮询系统的基础上加入了中断
  • 外部事件的响应在中断里面完成,事件的处理还是回到轮询系统中完成
  • 中断在这里我们称为前台
  • main 函数里面的无限循环称为后台
1 int flag1 = 0;
2 int flag2 = 0;
3 int flag3 = 0;
4
5 int main(void)
6 {
7 		/* 硬件相关初始化 */
8 		HardWareInit();
9
10 		/* 无限循环 */
11 		for (;;) {
12 				if (flag1) {
13 						/* 处理事情1 */
14 						DoSomething1();
15 				}
16
17 				if (flag2) {
18 						/* 处理事情2 */
19 					DoSomething2();
20 				}
21
22 				if (flag3) {
23 						/* 处理事情3 */
24 						DoSomething3();
25 				}
26 		}
27 }
28
29 void ISR1(void)
30 {
31 		/* 置位标志位 */
32 		flag1 = 1;
33 		/* 如果事件处理时间很短,则在中断里面处理
34 		如果事件处理时间比较长,在回到前台处理 */
35 		DoSomething1();
36 		}
37
38 void ISR2(void)
39 {
40 		/* 置位标志位 */
41 		flag2 = 1;
42
43 		/* 如果事件处理时间很短,则在中断里面处理
44 		如果事件处理时间比较长,在回到前台处理 */
45 		DoSomething2();
46 }
47
48 void ISR3(void)
49 {
50 		/* 置位标志位 */
51 		flag3 = 1;
52
53 		/* 如果事件处理时间很短,则在中断里面处理
54 		如果事件处理时间比较长,在回到前台处理 */
55 		DoSomething3();
56 }
  • 在顺序执行后台程序的时候,如果有中断来临,那么中断会打断后台程序的正常执行流,转而去执行中断服务程序,在中断服务程序里面标记事件
  • 如果事件要处理的事情很简短,则可在中断服务程序里面处理
  • 如果事件要处理的事情比较多,则返回到后台程序里面处理
  • 虽然事件的响应和处理是分开了,但是事件的处理还是在后台里面顺序执行的
  • 相比轮询系统,前后台系统确保了事件不会丢失,再加上中断具有可嵌套的功能,这可以大大的提高程序的实时响应能力
  • 在大多数的中小型项目中,前后台系统运用的好,堪称有操作系统的效果。

2 多任务系统

  • 相比前后台系统,多任务系统事件响应也是在中断中完成的,但是事件的处理是在任务中完成的
  • 在多任务系统中,任务跟中断一样,也具有优先级,优先级高的任务会被优先执行
  • 当一个紧急的事件在中断被标记之后,如果事件对应的任务的优先级足够高,就会立马得到响应
  • 相比前后台系统,多任务系统实时性又被提高
1 int flag1 = 0;
2 int flag2 = 0;
3 int flag3 = 0;
4
5 int main(void)
6 {
7 		/* 硬件相关初始化 */
8 		HardWareInit();
9
10 		/* OS 初始化 */
11 		RTOSInit();
12
13 		/* OS 启动,开始多任务调度,不再返回 */
14 		RTOSStart();
15 }
16
17 void ISR1(void)
18 {
19 		/* 置位标志位 */
20 		flag1 = 1;
21 }
22
23 void ISR2(void)
24 {
25 		/* 置位标志位 */
26 		flag2 = 2;
27 }
28
29 void ISR3(void)
30 {
31 		/* 置位标志位 */
32 		flag3 = 1;
33 }
34
35 void DoSomething1(void)
36 {
37 		/* 无限循环,不能返回 */
38 		for (;;) {
39 				/* 任务实体 */
40 				if (flag1) {
41
42 				}
43 		}
44 }
45
46 void DoSomething2(void)
47 {
48 		/* 无限循环,不能返回 */
49 		for (;;) {
50 				/* 任务实体 */
51 				if (flag2) {
52
53 				}
54 		}
55 }
56
57 void DoSomething3(void)
58 {
59 		/* 无限循环,不能返回 */
60 		for (;;) {
61 				/* 任务实体 */
62 				if (flag3) {
63
64 				}
65 		}
66 }
  • 相比前后台系统中后台顺序执行的程序主体,在多任务系统中,根据程序的功能,我们把这个程序主体分割成一个个独立的,无限循环且不能返回的小程序,这个小程序我们称之为任务
  • 每个任务都是独立的,互不干扰的,且具备自身的优先级,它由操作系统调度管理
  • 加入操作系统后,我们在编程的时候不需要精心地去设计程序的执行流,不用担心每个功能模块之间是否存在干扰
  • 加入了操作系统,我们的编程反而变得简单了
  • 整个系统随之带来的额外开销就是操作系统占据的那一丁点的FLASH 和RAM。现如今,单片机的FLASH 和RAM 是越来越大,完全足以抵挡RTOS 那点开销

3 三种系统对比

  • 无论是裸机系统中的轮询系统、前后台系统和多任务系统,我们不能一锤子的敲定孰优孰劣,它们是不同时代的产物,在各自的领域都还有相当大的应用价值,只有合适才是最好。
  • 有关这三者的软件模型区别具体见表格
    FreeRTOS学习笔记——二、裸机系统与任务系统_第1张图片

你可能感兴趣的:(FreeRTOS学习笔记,学习,笔记)