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占用率越低。