uC/OS-ii系统内核理解(三)_初始化调用函数

OSInit所调用的函数

必须类五个 非必须类通过选通开关选择。

五个必须类:

1.OS_InitMisc(必须类)

 这个函数会被OSInit()调用来初始化各项变量。



static  void  OS_InitMisc (void)
{
#if OS_TIME_GET_SET_EN > 0u
    OSTime                    = 0uL;                       /* Clear the 32-bit system clock32位系统时钟清零*/
#endif


    OSIntNesting              = 0u;                        /* Clear the interrupt nesting counter清零中断嵌套层数*/
    OSLockNesting             = 0u;                        /* Clear the scheduling lock counter清零调度锁       */


    OSTaskCtr                 = 0u;                        /* Clear the number of tasks清零任务计数器          */


    OSRunning                 = OS_FALSE;                  /* Indicate that multitasking not started   */
/*表明多任务未开始(OS运行标志无效)*/
    OSCtxSwCtr                = 0u;                        /* Clear the context switch counter清零上下文切换计数器*/
    OSIdleCtr                 = 0uL;                       /* Clear the 32-bit idle counter清零32位空闲任务计数器*/


#if OS_TASK_STAT_EN > 0u
    OSIdleCtrRun              = 0uL;
    OSIdleCtrMax              = 0uL;
    OSStatRdy                 = OS_FALSE;                  /* Statistic task is not ready统计任务未开始 */
#endif


#ifdef OS_SAFETY_CRITICAL_IEC61508
    OSSafetyCriticalStartFlag = OS_FALSE;                  /* Still allow creation of objects          */
#endif
}

没有选通开关的部分为参数初始数值,这些参数是系统必须的变量,类似于我们定义一个全局变量,初始的时候对它进行赋值。


2.OS_InitRdyList(必须类)

OSInit()调用该函数用来初始化就绪表。

这里的就绪表实指把一个一个任务排列成一个表,要将这个表初始化的意思。要执行响应任务就需要知道任务的优先级、任务控制块、目前指向的任务等一系列信息。

static  void  OS_InitRdyList (void)
{
    INT8U  i;




    OSRdyGrp      = 0u;                                    /* Clear the ready list清除就绪表  */
    for (i = 0u; i < OS_RDY_TBL_SIZE; i++) {
        OSRdyTbl[i] = 0u;
    }


    OSPrioCur     = 0u;/*初始化当前任务优先级*/
    OSPrioHighRdy = 0u;/*初始化最高任务优先级*/


    OSTCBHighRdy  = (OS_TCB *)0;/*初始化最高优先级TCB*/
    OSTCBCur      = (OS_TCB *)0;/*初始化当前任务TCB*/
}


3.OS_InitTCBList(必须类)

OSInit()调用来初始化空闲TCB。这个初始化函数包含的信息是系统比较重要的。

TCB:任务控制块,就是控制任务相关变量数据信息各类的结构体的归类,其结构体里面包含的信息较多。

理解任务控制块需要熟练掌握数据结构。

static  void  OS_InitTCBList (void)
{
    INT8U    ix;
    INT8U    ix_next;
    OS_TCB  *ptcb1;
    OS_TCB  *ptcb2;




    OS_MemClr((INT8U *)&OSTCBTbl[0],     sizeof(OSTCBTbl));      /* Clear all the TCBs清除所有TCB*/
    OS_MemClr((INT8U *)&OSTCBPrioTbl[0], sizeof(OSTCBPrioTbl));  /* Clear the priority table清除优先级表*/
    for (ix = 0u; ix < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1u); ix++) {    /* Init. list of free TCBs初始化空TCBs列表*/
        ix_next =  ix + 1u;
        ptcb1   = &OSTCBTbl[ix];
        ptcb2   = &OSTCBTbl[ix_next];
        ptcb1->OSTCBNext = ptcb2;
#if OS_TASK_NAME_EN > 0u
        ptcb1->OSTCBTaskName = (INT8U *)(void *)"?";             /* Unknown name 未知TCB名称 */
#endif
    }
    ptcb1                   = &OSTCBTbl[ix];
    ptcb1->OSTCBNext        = (OS_TCB *)0;                       /* Last OS_TCB 最后OS_TCB指向"空"*/
#if OS_TASK_NAME_EN > 0u
    ptcb1->OSTCBTaskName    = (INT8U *)(void *)"?";              /* Unknown name未知TCB名称*/
#endif
    OSTCBList               = (OS_TCB *)0;                       /* TCB lists initializations初始化TCB链表 */
    OSTCBFreeList           = &OSTCBTbl[0];
}


4.OS_InitEventList(必须类)

OSInit()调用该函数用来初始化空闲ECB(事件控制块)。这里所说的时间,实指系统相关资源(信号量、互斥信号量、消息邮箱、消息队列等)一个或集。在ucos_ii.h  92行中

#define  OS_EVENT_EN           (((OS_Q_EN > 0u) && (OS_MAX_QS > 0u)) || (OS_MBOX_EN > 0u) || (OS_SEM_EN > 0u) || (OS_MUTEX_EN > 0u))

信号量、互斥信号量、邮箱、消息队列这些资源要被系统调用,就需要进行初始化。系统把他们定义为事件,而使用是需要调用相关数据,系统把它们定义为ECB(事件控制块)。

类似TCB。


5.OS_InitTaskIdle(必须类)

OSInit()调用该函数创建空闲任务。这个函数属于系统必须初始化的函数。空闲函数其实就是把系统所创建的任务都处理完了,哪些都挂起了或删除了,系统没事可做的时候,执行这个空闲任务。

空闲任务在统计中起一定作用。统计:即CPU占用率,空闲任务越多,CPU空闲越多,CPU占用率越低。


猜你喜欢

转载自blog.csdn.net/li_qcxy/article/details/55250527