嵌入式实时操作系统_第1页
嵌入式实时操作系统_第2页
嵌入式实时操作系统_第3页
嵌入式实时操作系统_第4页
嵌入式实时操作系统_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1实时操作系统实时操作系统 C/OS-C/OS-2嵌入式操作系统基本知识嵌入式操作系统基本知识l无操作系统的单片机时代无操作系统的单片机时代l为什么需要嵌入式操作系统为什么需要嵌入式操作系统l目前常见的种嵌入式操作系统目前常见的种嵌入式操作系统l嵌入式操作系统的实时性嵌入式操作系统的实时性3嵌入式软件体系结构(嵌入式软件体系结构(1 1)l无操作系统的情形无操作系统的情形 在嵌入式系统的发展初期,由于硬件的配置比较低,对于是否有系统软件的支持,要求还不是很强烈。在嵌入式系统的发展初期,由于硬件的配置比较低,对于是否有系统软件的支持,要求还不是很强烈。在这个阶段,嵌入式软件的设计主要是以应用为核

2、心,应用软件直接建立在硬件上,没有专门的操作系在这个阶段,嵌入式软件的设计主要是以应用为核心,应用软件直接建立在硬件上,没有专门的操作系统。统。 1.1.循环轮询系统:(循环轮询系统:(Polling LoopPolling Loop) 最简单的软件结构,程序依次检查系统的每个输入条件,一旦条件成立就进行相应的处理。最简单的软件结构,程序依次检查系统的每个输入条件,一旦条件成立就进行相应的处理。Void main ()Void main () Initialize();while(1) if(condition_1) action_1(); if(condition_2) action_2()

3、; if(condition_n) acition_n(); 4嵌入式软件体系结构(嵌入式软件体系结构(2 2)ISRISR后台后台 前台前台ISR时间时间l前后台系统(后台循环、前台中断)5为什么需要操作系统为什么需要操作系统为什么需要操作系统为什么需要操作系统:使硬件方便使用使硬件方便使用 :高效组织和正确使用系统硬件资源高效组织和正确使用系统硬件资源操作系统的主要任务:操作系统的主要任务:l进程管理进程管理l进程间通信与同步进程间通信与同步l内存管理内存管理1.1.I/O I/O 资源管理资源管理6嵌入式软件体系结构(嵌入式软件体系结构(3 3)有操作系统的情形有操作系统的情形硬件板级初

4、始化设备驱动层以太网驱动串口驱动LCD驱动键盘驱动操作系统层应用软件层TCP/IP网络系统文件系统内核嵌入式GUIWWW浏览器MP3播放器电子邮件7常见的常见的4种嵌入式操作系统种嵌入式操作系统lLinux/uClinux lWindows CE lvxWorks lC/OS-II8实时操作系统实时操作系统C/OS-II分析分析 C/OS-II概述概述任务管理任务管理中断和时间中断和时间管理管理任务之间的通信与同步9嵌入式操作系统基本概念嵌入式操作系统基本概念l占先式内核占先式内核l最高优先级的任务被执行最高优先级的任务被执行l优先级分配优先级分配l优先级反转优先级反转l时间的确定性时间的确定

5、性l每个任务的时间都是确定的每个任务的时间都是确定的l任务切换时间任务切换时间l任务的划分任务的划分10RTOSRTOS在嵌入式系统中的位置在嵌入式系统中的位置嵌入式硬件平台BSPKERNELFSTCP/IP设备驱动设备驱动设备设备I/O调试工具调试工具其它组件其它组件应用RTOSC/C+11C/OS简介1、C/OSMicro Controller O S,微控制器操作系统2 2、 C/OSC/OS简介l美国人美国人Jean Labrosse 1992Jean Labrosse 1992年完成年完成l应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动应用面覆盖了诸多领域,如照相机、医疗器

6、械、音响设备、发动机控制、高速公路电话系统、自动提款机等机控制、高速公路电话系统、自动提款机等 l19981998年年 C/OSC/OS-II-II,目前的版本,目前的版本 C/OSC/OS -II V2.61 -II V2.61,2.722.72l20002000年,年,得到美国航空管理局(得到美国航空管理局(FAAFAA)的认证)的认证,可以用于飞行器,可以用于飞行器中中l网站网站www.ucos-II.comwww.ucos-II.com()12C/OS-II的文件结构13实时操作系统实时操作系统C/OS-II分析分析 C/OS-II概述概述任务管理任务管理中断和时间中断和时间管理管理任

7、务之间的通信与同步14lC/OS-C/OS-可以管理多达可以管理多达6464个任务;个任务;l每个任务被赋以不同的每个任务被赋以不同的优先级,取值优先级,取值从从0 0到到6363,数,数值越小,优先级越高;值越小,优先级越高;l任务的优先级同样也是它的任务的优先级同样也是它的标识号标识号IDID。任务管理任务管理15两个特殊的任务空闲任务和统计任务两个特殊的任务空闲任务和统计任务l内核总是创建一个内核总是创建一个空闲任务空闲任务OSTaskIdle()OSTaskIdle();w总是设置为最低优先级,总是设置为最低优先级,OS_LOWEST_PRIOROS_LOWEST_PRIOR;w当所有

8、其他任务都未在执行时,空闲任务开始当所有其他任务都未在执行时,空闲任务开始执行;执行;w应用程序不能删除该任务;应用程序不能删除该任务;w空闲任务的工作就是把空闲任务的工作就是把3232位计数器位计数器OSIdleCtrOSIdleCtr加加1 1,该计数器被统计任务所使用;,该计数器被统计任务所使用;l统计任务统计任务OSTaskStat()OSTaskStat(),提供运行时间统计。每,提供运行时间统计。每秒钟运行一次,计算当前的秒钟运行一次,计算当前的CPUCPU利用率。其优先级利用率。其优先级是是OS_LOWEST_PRIOR-1OS_LOWEST_PRIOR-1,可选。,可选。16多

9、任务是如何执行的多任务是如何执行的-状态的转换状态的转换删除任务删除任务 多任务多任务-单单MCP数码显示管动态显示数码显示管动态显示多任务的管理者多任务的管理者?如何管理多任务如何管理多任务?17多任务的管理者任务控制块多任务的管理者任务控制块TCBTCBl任务控制块任务控制块 OS_TCBOS_TCB是描述一个任务的核是描述一个任务的核心数据结构,存放了它的各种心数据结构,存放了它的各种管理信息管理信息l信息包括任务的状态、信息包括任务的状态、任务堆栈指针任务堆栈指针,任务优先级等;任务优先级等;l每一个任务对应一个每一个任务对应一个TCBTCB18l微处理器只有一个,如何实现多任务执行?

10、微处理器只有一个,如何实现多任务执行?l任务轮换任务轮换l断点保护断点保护-任务栈任务栈19任务控制块任务控制块TCBTCB 栈指针;栈指针; 链表指针;链表指针; INT8U OSTCBStat; /*任务的状态任务的状态*/ INT8U OSTCBPrio; /*任务的优先级任务的优先级*/ 其他其他 OS_TCB;20TCBTCB定义定义ltypedef struct os_tcb l OS_STK *OSTCBStkPtr; /* Pointer to current top of stack */l#if OS_TASK_CREATE_EXT_EN l void *OSTCBExtP

11、tr; /* Pointer to user definable data for TCB extension */l OS_STK *OSTCBStkBottom; /* Pointer to bottom of stack */l INT32U OSTCBStkSize; /* Size of task stack (in bytes) */l INT16U OSTCBOpt; /* Task options as passed by OSTaskCreateExt() */l INT16U OSTCBId; /* Task ID (0.65535) */l#endifl struct o

12、s_tcb *OSTCBNext; /* Pointer to next TCB in the TCB list */l struct os_tcb *OSTCBPrev; /* Pointer to previous TCB in the TCB list */l#if (OS_Q_EN & (OS_MAX_QS = 2) | OS_MBOX_EN | OS_SEM_ENl OS_EVENT *OSTCBEventPtr; /* Pointer to event control block */l#endifl#if (OS_Q_EN & (OS_MAX_QS = 2) |

13、OS_MBOX_ENl void *OSTCBMsg; /* Message received from OSMboxPost() or OSQPost() */l#endif l INT16U OSTCBDly; /* Nbr ticks to delay task or, timeout waiting for event */l INT8U OSTCBStat; /* Task status */l INT8U OSTCBPrio; /* Task priority (0 = highest, 63 = lowest) */l INT8U OSTCBX; /* Bit position

14、in group corresponding to task priority (0.7) */l INT8U OSTCBY; /* Index into ready table corresponding to task priority */l INT8U OSTCBBitX; /* Bit mask to access bit position in ready table */l INT8U OSTCBBitY; /* Bit mask to access bit position in ready group */l l#if OS_TASK_DEL_EN l BOOLEAN OST

15、CBDelReq; /* Indicates whether a task needs to delete itself */l#endifl OS_TCB;21栈指针栈指针lOSTCBStkPtrOSTCBStkPtr:指向当前任务栈顶的指针指向当前任务栈顶的指针,每个任务可以有自己的栈,栈的容量可,每个任务可以有自己的栈,栈的容量可以是任意的;以是任意的;lOSTCBStkBottomOSTCBStkBottom:指向任务栈底的指针;:指向任务栈底的指针;lOSTCBStkSizeOSTCBStkSize:栈的容量。:栈的容量。l任务栈的作用任务栈的作用? ?为什么需要一个任务栈为什么需要

16、一个任务栈? ?2223任务控制块任务控制块TCBTCB的管理的管理lTCBTCB的两个变量的两个变量 struct os_tcb *OSTCBNext; /* Pointer to next TCB in the TCB list */struct os_tcb *OSTCBPrev; /* Pointer to previous TCB in the TCB list */l双向链表双向链表l任务加入与删除任务加入与删除24任务就绪表任务就绪表l多个任务应该执行哪一个?多个任务应该执行哪一个?l任务就绪表任务就绪表l什么是任务就绪表?什么是任务就绪表?l用来存放每个任务的就绪态标志的表用来

17、存放每个任务的就绪态标志的表l这个表是如何组织的?这个表是如何组织的?l用什么数据类型来表示一个任务的就绪与否用什么数据类型来表示一个任务的就绪与否?lBitl需要多少位需要多少位?l64个任务:个任务:64个标志位个标志位2564个任务就绪标志在表中位置个任务就绪标志在表中位置OSRdyTbl0OSRdyTbl1OSRdyTbl2OSRdyTbl3OSRdyTbl4OSRdyTbl5OSRdyTbl6OSRdyTbl7优先级最高任务优先级最高任务 26任务就绪表的组成任务就绪表的组成l6464个任务:个任务:6464个标志位,有两个变量个标志位,有两个变量OSRdyGrpOSRdyGrp和和

18、OSRdyTbl8OSRdyTbl8来组成就绪表。来组成就绪表。lOSRdyGrpOSRdyGrp每一位代表每一位代表1 1组组, ,共共8 8组组l 每一组每一组8 8个成员,第一个成员用个成员,第一个成员用OSRdyTbliOSRdyTbli中的一位来代表。中的一位来代表。27根据优先级确定任务就绪表根据优先级确定任务就绪表OSRdyGrpOSRdyGrp(组)(组) OSRdyTbl8OSRdyTbl8xxxx x x x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx01234567X XY Y11OS

19、RdyTbl1OSRdyGrp |=0 x02;OSRdyTbl1 |=0 x10;优先级为优先级为12的任务进入就绪状态的任务进入就绪状态28数值的确定数值的确定lPrio=12lOSRdyGrp |=0 x02;l在第在第12/812/8位位置置1 1lOSRdyTbl1 |=0 x10;lOSRdyBbl12/8的第的第12%8位置位置1l如何实现在第如何实现在第X位上置位上置1 (X=0,1 ,27)?若优先级值为若优先级值为prioOSRdyGrp:第第prio/8位位置置1;OSRdyBblprio/8的第的第prio%8位置位置1,OSRdyGrp |=0 x02;OSRdyTb

20、l1 |=0 x10;29表格的建立表格的建立Unsigned char OSMapTbl7在第0位上置1在第1位上置1在第7位上置130利用表格使任务进入就绪态利用表格使任务进入就绪态n如果如果prioprio是任务的优先级,将任务放入就绪表,即是任务的优先级,将任务放入就绪表,即使任务进入就绪态的方法是:使任务进入就绪态的方法是:OSRdyGrpOSRdyGrp |= |= OSMapTblOSMapTbl prio/8;OSRdyTblOSRdyTblprio/8 |= |= OSMapTblOSMapTbl prio%8;OSRdyGrpOSRdyGrp |= |= OSMapTblO

21、SMapTblprioprio3;3;OSRdyTblprioOSRdyTblprio3 |= 3 |= OSMapTblOSMapTblprio&0 x07;prio&0 x07;n假设优先级为假设优先级为1212OSRdyGrpOSRdyGrp |= |= OSMapTblOSMapTbl123= OSMapTbl1=(0 x02)123= OSMapTbl1=(0 x02);OSRdyTbl123|= OSRdyTbl123|= OSMapTblOSMapTbl12&0 x07= OSMapTbl4=( 0 x10);12&0 x07= OSMapTbl4

22、=( 0 x10);OSRdyGrp |=0 x02;OSRdyTbl1 |=0 x10;31根据优先级确定任务就绪表根据优先级确定任务就绪表OSRdyGrpOSRdyGrp(组)(组) xxx1 x x x xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx11xxx01234567OSRdyTbl8OSRdyTbl8X XY Y11OSRdyTbl1OSRdyGrp |= OSMapTbl123;OSRdyTbl123 |= OSMapTbl12&0 x07;优先级为优先级为12的任务进入就绪状态的任务进入就绪状

23、态32任务的调度任务的调度l C/OSC/OS是可抢占实时多任务内核,它总是运行是可抢占实时多任务内核,它总是运行就绪任务中就绪任务中优先级最高的那一个优先级最高的那一个。l C/OSC/OS任务调度所花的时间为常数,与应用程任务调度所花的时间为常数,与应用程序中建立的任务数无关。序中建立的任务数无关。l任务的调度工作是由调度器(任务的调度工作是由调度器(SchedulerScheduler)来)来完成的。完成的。 w任务级的调度是由函数任务级的调度是由函数OSSchedOSSched()()完成的;完成的;w根据就绪表确定最高优先级根据就绪表确定最高优先级33根据就绪表确定最高优先级根据就绪

24、表确定最高优先级l通过通过OSRdyGrp OSRdyGrp 和和OSRdyTbliOSRdyTbli确定最高优先级确定最高优先级 l通过通过OSRdyGrp OSRdyGrp 和和OSRdyTbl3 OSRdyTbl3 的值的值l3 3* *8+1=8+1=2525lY Y* *8+X=? Y8+X=? Y是是OSRdyGrpOSRdyGrp中的最右边的中的最右边的1 1的位置的位置lX X是是OSRdyTblYOSRdyTblY中的最右边的中的最右边的1 1的位置的位置03*8+3=270034如何保证寻找最高优先级的时间相等如何保证寻找最高优先级的时间相等35源代码中使用了查表法n查表法

25、具有确定的时间,增加了系统的可查表法具有确定的时间,增加了系统的可预测性,预测性,uC/OSuC/OS中所有的系统调用时间都是中所有的系统调用时间都是确定的确定的Y = OSUnMapTblOSRdyGrp;X = OSUnMapTblOSRdyTblY;Prio = (Y3) + X;lY Y是是OSRdyGrpOSRdyGrp中的最右边的中的最右边的1 1的位置的位置lX X是是OSRdyTblYOSRdyTblY中的最右边的中的最右边的1 1的位置的位置36INT8U const OSUnMapTbl256 = 0, 0, 1, 0, 2, 0, 1, 0, 3, 0, 1, 0, 2,

26、 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,

27、 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,

28、 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;优先级判定表OSUnMapTbl256对于数组中的每一个数取决于对于数组中的每一个数取决于与此对应的下标与此对应的下标: :下标的二进制最下标的二进制最右侧右侧1 1的位置的位置 37根据就绪表确定最高优先级根据就绪表确定最高优先级Y = OSUnMapTblOSRdyGrp;X = OSUnMapTblOSRdyTblY;Prio = (

29、Y3) + X;lOSRdyGrp=8OSRdyGrp=8lOSRdyTbl3=58OSRdyTbl3=5803*8+1=2538INT8U 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,

30、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,

31、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;根据OSUnMapTbl256查最高优先级Y=OSUnMapTbl8Y=OSUnMap

32、Tbl8的值是的值是3 3,8:0000 10008:0000 1000X=OSUnMapTbl58X=OSUnMapTbl58的值是的值是1 1,58:=0X3A 0011 101058:=0X3A 0011 1010 Prio = (YOSTCBPrio != OS_IDLE_PRIO) (3) OS_ENTER_CRITICAL(); if (ptcb-OSTCBDly != 0) if (-ptcb-OSTCBDly = 0) If (!(ptcb-OSTCBStat & OS_STAT_SUSPEND) (4) OSRdyGrp |= ptcb-OSTCBBitY; (5)

33、OSRdyTblptcb-OSTCBY |= ptcb-OSTCBBitX; else ptcb-OSTCBDly = 1; ptcb = ptcb-OSTCBNext; OS_EXIT_CRITICAL(); OS_ENTER_CRITICAL(); (6) OSTime+; (7) OS_EXIT_CRITICAL();45时间管理时间管理与时间管理相关的系统服务与时间管理相关的系统服务: :lOSTimeDLY()lOSTimeDLYHMSM()lOSTimeDlyResmue()lOStimeGet()lOSTimeSet()46OSTimeDLY()OSTimeDLY()vOSTim

34、eDLYOSTimeDLY()():任务延时函数,申请该服:任务延时函数,申请该服务的任务可以延时一段时间;务的任务可以延时一段时间;v调用调用OSTimeDLYOSTimeDLY后,任务进入等待状态;后,任务进入等待状态;v使用方法使用方法wvoid OSTimeDly (INT16U ticks);wticks表示需要延时的时间长度,用时钟节表示需要延时的时间长度,用时钟节拍的个数来表示。拍的个数来表示。47OSTimeDlyHMSM()OSTimeDlyHMSM()vOSTimeDlyHMSMOSTimeDlyHMSM()():OSTimeDlyOSTimeDly()()的另一个的另一个版本,即按时分秒延时函数;版本,即按时分秒延时函数;v使用方法使用方法wINT8U OSTimeDlyHMSM( INT8U hours, / 小时小时 INT8U minutes, / 分钟分钟 INT8U seconds, / 秒秒 INT16U milli / 毫秒毫秒 );48OSTimeDlyResume()OSTimeDlyResume()vOSTimeDlyResumeOSTimeD

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论