第3章 任务的定义与任务切换

本章我们真正开始从0到1写RTOS。必须学会创建任务,并重点掌握任务是如何切换的。因为任务的切换是由汇编代码来完成的,所以代码看起来比较难懂,但是我们会尽力把代码讲得透彻。如果不能掌握本章内容,那么后面的内容根本无从下手。

在本章中,我们会创建两个任务,并让这两个任务不断地切换,任务的主体都是让一个变量按照一定的频率翻转,通过KEIL的软件仿真功能,在逻辑分析仪中观察变量的波形变化,最终的波形图如图3-1所示。

图3-1 任务轮流切换波形图

其实,图3-1所示的波形图并不是真正的多任务系统中任务切换的效果图,这个效果其实可以完全由裸机代码实现,具体参见代码清单3-1。

代码清单3-1 裸机系统中两个变量轮流翻转

1 /* flag 必须定义成全局变量才能添加到逻辑分析仪中观察波形
 2 ** 在逻辑分析仪中要设置为位(Bit)模式才能看到波形,不能使用默认的模拟量
 3 */
 4 uint32_t flag1;
 5 uint32_t flag2;
 6 
 7 
 8 /* 软件延时,不必纠结具体的时间 */
 9 void delay( uint32_t count )
10 {
11     for (; count!=0; count--);
12 }
13 
14 int main(void)
15 {
16     /* 无限循环,顺序执行 */
17     for (;;) {
18         flag1 = 1;
19         delay( 100 );
20         flag1 = 0;
21         delay( 100 );
22 
23         flag2 = 1;
24         delay( 100 );
25         flag2 = 0;
26         delay( 100 );
27     }
28 }

在多任务系统中,两个任务不断切换的效果图应该如图3-2所示,即两个变量的波形是完全一样的,就好像CPU在同时做两件事,这才是多任务的意义。虽然两者的波形图一样,但是代码的实现方式是完全不同的,由原来的顺序执行变成了任务的主动切换,这是根本区别。本章只是开始,我们先掌握好任务是如何切换的,在后面章节中,会陆续完善功能代码,加入系统调度,实现真正的多任务。

图3-2 多任务系统中的任务切换波形图