ucos详解--初学者入门.pdf
文本预览下载声明
uC/OS-II源码分析(总体思路 一)
首先从main 函数开始,下面是uC/OS-II main 函数的大致流程:
main() {
OSInit();
TaskCreate(...);
OSStart(); }
首先是调用OSInit进行初始化,然后使用TaskCreate 创建几个进程/Task,最
后调用OSStart,操作系统就开始运行了。
OSInit
最先看看OSInit 完成哪些初始化:
void OSInit (void)
{
#if OS_VERSION = 204
OSInitHookBegin();
#endif
OS_InitMisc();
OS_InitRdyList();
OS_InitTCBList();
OS_InitEventList();
#if (OS_VERSION = 251) (OS_FLAG_EN 0) (OS_MAX_FLAGS
0)
OS_FlagInit();
#endif
#if (OS_MEM_EN 0) (OS_MAX_MEM_PART 0)
OS_MemInit();
#endif
#if (OS_Q_EN 0) (OS_MAX_QS 0)
OS_QInit();
#endif
OS_InitTaskIdle();
#if OS_TASK_STAT_EN 0
OS_InitTaskStat();
#endif
#if OS_VERSION = 204
OSInitHookEnd();
#endif
#if OS_VERSION = 270 OS_DEBUG_EN 0
OSDebugInit();
#endif
}
OS_InitMisc()完成的是一些其其他他的变量的初始化:
OSIntNesting = 0;
OSLockNesting = 0;
OSTaskCtr = 0;
OSRunning = FALSE;
OSCtxSwCtr = 0;
OSIdleCtr = 0L;
其中包括:中断嵌套标志OSIntNesting,调度锁定标志OSLockNesting,OS
OSRunning OSRunning FALSE OSStartHighRdy
标志 等。 在这里设置为 ,在后面
中会被设置为TRUE表示OS 开始工作。
OS_InitRdyList()初始化就绪Task列表:
static void OS_InitRdyList (void)
{
INT8U i;
INT8U *prdytbl;
OSRdyGrp = 0x00;
prdytbl = OSRdyTbl[0];
for (i = 0; i OS_RDY_TBL_SIZE; i++) {
*prdytbl++ = 0x00;
}
OSPrioCur = 0;
OSPrioHighRdy = 0;
OSTCBHighRdy = (OS_TCB *)0;
OSTCBCur = (OS_TCB *)0;
}
首先将OSRdyTbl[]数组中全部初始化0,同时将OSPrioCur/OSTCBCur初始化
0 OSPrioHighRdy/OSTCBHighRdy 0
为 , 也初始化为 ,这几个变量将在第一个
OSSchedule中被赋予正确的值。
OS_InitTCBList()这个函数看名称我们就知道是初始化TCB列表。
static void OS_InitTCBList (void)
{
INT8U i;
OS_TCB *ptcb1;
OS_TCB *ptcb2;
OS_MemClr((INT8U *)OSTCBTbl[0], sizeof(OSTCBTbl));
OS_MemClr((INT8U *)OSTCBPrioTbl[0], sizeof(OSTCBPrioTbl));
ptcb1 = OSTCBTbl[0];
ptcb2 = OSTCBTbl[1];
for (i = 0; i (OS_MAX_TASKS + OS_N_SYS_TASKS - 1); i++) {
ptcb1-OSTCBNext = ptcb2;
#if OS_TASK_NAME_SIZE 1
ptcb1-OSTCBTaskNa
显示全部