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

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)