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

4.4 main()函数

此处main()函数与第3章中区别不大,仅仅是加入了SysTick相关的内容,具体参见代码清单4-5。

代码清单4-5 main()函数和任务代码

1 int main(void)
 2 {
 3     OS_ERR err;
 4 
 5     /* 关闭中断 */
 6     CPU_IntDis();(1)
 7 
 8     /* 配置SysTick 10ms 中断一次 */
 9     OS_CPU_SysTickInit (10);(2)
10 
11     /* 初始化相关的全局变量 */
12     OSInit(&err);
13 
14     /* 创建任务 */
15     OSTaskCreate ((OS_TCB*)      &Task1TCB,
16                   (OS_TASK_PTR ) Task1,
17                   (void *)       0,
18                   (CPU_STK*)     &Task1Stk[0],
19                   (CPU_STK_SIZE) TASK1_STK_SIZE,
20                   (OS_ERR *)     &err);
21 
22     OSTaskCreate ((OS_TCB*)      &Task2TCB,
23                   (OS_TASK_PTR ) Task2,
24                   (void *)       0,
25                   (CPU_STK*)     &Task2Stk[0],
26                   (CPU_STK_SIZE) TASK2_STK_SIZE,
27                   (OS_ERR *)     &err);
28 
29     /* 将任务加入就绪列表 */
30     OSRdyList[0].HeadPtr = &Task1TCB;
31     OSRdyList[1].HeadPtr = &Task2TCB;
32 
33     /* 启动操作系统,将不再返回 */
34     OSStart(&err);
35 }
36 
37 
38 
39 /* 任务1 */
40 void Task1( void *p_arg )
41 {
42     for ( ;; ) {
43         flag1 = 1;
44         delay( 100 );
45         flag1 = 0;
46         delay( 100 );
47 
48         /* 任务切换,这里是手动切换 */
49         //OSSched();(3)
50     }
51 }
52 
53 /* 任务2 */
54 void Task2( void *p_arg )
55 {
56     for ( ;; ) {
57         flag2 = 1;
58         delay( 100 );
59         flag2 = 0;
60         delay( 100 );
61 
62         /* 任务切换,这里是手动切换 */
63         //OSSched();(4)
64     }
65 }

代码清单4-5(1):关闭中断。因为在操作系统初始化之前启用了SysTick定时器产生10ms的中断,在中断中触发任务调度,如果一开始不关闭中断,就会在操作系统还未启动之前就进入SysTick中断,然后发生任务调度。既然操作系统都还未启动,那么调度是不允许发生的,所以应先关闭中断。操作系统启动后,中断由OSStart()函数中的OSStartHighRdy()重启。

代码清单4-5(2):配置SysTick为10ms中断一次。任务的调度是在SysTick的中断服务函数中完成的,中断的频率越高意味着操作系统的调度越高,系统的负荷就越重,一直在不断地进入中断,则执行任务的时间就会减少。选择合适的SysTick中断频率会提高系统的运行效率,μC/OS-III官方推荐为10ms,也可设置得再高一些。

代码清单4-5(3)(4):任务调度将不再在各自的任务中实现,而是放到了SysTick中断服务函数中,从而实现每个任务都运行相同的时间片,平等地享有CPU。