ucos 系统应用过程详解之一 系统初始化
int main() { SysTick_Config(tick); //时钟配置,为系统提供时间片 OSInit(); //初始化 OSTaskCreate(Task,(void *)0,&stk[TASK_SIZE-1], Task_Prio); //任务创建 OSStart(); //任务启动 }
void OSInit (void) { OSInitHookBegin(); /* 钩子函数 */ OS_InitMisc(); /*清零操作 */ OS_InitRdyList(); /* 任务清零 */ OS_InitTCBList(); /*初始化TCB */ OS_InitEventList(); /* 事件列表 */ #if (OS_FLAG_EN > 0u) && (OS_MAX_FLAGS > 0u) OS_FlagInit(); //事件标志 #endif #if (OS_MEM_EN > 0u) && (OS_MAX_MEM_PART > 0u) OS_MemInit(); //内存 #endif #if (OS_Q_EN > 0u) && (OS_MAX_QS > 0u) OS_QInit(); //消息队列 #endif OS_InitTaskIdle(); /* 空任务 */ #if OS_TASK_STAT_EN > 0u OS_InitTaskStat(); /* 建立统计任务 */ #endif #if OS_TMR_EN > 0u OSTmr_Init(); /* 系统定时器 */ #endif OSInitHookEnd(); /* 钩子函数添加用户代码 */ #if OS_DEBUG_EN > 0u OSDebugInit(); #endif }
static void OS_InitMisc (void) { #if OS_TIME_GET_SET_EN > 0u OSTime = 0uL; /* 系统时间清零 */ #endif OSIntNesting = 0u; /* 中断嵌套层数清零 */ OSLockNesting = 0u; /* 任务锁定层数清零 */ OSTaskCtr = 0u; /* 任务计数器清零 */ OSRunning = OS_FALSE; /* 任务运行标志置零 */ OSCtxSwCtr = 0u; /* 任务切换次数清零 */ OSIdleCtr = 0uL; /* 空闲任务计数器清零 */ #if OS_TASK_STAT_EN > 0u OSIdleCtrRun = 0uL; OSIdleCtrMax = 0uL; OSStatRdy = OS_FALSE; /* Statistic task is not ready */ #endif #ifdef OS_SAFETY_CRITICAL_IEC61508 //如果上面为1的话就不允许新建任务 OSSafetyCriticalStartFlag = OS_FALSE; /* Still allow creation of objects */ #endif }
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; OSTCBCur = (OS_TCB *)0; }
static void OS_InitTCBList (void) { INT8U ix; INT8U ix_next; OS_TCB *ptcb1; OS_TCB *ptcb2; OS_MemClr((INT8U *)&OSTCBTbl[0], sizeof(OSTCBTbl)); /* 清空所有的TCB */ OS_MemClr((INT8U *)&OSTCBPrioTbl[0], sizeof(OSTCBPrioTbl)); /* 清空所有任务表 */ for (ix = 0u; ix < (OS_MAX_TASKS + OS_N_SYS_TASKS - 1u); ix++) { /*初始化TCB */ ix_next = ix + 1u; ptcb1 = &OSTCBTbl[ix]; //取第一个TCB ptcb2 = &OSTCBTbl[ix_next]; //取下一个TCB ptcb1->OSTCBNext = ptcb2; //连接起来 #if OS_TASK_NAME_EN > 0u ptcb1->OSTCBTaskName = (INT8U *)(void *)"?"; #endif } ptcb1 = &OSTCBTbl[ix]; //系统任务+用户定义化任务的末尾 ptcb1->OSTCBNext = (OS_TCB *)0; /* Last OS_TCB 下一个TCB为NULL */ #if OS_TASK_NAME_EN > 0u ptcb1->OSTCBTaskName = (INT8U *)(void *)"?"; /* Unknown name */ #endif OSTCBList = (OS_TCB *)0; /* 也就是还没有TCB,因为还没有Task产生*/ OSTCBFreeList = &OSTCBTbl[0]; //所有的TCB都处于free状态 }
static void OS_InitTaskIdle (void) { #if OS_TASK_NAME_EN > 0u INT8U err; #endif #if OS_TASK_CREATE_EXT_EN > 0u #if OS_STK_GROWTH == 1u (void)OSTaskCreateExt(OS_TaskIdle, (void *)0, /* 没有参数传递给 OS_TaskIdle() */ &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1u],/*栈顶 */ OS_TASK_IDLE_PRIO, /* 最低优先级 */ OS_TASK_IDLE_ID, &OSTaskIdleStk[0], /* 栈底 */ OS_TASK_IDLE_STK_SIZE, //栈大小 (void *)0, /* 没有TCB扩展 */ OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* Enable stack checking + clear stack */ #else (void)OSTaskCreateExt(OS_TaskIdle, (void *)0, /* No arguments passed to OS_TaskIdle() */ &OSTaskIdleStk[0], /* 栈从低到高增长 */ OS_TASK_IDLE_PRIO, /* Lowest priority level */ OS_TASK_IDLE_ID, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1u],/* Bottom-Of-Stack */ OS_TASK_IDLE_STK_SIZE, (void *)0, /* No TCB extension */ OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* Enable stack checking + clear stack */ #endif #else #if OS_STK_GROWTH == 1u (void)OSTaskCreate(OS_TaskIdle, (void *)0, &OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1u], OS_TASK_IDLE_PRIO); #else (void)OSTaskCreate(OS_TaskIdle, (void *)0, &OSTaskIdleStk[0], OS_TASK_IDLE_PRIO); #endif #endif #if OS_TASK_NAME_EN > 0u OSTaskNameSet(OS_TASK_IDLE_PRIO, (INT8U *)(void *)"uC/OS-II Idle", &err); //TASK 名字 #endif }
void OS_TaskIdle (void *p_arg) { #if OS_CRITICAL_METHOD == 3u /* cpu中断模式3 */ OS_CPU_SR cpu_sr = 0u; //OS_ENTER_CRITICAL()中应用 #endif p_arg = p_arg; /* Prevent compiler warning for not using 'p_arg' */ for (;;) { OS_ENTER_CRITICAL(); OSIdleCtr++; //空任务运行次数 OS_EXIT_CRITICAL(); OSTaskIdleHook(); /* Call user definable HOOK */ } }
系统初始化主要做的事情有,清空所有标志,包含TCB、任务、时间、优先级、内存等;
然后创建TCB链表,事件链表,创建空任务,用户还可以选择创建系统定时器和状态任务等