上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。