📄 os_core.c
字号:
*
* 注释 : 该函数为 uC/OS-II的内部函数,应用程序不该调用。
*********************************************************************************************************
*/
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0)
void OS_EventWaitListInit (OS_EVENT *pevent)
{
INT8U *ptbl;
pevent->OSEventGrp = 0x00; /* 没有等待事件的任务 */
ptbl = &pevent->OSEventTbl[0];
#if OS_EVENT_TBL_SIZE > 0
*ptbl++ = 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 1
*ptbl++ = 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 2
*ptbl++ = 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 3
*ptbl++ = 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 4
*ptbl++ = 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 5
*ptbl++ = 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 6
*ptbl++ = 0x00;
#endif
#if OS_EVENT_TBL_SIZE > 7
*ptbl = 0x00;
#endif
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* 初始化
* 初始事件控制块的空余列表
*
* 函数描述: 该函数由 OSInit()调用以初始化事件控制块的空余列表
*
* 输入参数 : 无
*
* 返回值 : 无
*********************************************************************************************************
*/
static void OS_InitEventList (void)
{
#if (OS_EVENT_EN > 0) && (OS_MAX_EVENTS > 0)
#if (OS_MAX_EVENTS > 1)
INT16U i;
OS_EVENT *pevent1;
OS_EVENT *pevent2;
pevent1 = &OSEventTbl[0];
pevent2 = &OSEventTbl[1];
for (i = 0; i < (OS_MAX_EVENTS - 1); i++)
{ /* 初始空余事件控制块列表 */
pevent1->OSEventType = OS_EVENT_TYPE_UNUSED;
pevent1->OSEventPtr = pevent2;
pevent1++;
pevent2++;
}
pevent1->OSEventType = OS_EVENT_TYPE_UNUSED;
pevent1->OSEventPtr = (OS_EVENT *)0;
OSEventFreeList = &OSEventTbl[0];
#else
OSEventFreeList = &OSEventTbl[0]; /* 只有一个事件控制块 */
OSEventFreeList->OSEventType = OS_EVENT_TYPE_UNUSED;
OSEventFreeList->OSEventPtr = (OS_EVENT *)0;
#endif
#endif
}
/*$PAGE*/
/*
*********************************************************************************************************
* 初始化
* 初始化杂项变量
*
* 函数描述: 该函数由 OSInit()调用以初始化杂项变量。
*
* 输入函数 : 无
*
* 返回值 : 无
*********************************************************************************************************
*/
static void OS_InitMisc (void)
{
#if OS_TIME_GET_SET_EN > 0
OSTime = 0L; /* 32位系统时钟清零 */
#endif
OSIntNesting = 0; /* 中断嵌套计数器清零 */
OSLockNesting = 0; /* 调度上锁计数器清零 */
OSTaskCtr = 0; /* 任务数清零 */
OSRunning = FALSE; /* 显示多任务未运行 */
OSCtxSwCtr = 0; /* 任务切换计数器清零 */
OSIdleCtr = 0L; /* 32位空闲计数器清零 */
#if (OS_TASK_STAT_EN > 0) && (OS_TASK_CREATE_EXT_EN > 0)
OSIdleCtrRun = 0L;
OSIdleCtrMax = 0L;
OSStatRdy = FALSE; /* 统计任务未就绪 */
#endif
}
/*$PAGE*/
/*
*********************************************************************************************************
* 初始化
* 初始化就绪列表
*
* 函数描述: 该函数由 OSInit() 调用以初始化就绪列表.
*
* 输入函数 : 无
*
* 返回值 : 无
*********************************************************************************************************
*/
static void OS_InitRdyList (void)
{
INT16U 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;
}
/*$PAGE*/
/*
*********************************************************************************************************
* 初始化
* 创建空闲任务
*
* 函数描述: 该函数创建空闲任务
*
* 输入参数 : 无
*
* 返回值 : 无
*********************************************************************************************************
*/
static void OS_InitTaskIdle (void)
{
#if OS_TASK_CREATE_EXT_EN > 0
#if OS_STK_GROWTH == 1
(void)OSTaskCreateExt(OS_TaskIdle,
(void *)0, /* 无任何参数传给 OS_TaskIdle() */
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], /* 设定栈顶 */
OS_IDLE_PRIO, /* 最低优先级 */
OS_TASK_IDLE_ID,
&OSTaskIdleStk[0], /* 设定栈底 */
OS_TASK_IDLE_STK_SIZE,
(void *)0, /* 无任务控制块扩展 */
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* 使能堆栈检验 + 堆栈清零 */
#else
(void)OSTaskCreateExt(OS_TaskIdle,
(void *)0, /* 无任何参数传给 OS_TaskIdle() */
&OSTaskIdleStk[0], /* 设定栈顶 */
OS_IDLE_PRIO, /* 最低优先级 */
OS_TASK_IDLE_ID,
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], /* 设定栈底 */
OS_TASK_IDLE_STK_SIZE,
(void *)0, /* 无任务控制块扩展 */
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* 使能堆栈检验 + 堆栈清零 */
#endif
#else
#if OS_STK_GROWTH == 1
(void)OSTaskCreate(OS_TaskIdle,
(void *)0,
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1],
OS_IDLE_PRIO);
#else
(void)OSTaskCreate(OS_TaskIdle,
(void *)0,
&OSTaskIdleStk[0],
OS_IDLE_PRIO);
#endif
#endif
}
/*$PAGE*/
/*
*********************************************************************************************************
* 初始化
* 创建统计任务
*
* 函数描述: 该函数创建统计任务。
*
* 输入参数 : 无
*
* 返回值 : 无
*********************************************************************************************************
*/
#if OS_TASK_STAT_EN > 0
static void OS_InitTaskStat (void)
{
#if OS_TASK_CREATE_EXT_EN > 0
#if OS_STK_GROWTH == 1
(void)OSTaskCreateExt(OS_TaskStat,
(void *)0, /* 无任何参数传给 OS_TaskStat()*/
&OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], /* 设定栈顶 */
OS_STAT_PRIO, /* 比空闲任务高一级 */
OS_TASK_STAT_ID,
&OSTaskStatStk[0], /* 设定栈底 */
OS_TASK_STAT_STK_SIZE,
(void *)0, /* 无任务控制块扩展 */
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* 使能堆栈检验 + 堆栈清零 */
#else
(void)OSTaskCreateExt(OS_TaskStat,
(void *)0, /* 无任何参数传给 OS_TaskStat()*/
&OSTaskStatStk[0], /* 设定栈顶 */
OS_STAT_PRIO, /* 比空闲任务高一级 */
OS_TASK_STAT_ID,
&OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], /* 设定栈底 */
OS_TASK_STAT_STK_SIZE,
(void *)0, /* 无任务控制块扩展 */
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR); /* 使能堆栈检验 + 堆栈清零 */
#endif
#else
#if OS_STK_GROWTH == 1
(void)OSTaskCreate(OS_TaskStat,
(void *)0, /* 无任何参数传给 OS_TaskStat()*/
&OSTaskStatStk[OS_TASK_STAT_STK_SIZE - 1], /* 设定栈顶 */
OS_STAT_PRIO); /* 比空闲任务高一级 */
#else
(void)OSTaskCreate(OS_TaskStat,
(void *)0, /* 无任何参数传给 OS_TaskStat()*/
&OSTaskStatStk[0], /* 设定栈顶 */
OS_STAT_PRIO); /* 比空闲任务高一级 */
#endif
#endif
}
#endif
/*$PAGE*/
/*
*********************************************************************************************************
* 初始化
* 初始化任务控制块的空余列表
*
* 函数描述: 该函数由 OSInit()调用以初始化任务控制块的空余列表
*
* 输入参数 : 无
*
* 返回值 : 无
*********************************************************************************************************
*/
static void OS_InitTCBList (void)
{
INT8U i;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -