付费下载
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学完uC/OS-II应掌握的几点王华斌邮箱:(有疑问请发邮件)一、体系结构与处理器无关的代码与处理器相关的代码与应用程序相关的代码二、任务基本概念方面1、任务的状态(5种) 睡眠、就绪、运行、等待、中断服务2、任务的结构
任务控制块TCB+任务堆栈
+任务程序代码3、任务的分类 用户任务+系统任务(空闲和统计任务)4、临界段
OS_ENTER_CRITICAL() OS_EXIT_CRITICAL()5、main函数的结构
main函数的结构voidmain(void){
初始化系统的硬件;OSInit();
任务的建立,消息机制的建立;OSStart();}
这里需要的是在OSStart()执行之前不得启动中断,硬件系统还不能工作.必须先让软件系统进入工作状态后才行.6、任务的优先级 总共有64个优先级=64个任务;
OS_LOWEST_PRIO最低优先级别常数
OSTaskCreat()来创建任务时第四个参数三、任务堆栈1、任务堆栈的数据类型:OS_STK2、堆栈的定义方法 定义一个OS_STK类型的数组。3、在使用堆栈之前必须对堆栈进行初始化
UC/OS-II在创建任务函数中通过调用任务堆栈初始化函数OSTaskStkInit()来完成任务堆栈初始化工作。四、任务控制块1、功能 记录任务的堆栈指针、任务的当前状态、任务的优先级别等一些与任务管理有关的属性。同时OS_TCB负责把代码和任务堆栈进行关联,从而使任务控制块、任务代码和任务堆栈成一个整体。2、结构(重点)3、空任务块链表 应用程序调用函数OSInit()对UC/OS-II系统进行初始化时建立的。先在RAM中建立一个OS_TCB结构类型的数组OSTCBTbl[],这样每个数组元素就是一个任务控制块,然后把这些控制块链接成一个链表。4、任务控制块链表5、OS_TCB类型的变量OSTCBCur
用来存放正在运行任务的任务控制块指针。6、任务控制块进行初始化
当应用程序调用OSTaskCreate()创建一个任务时,这个函数会调用系统函数OSTCBInit()来为任务控制块进行初始化。五、任务就绪表1、需要清楚的2个变量
OSRdyTbl[]就绪表
OSRdyGrp每一位表示一个任务组2、关系
通过一个图示说明:OSRdyTbl[]数组的一个元素就可以表达8个任务的就绪状态;OSRdyGrp的每一个位都对应OSRdyTbl[]的一个任务组。OSRdyTbl[]1/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/01/0OSRdyGrp
D7D6D5D4D3D2D1D0
1/01/01/01/01/01/01/01/0任务就绪表的示意图01234567xy012345673、找出进入就绪态的优先级最高的任务
y=OSUnMapTbl[OSRdyGrp]; x=OSUnMapTbl[OSRdyTbl[y]]; prio=(y<<3)+x;
利用这个优先级的值。查任务控制块优先级表OSTCBPrioTbl[],得到指向相应任务的任务控制块OS_TCB的工作就完成了。六、任务的调度先保护被中止任务的断点数据后恢复待运行任务的断点数据具体过程:OSShed() 获得待运行就绪任务控制块的指针 任务切换宏OS_TASK_SW()七、对任务的操作OSTaskCreate()或OSTaskCreateExt()INT8UOSTaskSuspend(INT8Uprio)INT8UOSTaskResume(INT8Uprio)INT8UOSTaskChangePrio(INT8Uoldprio,INT8Unewprio);INT8UOSTaskQuery(INT8Uprio,OS_TCB*pdata);//存储任务信息 的结构八、中断和时钟中断嵌套层数OSIntNesting进入中断函数OSIntEnter()退出中断函数OSIntExit()中调用了中断级任务切换函数OSIntCtxSw();用户中断服务子程序流程:1、保存全部CPU寄存器;2、调用OSIntEnter或OSIntNesting直接加13、If(OSIntNesting==1){ OSTCBCur->OSTCBStkPtr=SP}//V2.04以上新增4、清中断源5、重新开中断6、执行用户代码做中断服务;7、调用OSIntExit();8、恢复所有CPU寄存器;9、执行中断返回指令;中断服务程序OSTickISR()通过调用函数OSTimeTick()来完成系统在每个时钟节拍时需要做的工作。voidOSTimeDly(INT16Uticks)延时函数1INT8UOSTimeDlyHMSM延时函数2( INT8Uhours,//时
INT8Uminutes,//分
INT8Useconds,//秒
INT16Umilli//毫秒
)INT8UOSTimeDlyResume(INT8Uprio)取消延时的任务INT32UOSTimeGet(void);获取时钟节拍数voidOSTimeSet(INT32Uticks);设置时钟节拍数HOOK函数九、等待任务列表在多任务系统中,当一个事件被占用时,其他请求该事件的任务在暂时得不到事件的服务时应该处于等待状态。INT8U类型的数组OSEventTbl[]作为记录等待事件任务的记录表在这个等待任务表中仍然是以任务的优先级别为顺序,令系统中的每个任务都在表中占据一位,并且当该位为1时表示这一位对应的任务为事件的等待任务,否则不是等待任务。INT8U类型的变量OSEventGrp来表示等待任务表中的任务组十、事件控制块uC/os-ii使用叫做事件控制块ECB的数据结构来描述:信号量、消息邮箱、消息队列这些事件。事件控制块中包含等待任务表在内的所有有关事件的数据。ECB结构如下:typedefstruct{void*OSEventPtr;/*指向消息或者消息队列的指针*/INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*等待任务列表*/INT16UOSEventCnt;/*计数器(当事件是信号量时)*/INT8UOSEventType;/*事件类型*/INT8UOSEventGrp;/*等待任务所在的组*/}OS_EVENT;十一、空事件控制块链表在µC/OS-II中,事件控制块的总数由用户所需要的信号量、邮箱和消息队列的总数决定。该值由OS_CFG.H中的#defineOS_MAX_EVENTS定义。在调用OSInit()时,所有事件控制块被链接成一个单向链表——空闲事件控制块链表。每当建立一个信号量、邮箱或者消息队列时,就从该链表中取出一个空闲事件控制块,并对它进行初始化。而当应用程序删除一个事件时,就会将该事件的控制块归还给空事件控制块链表。十二、信号量操作OS_EVENT*OSSemCreate(INT16Ucnt)voidOSSemPend( OS_EVENT*pevent,//信号量指针
INT16Utimeout,//等待时限
INT8U*err //错误信息
)INT8UOSSemPost(OS_EVENT*pevent)INT16UOSSemAccept(OS_EVENT*pevent)INT8UOSSemQuery(OS_EVENT*pevent,OS_SEM_DATA*pdata)十三、邮箱的操作创建消息邮箱:
OS_EVENT*OSMboxCreate(void*msg)向消息邮箱发送消息:
INT8UOSMboxPost(OS_EVENT*pevent, void*msg)请求消息
void*OSMboxPend(OS_EVENT*pevent, INT16Utimeout,INT8U*err)查询消息邮箱的状态
INT8UOSMboxQuery(OS_EVENT*pevent, OS_MBOX_DATA*pdata)十二、消息队列使用消息队列可以在任务直接传递多条消息。消息队列由3部分组成: 事件控制块、消息队列、消息消息队列相当于一个共用一个任务等待列表的消息邮箱数组,OSEventPtr指向一个叫做队列控制块OS_Q的结构,该结构管理一个数组MsgTbl[],该数组的元素都是一些指向消息的指针。队列控制块: 消息指针数组的基本参数都记录在一个叫做队列控制块的结构中。
typedefstructos_q { structos_q*OSQPtr; void**OSQStart; void**OSQEnd; void**OSQIn; void**OSQOut; void**OSQSize; void**OSQEntries; }OS_Q;在UC/OS-II初始化时,系统将按文件OS_CFG.H中的配置常数OS_MAX_QS定义OS_MAX_QS个队列控制块,并用队列控制块中的指针OSQPtr将所以队列控制块链接为链表。由于这时还没有使用它们,因此这个链表叫做空队列控制块链表。
消息队列的操作OSQCreate()创建消息队列OSQPend()请求消息队列
OSQAccept()无等待地请求消息队列OSQPost()以FIFO方式向消息队列发送消息
OSQPostFront()以LIFO向消息队列发送消息OSQFlush()清空消息队列OSQQuery()查询消息队列十三、信号量集组成:标志组和等待任务链表描述:标志组OS_FLAG_GRP来描述信号量集
typedefstruct{ INT8UOSFlagType;//信号量集的标识
void*OSFlagWaitList;//指向等待任务链表的指针
OS_FLAGSOSFlagFlags;//所有信号列表
}OS_FLAG_GRP;空标志组链表 在UC/OS-II初始化时,系统会根据在文件OS_CFG.H中定义的常数0S_MAX_FLAGS,来创建0S_MAX_FLAGS个标志组(信号量集),并借用成员OSFlagWaitList作为指针把这些标志组链接成一个单向链表。由于这个链表中的各个标志组还未被真正创建,因此叫做空标志组链表!等待任务链表OSFlagNodeFlags和OSFlagNodeWaitType信号量集的操作
创建信号量集OSFlagCreate()
请求信号量集OSFlagPend()
向信号量集发信号OSFlagPost()
查询信号量集的状态OSFlagQuery()
删除信号量集OSFlagDel() OS_FLAG_GRP*OSFlagCreate( OS_FLAGSflags,//信号的初始值
INT8U*err//错误信息
) OS_FLAGSOSFlagPend( OS_FLAG_GRP*pgrp,//请求信号量集指针
OS_FLAGSflags,//滤波器
INT8Uwait_type,//逻辑运算类型
INT16Utimeout,//等待时限
INT8U*err//错误信息
); OS_FLAGSOSFlagPost( OS_FLAG_GRP*pgrp,//请求信号量集指针
OS_FLAGSflags,//选择所要发送的信号
INT8U opt,//信号有效的选项
INTv *err//错误信息
);
OS_FLAGSOSFlagQuery( OS_FLAG_GRP*pgrp,//待查询的信号量集的指针
INTv*err//错误信息
); OS_FLAGSOSFlagDel( OS_FLAG_GRP*pgrp,//待删除的信号量集的指针
INT8Uopt, INT8U*err//错误信息
);十四、内存的基本概念内存空间、内存分区、内存块内存分区的划分:二维数组内存控制块OS_MEM在µC/O
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年二建施工管理典型考题
- 大学新生入学教育起点
- 工厂品质巡检员2026年二季度日常品控巡检工作总结
- 2026年环保型高性能铁氧体磁粉市场创新研究报告
- 医学实验室评审员持续培训
- 《与朱元思书吴均》课件
- 2026中级焊接工工艺培训讲座
- 2026年浙江省杭州市第一中学七年级英语第3章同步练习题及答案
- 2026年上海市北师大版平面设计原理专项训练题库及答案
- 更高更妙的物理竞赛课件竞赛课件21:说磁
- 超声内镜诊疗中国指南(2026 版)
- 产品外观标准检验指导书
- 重温七一重要讲话精神
- 智联猎头:2026年企业薪酬调研报告
- 宫颈癌护理新进展与趋势
- 场景美术创作技法
- 冷却塔填料更换施工方法方案
- GB/T 20042.4-2025质子交换膜燃料电池第4部分:电催化剂测试方法
- 2025年军事理论与国防教育考试题及答案
- 化解矛盾拥抱友谊主题班会
- DB50T 1021-2020 电动汽车简易型交流供电装置技术规范
评论
0/150
提交评论