void OSInit (void)
{
OSInitHookBegin(); /* Call port specific initialization code */
OS_InitMisc(); /* Initialize miscellaneous variables */
OS_InitRdyList(); /* Initialize the Ready List */
OS_InitTCBList(); /* Initialize the free list of OS_TCBs */
OS_InitEventList(); /* Initialize the free list of OS_EVENTs */
#if (OS_FLAG_EN > 0) && (OS_MAX_FLAGS > 0)
OS_FlagInit(); /* Initialize the event flag structures */
#endif
#if (OS_MEM_EN > 0) && (OS_MAX_MEM_PART > 0)
OS_MemInit(); /* Initialize the memory manager */
#endif
#if (OS_Q_EN > 0) && (OS_MAX_QS > 0)
OS_QInit(); /* Initialize the message queue structures */
#endif
OS_InitTaskIdle(); /* Create the Idle Task */
#if OS_TASK_STAT_EN > 0
OS_InitTaskStat(); /* Create the Statistic Task */
#endif
#if OS_TMR_EN > 0
OSTmr_Init(); /* Initialize the Timer Manager */
#endif
OSInitHookEnd(); /* Call port specific init. code */
#if OS_DEBUG_EN > 0
OSDebugInit();
#endif
}
只有红色的部分是默认的部分,而其他部分需要使用宏定义开启,这是否意味着软件上的最小系统也就是这样的呢
这六行代码中有另个hook函数这两个函数需要用户自己实现,当然也可以不实现
OS_InitRdyList(); /* Initialize the Ready List */
OS_InitTCBList(); /* Initialize the free list of OS_TCBs */
OS_InitEventList(); /* Initialize the free list of OS_EVENTs */
这三个函数是关键的函数
OS_InitRdyList();
static void OS_InitRdyList (void)
{
INT8U i;
#if OS_LOWEST_PRIO <= 63
INT8U *prdytbl;
#else
INT16U *prdytbl;
#endif
OSRdyGrp = 0; /* Clear the ready list */
prdytbl = &OSRdyTbl[0];
for (i = 0; i < OS_RDY_TBL_SIZE; i++) {
*prdytbl++ = 0;
}
OSPrioCur = 0;
OSPrioHighRdy = 0;
OSTCBHighRdy = (OS_TCB *)0;
OSTCBCur = (OS_TCB *)0;
}
OSRdyGrp (GLOBAL)
OS_EXT INT8U OSRdyGrp; /* Ready list group */ 在ucos_ii.h中
清空OSRdyTbl[](GLOBAL)
并且对一下的全局变量赋值
OSPrioCur = 0; 当前任务优先级OSPrioHighRdy = 0; 当前就绪的任务的最高优先级
OSTCBHighRdy = (OS_TCB *)0; 当前就绪的最高优先级的任务的TCB
OSTCBCur = (OS_TCB *)0; 当前任务的TCB