3.3 操作系统初始化
操作系统初始化一般是在硬件初始化完成之后进行的,主要是初始化μC/OS-III中定义的全局变量。操作系统初始化用OSInit()函数实现。OSInit()函数在文件os_core.c中定义(第一次使用os_core.c时需要自行在文件夹μC/OS-III\Source中新建并添加到工程的μC/OS-III Source组),具体实现参见代码清单3-19。
代码清单3-19 OSInit()函数
1 void OSInit (OS_ERR *p_err) 2 { 3 OSRunning = OS_STATE_OS_STOPPED;(1) 4 5 OSTCBCurPtr = (OS_TCB *)0;(2) 6 OSTCBHighRdyPtr = (OS_TCB *)0;(3) 7 8 OS_RdyListInit();(4) 9 10 *p_err = OS_ERR_NONE;(5) 11 }
代码清单3-19(1):系统用一个全局变量OSRunning指示其运行状态,刚开始初始化系统时,默认为停止状态,即OS_STATE_OS_STOPPED。
代码清单3-19(2):全局变量OSTCBCurPtr是系统用于指向当前正在运行的任务的TCB指针,在任务切换时用得到。
代码清单3-19(3):全局变量OSTCBHighRdyPtr用于指向就绪列表中优先级最高的任务的TCB,在任务切换时用得到。本章暂时不支持优先级,则用于指向第一个运行的任务的TCB。
代码清单3-19(4):OS_RdyListInit()用于初始化全局变量OSRdyList[],即初始化就绪列表。OS_RdyListInit()在os_core.c文件中定义,具体实现参见代码清单3-20。
代码清单3-20 OS_RdyListInit()函数
1 void OS_RdyListInit(void) 2 { 3 OS_PRIO i; 4 OS_RDY_LIST *p_rdy_list; 5 6 for ( i=0u; i<OS_CFG_PRIO_MAX; i++ ) { 7 p_rdy_list = &OSRdyList[i]; 8 p_rdy_list->HeadPtr = (OS_TCB *)0; 9 p_rdy_list->TailPtr = (OS_TCB *)0; 10 } 11 }
代码清单3-19(5):代码运行到这里表示没有错误,即OS_ERR_NONE。
代码清单3-19中的全局变量OSTCBCurPtr和OSTCBHighRdyPtr均在os.h中定义,具体参见代码清单3-21。OS_STATE_OS_STOPPED这个表示系统运行状态的宏也在os.h中定义,具体参见代码清单3-22。
代码清单3-21 OSInit()函数中出现的全局变量的定义
1 OS_EXT OS_TCB *OSTCBCurPtr; 2 OS_EXT OS_TCB *OSTCBHighRdyPtr; 3 OS_EXT OS_RDY_LIST OSRdyList[OS_CFG_PRIO_MAX]; 4 OS_EXT OS_STATE OSRunning;
代码清单3-22 系统状态的宏定义
1 #define OS_STATE_OS_STOPPED (OS_STATE)(0u) 2 #define OS_STATE_OS_RUNNING (OS_STATE)(1u)