收藏 分销(赏)

uCOS嵌入式开发教学教程.ppt

上传人:精**** 文档编号:10252405 上传时间:2025-04-30 格式:PPT 页数:41 大小:323KB 下载积分:12 金币
下载 相关 举报
uCOS嵌入式开发教学教程.ppt_第1页
第1页 / 共41页
uCOS嵌入式开发教学教程.ppt_第2页
第2页 / 共41页


点击查看更多>>
资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2002/11,*,嵌入式操作系统,uC,/OS,What is uC,/OS?,u:Micro C:control,uC,/OS:,适合于小的、控制器的操作系统,小巧,公开源代码,详细的注解,可剥夺实时内核,可移植性强,多任务,确定性,The Story of uC,/OS,美国人,Jean Labrosse,1992,年编写的,商业软件的昂贵,应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等,1998,年,uC,/OS-II,,目前的版本,uC,/OS-II V2.51,www.uCOS-II.com,概要,内核结构,-,任务以及调度机制,任务间通信,uC,/OS,的移植,在,PC,机上运行,uC,/OS,任务,task,典型的一个无限循环。,void mytask(void*pdata,),for(;),do something;,waiting;,do something;,支持,64,个任务,每个任务一个特定的优先级。优先级越高,数字越小,系统占用了两个任务,空闲任务和统计任务。,任务的数据结构,任务控制块,任务控制块,OS_tcb,,包括,任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。,所有的任务控制块分为两条链表,空闲链表和使用链表。,OSTCBFreeList,TCB0,TCB1,TCBn,新任务,TCB,(1),空,(2),(3),pre,next,图,4.3 TCB,的双向链表结构,任务控制块结构,Struct os_tcb,OS_STK *OSTCBStkPtr,;,struct os_tcb*OSTCBNext,;,struct os_tcb*OSTCBprev,;,OS_EVENT *OSTCBEventPtr,;,void *OSTCBMsg,;,INT16U OSTCBDly,;,INT8U OSTCBStat,;,INT8U OSTCBPrio,;,INT8U OSTCBX,OSTCBY,OSTCBBitX,OSTCBBitY,;,OS_TCB,任务的状态,任务的状态,OSTCBStat,运行,就绪,等待,挂起,可以有多个准备就绪的任务,但一个时刻只有一个任务可以运行,,OSHighRdy,挂起,队列,邮箱,信号量,低四位,OSTCBStat,任务的调度,-OSSched,uC,/OS,是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有,CPU,的所有权开始投入运行。,uC,/OS,中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行,上下文切换。,任务的调度,就绪任务表:用于存贮每个任务的就绪状态标志。由两个变量组成:,OSRedyGrp,:,8,位,每位表示一组(,8,个)任务中是否有就绪的任务。,OSRdyTbl,:位图方式表示某个任务是否就绪。,就绪状态标志,Bit 0 in,OSRdyGrp,is 1 when any bit in,OSRdyTbl0,is 1.,Bit 1 in,OSRdyGrp,is 1 when any bit in,OSRdyTbl1,is 1.,Bit 2 in,OSRdyGrp,is 1 when any bit in,OSRdyTbl2,is 1.,Bit 3 in,OSRdyGrp,is 1 when any bit in,OSRdyTbl3,is 1.,Bit 4 in,OSRdyGrp,is 1 when any bit in,OSRdyTbl4,is 1.,Bit 5 in,OSRdyGrp,is 1 when any bit in,OSRdyTbl5,is 1.,Bit 6 in,OSRdyGrp,is 1 when any bit in,OSRdyTbl6,is 1.,Bit 7 in,OSRdyGrp,is 1 when any bit in,OSRdyTbl7,is 1.,根据优先级找到任务在就绪任务表中的位置,根据优先级确定就绪表,假设优先级为,12,的任务进入就绪状态,,12=1 100b,则,OSRdyTbl1,的第,4,位置,1,,且,OSRdyGrp,的第,1,位置,1,,相应的数学表达式为,:,OSRdyGrp,|=0 x02,;,OSRdyTbl1|=0 x10;,而优先级为,21,的任务就绪,21=10 101b,,则,OSRdyTbl2,的第,5,位置,1,,且,OSRdyGrp,的第,2,位置,1,相应的数学表达式为:,OSRdyGrp,|=0 x04,;,OSRdyTbl2|=0 x20;,根据优先级确定就绪表,从上面的计算我们可以得到,:,若第,n,位置,1,,则应该与,2,n,相或。,uC,/OS,中,把,2,n,的,n=0-7,的,8,个值,先计算好存在数组,OSMapTbl7,中,也就是:,OSMapTbl0=2,0,=0 x1;,OSMapTbl1=2,1,=0 x2;,OSMapTbl7=2,7,=0 x80;,根据优先级确定就绪表,利用,OSMapTbl,,通过任务的识别号,-,优先级,prio,来设置任务在就绪组和就绪表数组中相应位置的数学式为:,OSRdyGrp|=OSMapTblprio,3;,OSRdyTblprio3|=OSMapTblprio,假设优先级为,12,,,1 100b,OSRdyGrp,|=0 x02,;,OSRdyTbl1|=0 x10;,根据就绪表确定最高优先级(,1,),两个关键,:,优先级数分解为高三位和低三位,分别确定;,高优先级有,着小的优先级号,;,根据就绪表确定最高优先级(,2,),通过,OSRdyGrp,值确定高,3,位,假设为,0 x24=100 100b,-,OSRdyTbl2,和,OSRdyTbl5,,高优先级为,2,通过,OSRdyTbl2,的值来确定低,3,位,,假设为,0 x12=010 010b,,,-,第,2,个和第,5,个任务,取高优先级第,2,个,-,17,源代码中使用了查表法,查表法具有确定的时间,增加了系统的可预测性,,uC,/OS,中所有的系统调用时间都是确定的,High3=OSUnMapTblOSRdyGrp,;,Low3 =OSUnMapTblOSRdyTblHigh3;,Prio,=(Hign33)+Low3;,?为什么频繁的使用查表法,?请问,OSUnMapTbl,的来历;,INT8U const OSUnMapTbl,=,0,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,7,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,6,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,5,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,4,0,1,0,2,0,1,0,3,0,1,0,2,0,1,0,;,任务间通信手段,提供,OS_ENTER_CRITICAL,和,OS_EXIT_CRITICAL,来对临界资源进行保护,OSSchedLock,(),禁止调度,保护任务级的共享资源。,提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。,事件控制块,ECB,所有的通信信号都被看成是事件,(event),一个称为事件控制块,(ECB,Event Control Block),的数据结构来表征每一个具体事件,,ECB,的结构如下:,程序,4.5 ECB,的结构如下,-,typedef struct,void *OSEventPtr,;/*,指向消息或消息队列的指针,*,/,INT8U OSEventTblOS_EVENT_TBL_SIZE,;/*,等待任务列表,*,/,INT16U OSEventCnt,;/*,计数器(当事件是信号量时),*,/,INT8U OSEventType,;/*,事件类型:信号量、邮箱等,*,/,INT8U OSEventGrp,;/*,等待任务组,*,/,OS_EVENT;,与,TCB,类似的结构,使用两个链表,空闲链表与使用,链表,信号量,semaphore,uC,/OS,中信号量由两部分组成:信号量的计数值和等待该信号任务的等待任务表。信号量的计数值可以为二进制,也可以是其他整数。,系统通过,OSSemPend(),和,OSSemPost,(),来支持信号量的两种原子操作,P(),和,V(),。,P(),操作减少信号量的值,如果新的信号量的值不大于,0,则操作阻塞;,V(),操作增加信号量的值。,中断与时钟节拍,我们知道:当发生中断时,首先应保护现场,将,CPU,寄存器入栈,再处理中断函数,然后恢复现场,将,CPU,寄存器出栈,最后执行中断返回,iret(x86),指令实现中断返回。,uC,/OS,中提供了,OSIntEnter(),和,OSIntExit,(),告诉内核进入了中断状态。,OSIntNesting,时钟节拍是一种特殊的中断,操作系统的心脏。首先,32,位的整数,OSTime,加一。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。,多任务的启动,首先创建任务,最后调用,OSStart,开始多任务调度,void main(),OSInit,();,.,OSTaskcreat,(),.,OSStart,();,任务的格式,每个任务不能占用全部,CPU,的资源,需要有等待,或延时等系统调用,典型的一个无限循环。,void mytask(void*pdata,),for(;),do something;,waiting;,do something;,揭开神秘的面纱,任务调度全程追踪,For example1,创建,2,个任务,每个任务仅仅是进行延时,延时不同的时间片,不同优先级,void Task1(void)void Task2(void),while(1)while(1),blinkled1();blinkled2();,Task1Data+;Task2Data+;,OSTimeDly(25);OSTimeDly(50);,void main(),sysinit,();,OSInit,();,OSTaskCreate,(Task1,(void*)&Task1Data,(void*),OSTaskCreate,(Task2,(void*)&Task2Data,(void*),ticker_start(OS_TICKS_PER_SEC);,OSStart,();,void OSStart,(void),INT8U y,x;,if(OSRunning,=FALSE),判断是否没有启动内核,y =OSUnMapTblOSRdyGrp,;,x =OSUnMapTblOSRdyTbly,;,OSPrioHighRdy,=(INT8U)(y 0),确保,tick,大于,0,OS_ENTER_CRITICAL();,进入临界段代码,if(OSRdyTblOSTCBCur-OSTCBY&=OSTCBCur-OSTCBBitX,)=0)/*Delay current task */,OSRdyGrp&=OSTCBCur-OSTCBBitY,;,设置任务为非就绪状态,OSTCBCur-OSTCBDly,=ticks;,在,TCB,中装载延时数,OS_EXIT_CRITICAL();,退出临界段代码,OSSched,();,调度下一个任务开始运行,void OSSched,(void),INT8U y;,OS_ENTER_CRITICAL();,if(OSLockNesting|OSIntNesting,)=0),调度锁,或者处于中断状态禁止调度,y =OSUnMapTblOSRdyGrp,;,OSPrioHighRdy=(INT8U)(y OSTCBPrio,!=OS_IDLE_PRIO),看是不是空闲任务,空闲任务是最后的任务,if(ptcb-OSTCBDly,!=0),是否延时,if(-ptcb-OSTCBDly,=0),延时减一,看是否延时结束,if(!(ptcb-OSTCBStat,&OS_STAT_SUSPEND),OSRdyGrp|=ptcb-OSTCBBitY,;,是的话将其列入准备就绪表,OSRdyTblptcb-OSTCBY|=ptcb-OSTCBBitX,;,else ptcb-OSTCBDly,=1;,ptcb=ptcb-OSTCBNext,;,指针指向下一个,TCB,结构,OSTime,+;,变量加一,记录系统启动以来的时钟滴答数,OSTimeTick,(void),令指针指向第一个任务,是否是空闲任务,?,任务是否存在延时?,延时数减一,延时数是否为,0,?,如果条件合适,将该,任务放入就绪列表,令指针指向下一个任务,OSTime,+,返回,是,否,是,否,是,否,空闲任务总是最后一个任务,对任务表进行扫描,预定的延时到了,就应该在使任务处于就绪,条件是:任务没有处于挂起态,任务没有延时的话忽略即可,时间,任务一,任务二,OSStart,Time Tick,Time Tick,1,25,50,Time Tick,空闲任务,总结,不存在一个内核任务,/,实体,内核的管理是通过调用系统函数来实现的。,每个任务有自己的堆栈空间。内核对任务的占先式调度不会干扰每个任务的总的运行结果。,uC,/OS,的移植,代码分为三部分:,与,CPU,无关的内核代码,包括,os_core.c,os_mbox.c,os_mem.c,os_q.c,os_sem.c,os_task.c,os_time.c,ucos_ii.c,,,ucos_ii.h,;,与应用相关的设置头文件,包括,:os_cfg.h,include.h;,处理器相关的代码,包括:,os_cpu.h,os_cpu_a.asm,os_cpu.c.c,。,移植要点,定义函数,OS_ENTER_CRITICAL,和,OS_ENTER_CRITICAL,。,定义函数,OS_TASK_SW,执行任务切换。,定义函数,OSCtxSw,实现用户级上下文切换,用纯汇编实现。,定义函数,OSIntCtxSw,实现中断级任务切换,用纯汇编实现。,定义函数,OSTickISR,。,定义,OSTaskStkInit,来初始化任务的堆栈。,uC,/OS,的改进,固定的基于优先级的调度,不支持时间片,使用起来不方便。一个任务的基础上增加一个基于时间片的微型调度核,在对临界资源的访问上使用关闭中断实现,没有使用,CPU,提供的硬件指令,例如测试并置位。,系统时钟中断,没有提供用户使用定时器,可以借鉴,linux,的定时器加以修改,可以加上文件系统和,TCP/IP,协议栈,学习,uC,/OS,的步骤,学习与研究,uC,/OS,的起点:在,PC,上执行,uC,/OS,,环境:,TC,编译环境,新建一个工程,应用程序设计:消费者与生产者经典问题。,源代码阅读,移植:,DSP,,单片机,
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服