uC/OS-II源码分析(一)
2007-11-22 16:49
676 查看
下载地址:http://www.micrium.com/
它的特点:
1)开源,
2)可移植性,绝大部分代码用C写,硬件相关部分用汇编写,
3可固化,
4)可剪裁,这通过条件编译实现,使用#define语句定义所需要的功能。
5)可剥夺性(总是运行就绪条件下优先级最高的任务),
6)多任务(可以管理64个任务,其中保留8个给uC/OS-II,因此用户最多可有56个任务,每个任务优先级不同,也就意味着不支持时间片轮转调度法,因为这种方法适合于优先级平等的任务)。
7)可确定性。函数调度和服务执行时间具有确定性,除了OSTimeTick()和某些事件标志服务,系统服务执行时间不依赖用户应用程序任务数目的多少。
8)任务栈。允许每个任务自己单独的栈空间不同,可以使用栈空间检验函数确定所需要的栈空间大小。
9)系统服务。提供信号量,互斥型信号量,事件标志,消息邮箱,消息队列,块大小固定的内存申请与释放,时间管理函数等服务。
10)中断管理。中断嵌套层数最多可达到255层。
11)稳定性和可靠性。
OSInit()函数用来初始化内核,必须首先调用。建立两个任务:空闲任务(其他任务都未就绪时运行),统计任务(计算CPU的利用率).
*****************************************************************
* Description: This function is used to initialize the
internals of uC/OS-II and MUST be called prior to creating any uC/OS-II object
and, prior to calling OSStart().
*****************************************************************
CodeOS_InitTaskIdle
static void OS_InitTaskIdle (void)
{
#if OS_TASK_NAME_SIZE > 7 //
INT8U err;
#endif
#if OS_TASK_CREATE_EXT_EN > 0 //使用扩展的OSTaskCreateExt来创建
#if OS_STK_GROWTH == 1 //任务堆栈从底部向顶部增长的方向有两种:表示从大到小,表示从小到大
(void)OSTaskCreateExt(OS_TaskIdle,
(void *)0, /* 没有参数传给OS_TaskIdle() */
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], /*设置堆栈顶*/
OS_TASK_IDLE_PRIO, /* 优先级设置为最低*/
OS_TASK_IDLE_ID, //设置ID
&OSTaskIdleStk[0], /* 设置栈底*/
OS_TASK_IDLE_STK_SIZE, //设置栈大小
(void *)0, /* 没有TCB扩展数据结构
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* 允许堆栈检测和清空堆栈*/
#else
(void)OSTaskCreateExt(OS_TaskIdle,
(void *)0, /* No arguments passed to OS_TaskIdle() */
&OSTaskIdleStk[0], /* Set Top-Of-Stack
OS_TASK_IDLE_PRIO, /* Lowest priority level
OS_TASK_IDLE_ID,
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], /* Set 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 //使用不带扩展性的OSTaskCreate创建
#if OS_STK_GROWTH == 1
(void)OSTaskCreate(OS_TaskIdle,
(void *)0,
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1],
OS_TASK_IDLE_PRIO);
#else
(void)OSTaskCreate(OS_TaskIdle,
(void *)0,
&OSTaskIdleStk[0],
OS_TASK_IDLE_PRIO);
#endif
#endif
//设置任务名称
#if OS_TASK_NAME_SIZE > 14
OSTaskNameSet(OS_TASK_IDLE_PRIO, (INT8U *)"uC/OS-II Idle", &err);
#else
#if OS_TASK_NAME_SIZE > 7
OSTaskNameSet(OS_TASK_IDLE_PRIO, (INT8U *)"OS-Idle", &err);
#endif
#endif
}
其他初始化代码放到后面具体的每一个子模块中再分析。
它的特点:
1)开源,
2)可移植性,绝大部分代码用C写,硬件相关部分用汇编写,
3可固化,
4)可剪裁,这通过条件编译实现,使用#define语句定义所需要的功能。
5)可剥夺性(总是运行就绪条件下优先级最高的任务),
6)多任务(可以管理64个任务,其中保留8个给uC/OS-II,因此用户最多可有56个任务,每个任务优先级不同,也就意味着不支持时间片轮转调度法,因为这种方法适合于优先级平等的任务)。
7)可确定性。函数调度和服务执行时间具有确定性,除了OSTimeTick()和某些事件标志服务,系统服务执行时间不依赖用户应用程序任务数目的多少。
8)任务栈。允许每个任务自己单独的栈空间不同,可以使用栈空间检验函数确定所需要的栈空间大小。
9)系统服务。提供信号量,互斥型信号量,事件标志,消息邮箱,消息队列,块大小固定的内存申请与释放,时间管理函数等服务。
10)中断管理。中断嵌套层数最多可达到255层。
11)稳定性和可靠性。
OSInit()函数用来初始化内核,必须首先调用。建立两个任务:空闲任务(其他任务都未就绪时运行),统计任务(计算CPU的利用率).
*****************************************************************
* Description: This function is used to initialize the
internals of uC/OS-II and MUST be called prior to creating any uC/OS-II object
and, prior to calling OSStart().
*****************************************************************
CodeOS_InitTaskIdle
static void OS_InitTaskIdle (void)
{
#if OS_TASK_NAME_SIZE > 7 //
INT8U err;
#endif
#if OS_TASK_CREATE_EXT_EN > 0 //使用扩展的OSTaskCreateExt来创建
#if OS_STK_GROWTH == 1 //任务堆栈从底部向顶部增长的方向有两种:表示从大到小,表示从小到大
(void)OSTaskCreateExt(OS_TaskIdle,
(void *)0, /* 没有参数传给OS_TaskIdle() */
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], /*设置堆栈顶*/
OS_TASK_IDLE_PRIO, /* 优先级设置为最低*/
OS_TASK_IDLE_ID, //设置ID
&OSTaskIdleStk[0], /* 设置栈底*/
OS_TASK_IDLE_STK_SIZE, //设置栈大小
(void *)0, /* 没有TCB扩展数据结构
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);/* 允许堆栈检测和清空堆栈*/
#else
(void)OSTaskCreateExt(OS_TaskIdle,
(void *)0, /* No arguments passed to OS_TaskIdle() */
&OSTaskIdleStk[0], /* Set Top-Of-Stack
OS_TASK_IDLE_PRIO, /* Lowest priority level
OS_TASK_IDLE_ID,
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1], /* Set 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 //使用不带扩展性的OSTaskCreate创建
#if OS_STK_GROWTH == 1
(void)OSTaskCreate(OS_TaskIdle,
(void *)0,
&OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE - 1],
OS_TASK_IDLE_PRIO);
#else
(void)OSTaskCreate(OS_TaskIdle,
(void *)0,
&OSTaskIdleStk[0],
OS_TASK_IDLE_PRIO);
#endif
#endif
//设置任务名称
#if OS_TASK_NAME_SIZE > 14
OSTaskNameSet(OS_TASK_IDLE_PRIO, (INT8U *)"uC/OS-II Idle", &err);
#else
#if OS_TASK_NAME_SIZE > 7
OSTaskNameSet(OS_TASK_IDLE_PRIO, (INT8U *)"OS-Idle", &err);
#endif
#endif
}
其他初始化代码放到后面具体的每一个子模块中再分析。
相关文章推荐
- uC/OS-II源码分析
- uC/OS-II源码分析(转载)
- uC/OS-II源码分析(三)
- uC/OS-II源码分析(五)
- uC/OS-II源码分析(总体思路 二)
- uC/OS-II源码分析
- uC/OS-II源码分析(总体思路一)
- uC/OS-II源码分析(总体思路一)
- uC/OS-II源码分析(一)
- uC/OS-II源码分析(转载)
- uC/OS-II源码分析(总体思路 三)
- uC/OS-II源码分析(总体思路 二)
- uC/OS-II源码分析(总体思路一)
- uC/OS-II源码分析(一)
- uC/OS-II源码分析(二)
- uC/OS-II源码分析(四)
- uC/OS-II源码分析(六)
- uC/OS-II源码入门分析
- uC/OS-II源码分析(总体思路 三)
- uC/OS-II源码分析(四)