没有合适的资源?快使用搜索试试~ 我知道了~
首页uC/OS-II源码分析
uC/OS-II源码分析
需积分: 10 47 下载量 3 浏览量
更新于2023-03-16
评论 2
收藏 196KB DOC 举报
首先从main函数开始,下面是uC/OS-II main函数的大致流程: main() { OSInit(); TaskCreate(...); OSStart(); } 首先是调用OSInit进行初始化,然后使用TaskCreate创建几个进程/Task,最后调用OSStart,操作系统就开始运行了。
资源详情
资源评论
资源推荐
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->OSTCBTaskName[0] = '?';
ptcb1->OSTCBTaskName[1] = OS_ASCII_NUL;
#endif
ptcb1++;
ptcb2++;
}
ptcb1->OSTCBNext = (OS_TCB *)0;
#if OS_TASK_NAME_SIZE > 1
ptcb1->OSTCBTaskName[0] = '?';
ptcb1->OSTCBTaskName[1] = OS_ASCII_NUL;
#endif
OSTCBList = (OS_TCB *)0;
OSTCBFreeList = &OSTCBTbl[0];
}
这里完成的工作很简单,首先把整个数组使用 OSTCBNext 指针连接成链表链
起来,然后将 OSTCBList 初始化为 0,也就是还没有 TCB,因为还没有 Task
产生,OSTCBFreeList 指向 OSTCBTbl[]数组的第一个表示所有 TCB 都处于
Free 状态。
OS_InitEventList()初始化 Event 列表。
static void OS_InitEventList (void)
{
#if OS_EVENT_EN && (OS_MAX_EVENTS > 0)
#if (OS_MAX_EVENTS > 1)
INT16U i;
OS_EVENT *pevent1;
OS_EVENT *pevent2;
OS_MemClr((INT8U *)&OSEventTbl[0], sizeof(OSEventTbl));
pevent1 = &OSEventTbl[0];
pevent2 = &OSEventTbl[1];
for (i = 0; i < (OS_MAX_EVENTS - 1); i++) {
pevent1->OSEventType = OS_EVENT_TYPE_UNUSED;
pevent1->OSEventPtr = pevent2;
#if OS_EVENT_NAME_SIZE > 1
pevent1->OSEventName[0] = '?';
pevent1->OSEventName[1] = OS_ASCII_NUL;
#endif
pevent1++;
pevent2++;
}
pevent1->OSEventType = OS_EVENT_TYPE_UNUSED;
pevent1->OSEventPtr = (OS_EVENT *)0;
#if OS_EVENT_NAME_SIZE > 1
pevent1->OSEventName[0] = '?';
pevent1->OSEventName[1] = OS_ASCII_NUL;
#endif
OSEventFreeList = &OSEventTbl[0];
#else
OSEventFreeList = &OSEventTbl[0];
OSEventFreeList->OSEventType = OS_EVENT_TYPE_UNUSED;
OSEventFreeList->OSEventPtr = (OS_EVENT *)0;
#if OS_EVENT_NAME_SIZE > 1
OSEventFreeList->OSEventName[0] = '?';
OSEventFreeList->OSEventName[1] = OS_ASCII_NUL;
#endif
#endif
#endif
}
同样将 EventTbl[]数组中的 OSEventType 都初始化为
OS_EVENT_TYPE_UNUSED。
OS_InitTaskIdle(),中间我们跳过其他的如 Mem 等的初始化,看看 Idle Task
的初始化。
(void)OSTaskCreateExt(OS_TaskIdle,
(void *)0,
剩余18页未读,继续阅读
haidipaopao
- 粉丝: 2
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 收起
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
会员权益专享
最新资源
- zigbee-cluster-library-specification
- JSBSim Reference Manual
- c++校园超市商品信息管理系统课程设计说明书(含源代码) (2).pdf
- 建筑供配电系统相关课件.pptx
- 企业管理规章制度及管理模式.doc
- vb打开摄像头.doc
- 云计算-可信计算中认证协议改进方案.pdf
- [详细完整版]单片机编程4.ppt
- c语言常用算法.pdf
- c++经典程序代码大全.pdf
- 单片机数字时钟资料.doc
- 11项目管理前沿1.0.pptx
- 基于ssm的“魅力”繁峙宣传网站的设计与实现论文.doc
- 智慧交通综合解决方案.pptx
- 建筑防潮设计-PowerPointPresentati.pptx
- SPC统计过程控制程序.pptx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0