收藏 分销(赏)

嵌入式系统设计-uCOS原理.ppt

上传人:仙人****88 文档编号:14678528 上传时间:2026-10-28 格式:PPT 页数:105 大小:952KB 下载积分:10 金币
下载 相关
嵌入式系统设计-uCOS原理.ppt_第1页
第1页 / 共105页
嵌入式系统设计-uCOS原理.ppt_第2页
第2页 / 共105页


点击查看更多>>
资源描述
,*,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,uCOS,原理及移植,u:Micro C:control,uCOS:适合于小的、控制器的操作系统小巧,公开源代码,详细的注解,可剥夺实时内核,可移植性强,多任务,确定性,1,概要,内核结构-任务以及调度机制,任务间通信,uC/OS的移植,在PC机上运行uC/OS,2,任务task,典型的一个无限循环。,void mytask(void*pdata),for(;),do something;,waiting;,do something;,支持64个任务,每个任务一个特定的优先级。优先级越高,数字越小,系统占用了两个任务,空闲任务和统计任务。,3,任务的数据结构任务控制块,任务控制块 OS_tcb,包括,任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。,所有的任务控制块分为两条链表,空闲链表和使用链表。,OSTCBFreeList,TCB0,TCB1,TCBn,新任务TCB,(1),空,(2),(3),pre,next,图 4.3 TCB的双向链表结构,4,任务控制块结构,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,5,任务的状态,6,任务的状态 OSTCBStat,运行,就绪,等待,挂起,可以有多个准备就绪的任务,但一个时刻只有一个任务可以运行,OSHighRdy,挂起,队列,邮箱,信号量,低四位,OSTCBStat,7,任务的调度-OSSched,uC/OS,是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有,CPU,的所有权开始投入运行。,就绪任务表:用于存贮每个任务的就绪状态标志。由两个变量组成:,OSRedyGrp:8位,每位表示一组(8个)任务中是否有就绪的任务。,OSRdyTbl:位图方式表示某个任务是否就绪。,8,任务队列,对于就绪任务,如果采用上述队列方式进行管理,在基于优先级的调度处理中,要获得当前具有最高优先级的就绪任务:,方式一:,任务就绪时,把就绪任务的任务控制块放在就绪队列的末尾。,调度程序需要从就绪队列的头部到尾部进行一次遍历,才能获得就绪队列中具有最高优先级的任务;,方式二:就绪队列按照优先级从高到低的顺序排列,。,新的就绪任务到达时,需要插入到就绪队列的合适位置,确保就绪队列保持优先级从高到低排列的顺序性。,9,任务队列,在这两种处理方式中,所花费的时间与任务数量有密切的关系,具有,不确定性,。,为提高实时内核的确定性,可采用一种被称为,优先级位图,的就绪任务处理算法。,10,Free TCBs after,OS_TCBInit(),in uCOS,11,优先级位图算法,OSRdyGrp:优先级就绪组,OSRdyTbl:优先级就绪表,35:00100011,char OSRdyGrp;,char OSRdyTbl8;,12,下标,二进制值,0,00000001,1,00000010,2,00000100,3,00001000,4,00010000,5,00100000,6,01000000,7,10000000,优先级映射表OSMapTbl,char OSMapTbl8=,0 x01,0 x02,0 x04,0 x08,0 x10,0 x20,0 x40,0 x80;,OSMapTbl的数组元素的下标与任务优先级的,低三位,相对应。OSMapTbl的数组元素对应的二进制值中,位为1的位表示OSRdyGrp或是OSRdyTbl的对应位也为1。,35:00100011,13,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,/*0 x00 to 0 x0F */,/*0 x00 to 0 x1F,*/,/*0 x00 to 0 x6F,*/,/*0 x00 to 0 x7F,*/,/*0 x00 to 0 x8F,*/,/*0 x00 to 0 x9F,*/,/*0 x00 to 0 xAF,*/,/*0 x00 to 0 xBF,*/,/*0 x00 to 0 xCF,*/,/*0 x00 to 0 xDF,*/,/*0 x00 to 0 xEF,*/,/*0 x00 to 0 x2F,*/,/*0 x00 to 0 x3F,*/,/*0 x00 to 0 x4F,*/,/*0 x00 to 0 x5F,*/,/*0 x00 to 0 xFF,*/,OSRdyTbl3 contains 0 x,88,OSRdyGrp contains 0 x,50,;,4,=OSUnMapTbl 0 x,50,;,3,=OSUnMapTbl 0 x,88,;,35,=(,4,3;,OSRdyTblpriority 3|=OSMapTblpriority,35:00,100,011,OSRdyGrp,7,6,5,4,3,2,1,0,7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24,39,38,37,36,35,34,33,32,47,46,45,54,43,42,41,40,55,54,53,52,51,50,49,48,63,62,61,60,59,58,57,56,OSRdyTbl,OSRdyTbl0,OSRdyTbl1,OSRdyTbl2,OSRdyTbl3,OSRdyTbl4,OSRdyTbl5,OSRdyTbl6,OSRdyTbl7,00010000,00001000,15,任务退出就绪态,if(OSRdyTblpriority 3&=OSMapTblpriority&0 x07)=0),OSRdyGrp,35:00,100,011,OSRdyGrp,7,6,5,4,3,2,1,0,15,14,13,12,11,10,9,8,23,22,21,20,19,18,17,16,31,30,29,28,27,26,25,24,39,38,37,36,35,34,33,32,47,46,45,54,43,42,41,40,55,54,53,52,51,50,49,48,63,62,61,60,59,58,57,56,7,6,5,4,3,2,1,0,OSRdyTbl,00001000-11110111,00010000-11101111,OSRdyTbl0,OSRdyTbl1,OSRdyTbl2,OSRdyTbl3,OSRdyTbl4,OSRdyTbl5,OSRdyTbl6,OSRdyTbl7,16,获取进入就绪态的最高优先级,high3Bit=OSUnMapTblOSRdyGrp;,low3Bit=OSUnMapTblOSRdyTblhigh3Bit;,priority=(high3Bit 4/high3Bit,0 x88-3/low3Bit,OSRdyTbl0,OSRdyTbl1,OSRdyTbl2,OSRdyTbl3,OSRdyTbl4,OSRdyTbl5,OSRdyTbl6,OSRdyTbl7,17,设计了Task0、Task1两个任务:任务Task0不断地挂起自己,再被任务Task1解挂,两个任务不断地切换执行。,任务的基本管理,18,一个任务通常是一个无限的循环,C/OS-中的任务,必须给每个任务赋以不同的优先级,C/OS-总是运行进入就绪态的优先级最高的任务,19,运行流程,板级初始化,启动,内核初始化,创建起始任务,启动多任务,时钟初始化,创建应用任务,任务轮转,运行流程,20,起始,任务,Task0,Task1,Task0,Task0,Task1,Task1,t0 t1 t2 t3 t4 t5 t6 t7 t8,t1时刻后应用任务开始轮转,运行流程,21,#define,OS_LOWEST_PRIO,14,/*任务优先级不可以大于14*/,#define,OS_TASK_CREATE_EN,1,/*允许使用OSTaskCreate()*/,#define,OS_TASK_SUSPEND_EN,1,/*允许使用OSTaskSuspend()and OSTaskResume()*/,#define,OS_MAX_TASKS,3,/*最多可以创建3个任务*/,操作系统配置,22,OSTaskCreate():建立一个新任务,OSTaskSuspend():无条件挂起一个任务,OSTaskResume():唤醒一个挂起的任务,OSTimeDly():将一个任务延时若干个时钟节拍,23,、创建起始任务TaskStart,OSTaskCreate(,TaskStart,(void*)0,&TaskStartStkTASK_STK_SIZE-1,4,);,源程序说明,24,TaskStart负责:,安装时钟中断服务例程,ucos_x86_idt_set_handler(0 x20,(void*)OSTickISR,0 x8e00);,初始化操作系统时钟,ucos_timer_init();,创建应用任务,TaskStartCreateTasks();,源程序说明,25,2、创建应用任务Task0和Task1,OSTaskCreate(,Task0,(void*)&TaskDatai,&TaskStkiTASK_STK_SIZE-1,5,);,OSTaskCreate(,Task1,(void*)&TaskDatai,&TaskStk1TASK_STK_SIZE-1,6,);,源程序说明,26,Task0功能:挂起自己,void Task0(void*pdata),for(;)/*,无限循环,*/,err=,OSTaskSuspend(5);,/*suspend itself */,err=OSTask,Resume,(,6,);/*,唤醒任务1,*/,3、应用任务,源程序说明,27,Task1功能:唤醒Task0,void Task,1,(void*pdata),for(;)/*无限循环*/,.,err=,OSTaskResume(5);,/*resume task0 */,err=OSTask,Suspend(6);,/*,挂起任务1,*/,源程序说明,28,输出信息,29,高优先级任务需要等待低优先级任务释放资源,而低优先级任务又正在等待中等优先级任务,这种现象就被称为优先级反转。,优先级反转原理,30,共有3个应用任务TA0,TA1,TA2;,优先级:TA0TA1TA2;,TA0和TA2互斥使用资源 mutex;,TA2最先获得mutex。,31,#define,OS_LOWEST_PRIO,9,/*任务优先级不可以大于9*/,#define,OS_TASK_CREATE_EN,1,/*允许使用OSTaskCreate()*/,#define,OS_MAX_TASKS,4,/*最多可以创建4个任务*/,#define,OS_TASK_STAT_EN,0,/*禁止统计任务*/,操作系统配置,32,#define,OS_TICKS_PER_SEC,200,/*设置每秒之内的时钟节拍数目*/,#define,OS_SEM_EN,1,/*是否允许使用信号量功能*/,#,define,OS_MAX_EVENTS,1,/*最多可以有1个事件*/,操作系统配置,33,OSTaskCreate():建立一个新任务,OSTimeDly():将一个任务延时若干个时钟节拍,OSSemCreate():建立并初始化一个信号量,OSSemPend():申请信号量,OSemPost():设置信号量,34,、创建起始任务TaskStart,OSTaskCreate(,TaskStart,(void*)0,&TaskStartStkTASK_STK_SIZE-1,4,);,源程序说明,35,TaskStart负责:,安装时钟中断服务例程,ucos_x86_idt_set_handler(0 x20,(void*)OSTickISR,0 x8e00);,初始化操作系统时钟,ucos_timer_init();,创建应用任务,TaskStartCreateTasks();,源程序说明,36,2、创建应用任务Task0、Task1、Task2,OSTaskCreate(,Task0,(void*)&TaskData0,&TaskStk0TASK_STK_SIZE-1,5,);,OSTaskCreate(,Task1,(void*)&TaskData1,&TaskStk1TASK_STK_SIZE-1,6,);,OSTaskCreate(,Task2,(void*)&TaskData2,&TaskStk2TASK_STK_SIZE-1,7,);,源程序说明,37,void Task0(void*pdata),for(;)/*无限循环*/,OSTimeDly(200);/*,Delay 200 clock tick,*/,OSSemPend(mutex,0,/*Acquire mutex*/,OSTimeDly(200);/*Delay 200 clock tick */,OSSemPost(mutex);,/*Release mutex */,3、应用任务,Task0功能:申请信号量mutex,38,Task1功能:中等优先级任务,抢占Task2的CPU,void Task(void*pdata),for(;)/*无限循环*/,.,OSTimeDly(100);,.,OSTimeDly(100);,源程序说明,39,void Task(void*pdata),for(;)/*无限循环*/,OSSemPend(mutex,0,/*Acquire mutex*/,OSTimeDly(200);/*Delay 200 clock tick */,OSSemPost(mutex);,/*Release mutex */,Task功能:申请信号量mutex,源程序说明,40,t1,t2,t4,t5,t6,t7,t8,t9,t10,t11,7,优先级,6,5,t12,t13,1,0,1,0,2,2,2,1,2,t3,1,0,0,运行流程,41,屏幕输出,42,当高优先级任务因申请某共享资源失败被阻塞时,把当前拥有该资源的、且优先级较低的任务的优先级提升,提升的高度等于这个高优先级任务的优先级(可以指定一个PIP),。,优先级继承的主要思想,43,任务A申请共享资源S,S是否被占用,任务A获得共享资源S,S被任务B占用,任务A被挂起,Priority(B)Priority(A)?,提升B的优先级到PIP,B释放资源s并恢复原来的优先级,等待队列,中优先级最高的任务获得s,任务A继续执行,N,Y,N,Y,44,它们的原始优先级:TASK0 TASK1 TASK2。,3个应用任务竞争同一互斥资源,mutex;,使用mutex时采用优先级继承策略,PIP(优先级继承优先级)为8;,45,#define,OS_LOWEST_PRIO,14,/*任务优先级不可以大于14*/,#define,OS_TASK_CREATE_EN,1,/*允许使用OSTaskCreate()*/,#define,OS_MAX_TASKS,6,/*最多可以创建6个任务*/,#,define,OS_MAX_EVENTS,1,/*最多可以有1个事件*/,操作系统配置,46,#define,OS_MUTEX_EN,1,/*是否允许使用互斥信号量的功能*/,#define,OS_TASK_CHANGE_PRIO_EN,1,/*是否允许使用 OSTaskChangePrio()*/,#define,OS_TIME_DLY_HMSM_EN,1,/*是否允许使用OSTimeDlyHMSM()*/,#define,OS_TICKS_PER_SEC,200,/*设置每秒之内的时钟节拍数目*/,操作系统配置,47,OSTaskCreate():建立一个新任务,OSMutexCreate():创建互斥信号量,OSMutexPend():申请互斥信号量,OSTimeDlyHMSM():将一个任务延时若干时间,OSMutexPost():释放互斥信号量,48,、应用初始化,OSTaskCreate(,TaskStart,(void*)0,&TaskStartStkTASK_STK_SIZE-1,9,);,mutex =OSMutexCreate(,8,设置互斥信号量,其中8为PIP(优先级继承优先级)的值,创建起始任务TaskStart,源程序说明,49,TaskStart负责:,安装时钟中断服务例程,ucos_x86_idt_set_handler(0 x20,(void*)OSTickISR,0 x8e00);,初始化操作系统时钟,ucos_timer_init();,创建应用任务,TaskStartCreateTasks();,源程序说明,50,2、创建应用任务,for(i=0;i Task1Task2Task3Task4,每个任务i均作相同的工作:,申请信号量i,(i+1)mod 5;,保持信号量;,释放信号量(i+1)mod 5,i,用信号量来对共享资源进行互斥访问,55,56,1、Task0 Task4先后执行,显示“,thinking,”,然后挂起;,2、Task0 Task4延时先后到期,显示“,hungry,”,然后挂起;,3、Task0,、2、4、1、3先后获得信号量号,显示“eating,”,然后挂起,;,4、,运行流程,57,#define,OS_TASK_CREATE_EN,1,/*允许使用OSTaskCreate()*/,#define,OS_MAX_TASKS,6,/*最多可以创建6个任务*/,#define,OS_TASK_STAT_EN,0,/*禁止统计任务*/,#define,OS_TASK_CREATE_EXT_EN,1,/*是否允许使用OSTaskCreateExt()*/,操作系统配置,58,#define,OS_TICKS_PER_SEC,200,/*设置每秒之内的时钟节拍数目*/,#define,OS_SEM_EN,1,/*是否允许使用信号量功能*/,#,define,OS_MAX_EVENTS,5,/*最多可以有5个事件*/,#define,OS_LOWEST_PRIO,7,/*任务优先级不可以大于7*/,操作系统配置,59,OSSemCreate,(),:建立并初始化一个信号量,OSSemPend,(),:申请信号量,OSSemPost,(),:释放信号量,OSTimeDly():将一个任务延时若干个时钟节拍,OSTaskCreateExt,(),:创建一个任务,60,、创建起始任务TaskStart,OSTaskCreateExt(,TaskStart,(void*)0,&TaskStartStkTASK_STK_SIZE-1,TASK_START_PRIO,TASK_START_ID,&TaskStartStk0,TASK_STK_SIZE,&TaskUserDataTASK_START_ID,0);,源程序说明,61,TaskStart负责:,安装时钟中断服务例程,ucos_x86_idt_set_handler(0 x20,(void*)OSTickISR,0 x8e00);,初始化操作系统时钟,ucos_timer_init();,创建信号量,forki =OSSemCreate(1);,创建应用任务,TaskStartCreateTasks();,62,2、创建应用任务Task0,Task4,for(i=0;i TA,q2,TaskCon(控制任务),创建队列,以FIFO方式释放消息,以LIFO方式释放消息,清空消息队列、查询消息队列,删除消息队列,91,#define,OS_LOWEST_PRIO,11,/*任务优先级不可以大于11*/,#define,OS_TASK_CREATE_EN,1,/*允许使用OSTaskCreate()*/,#define,OS_MAX_TASKS,8,/*最多可以创建8个任务*/,#define,OS_TASK_STAT_EN,0,/*禁止统计任务*/,操作系统配置,92,#define,OS_Q_EN,1,/*是否允许使用消息队列功能*/,#define,OS_Q_DEL_EN,1,/*是否允许使用OSQDel()*/,#define,OS_Q_FLUSH_EN,1,/*是否允许使用 OSQFlush()*/,#define,OS_Q_POST_EN,1,/*是否允许使用 OSQPost()*/,操作系统配置,93,#define,OS_TICKS_PER_SEC,200,/*设置每秒之内的时钟节拍数目*/,#,define,OS_MAX_EVENTS,2,/*最多可以有2个事件*/,#define,OS_Q_POST_FRONT_EN,1,/*是否允许使用OSQPostFront()*/,#define,OS_Q_QUERY_EN,1,/*是否允许使用OSQQuery()*/,94,OSTaskCreate():建立一个新任务,OSQCreate():建立一个消息队列,OSQPend():等待消息,OSQPostFront():向消息队列发送消息,OSQPost():向消息队列发送消息,95,OSQQuery():取得消息队列的信息,OSQDel():删除消息队列,OSTimeDlyHMSM():将一个任务延时若干时间,OSQFlush():清空消息队列,96,、建立队列和创建起始任务TaskStart,OSTaskCreate(,TaskStart,(void*)0,&TaskStartStkTASK_STK_SIZE-1,0,);,q1=OSQCreate(,q2=OSQCreate(,源程序说明,97,TaskStart负责:,安装时钟中断服务例程,ucos_x86_idt_set_handler(0 x20,(void*)OSTickISR,0 x8e00);,初始化操作系统时钟,ucos_timer_init();,创建应用任务,TaskStartCreateTasks();,98,2、创建任务,for(i=0;i N_TASKS;i+),OSTaskCreate(,Task,q1,(void*),OSTaskCreate(,TaskCon,(void*)0,for(i=0;i N_TASKS;i+),OSTaskCreate(,Task,q2,(void*),99,void Taskq1(void*pdata),for(;)/*无限循环*/,OSTimeDlyHMSM(0,0,2,0);,mg=OSQPend(q1,0,OSTimeDlyHMSM(0,0,0,200*(4-id);,3、普通任务,100,void Taskq2(void*pdata),for(;)/*无限循环*/,OSTimeDlyHMSM(0,0,2,0);,mg=OSQPend(q1,0,OSTimeDlyHMSM(0,0,0,200*(4-id);,3、普通任务,101,4、控制任务,void TaskCon,(void*pdata),for(;)/*无限循环*/,for(i=0;i 6;i+),err=OSQPostFront(q1,(void*)si);,/*post message to q1 LIFO*/,102,for(;)/*无限循环*/,for(i=0;i 6;i+),err=OSQPost(q2,(void*)ti);,/*post message to q2 FIFO*/,源程序说明,103,OSQFlush(q2);/*clear up the queue2.*/,err=OSQQuery(q2,data);,/*get the information about q2*/,q=OSQDel(q2,OS_DEL_ALWAYS,/*delete the q2 */,源程序说明,104,105,
展开阅读全文

开通  VIP、SVIP  下载更划算
下载10份以上建议开通 VIP 会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

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

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

关于我们      便捷服务       自信AI       AI导航        关注我们

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

客服电话:0574-28810668  投诉电话:18658249818

gongan.png浙公网安备33021202000488号   

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

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

客服