μC/OS-III内核实现与应用开发实战指南:基于STM32
上QQ阅读APP看书,第一时间看更新

2.2 多任务系统

相比前后台系统,多任务系统的事件响应也是在中断中完成的,但是事件的处理是在任务中完成的。在多任务系统中,任务与中断一样,也具有优先级,优先级高的任务会优先执行。当一个紧急事件在中断中被标记之后,如果事件对应的任务的优先级足够高,就会立刻得到响应。相比前后台系统,多任务系统的实时性又提高了。多任务系统的伪代码参见代码清单2-3。

代码清单2-3 多任务系统伪代码

1 int flag1 = 0;
 2 int flag2 = 0;
 3 int flag3 = 0;
 4 
 5 int main(void)
 6 {
 7     /* 硬件相关初始化 */
 8     HardWareInit();
 9 
10     /* 操作系统初始化 */
11     RTOSInit();
12 
13     /* 操作系统启动,开始多任务调度,不再返回 */
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的开销。

无论是裸机系统中的轮询系统、前后台系统还是多任务系统,我们不能简单地说孰优孰劣,它们是不同时代的产物,在各自的领域都有相当大的应用价值,只有合适的才是最好的。有关这三者的软件模型区别如表2-1所示。

表2-1 轮询、前后台和多任务系统软件模型的区别