OperatingSystem的发展I.人工操作:无os,资源独占,利用率低,效率低;II.批处理(弹道和多道):磁盘。作业周转长,无交互能力;III.分时系统:文件系统,前后台。交互,共享。AT&T公司贝尔实验室的两个计算机迷DennisRitchie和KenThompson,首先在PDP-7上实现了UNIX系统。(这样他们可在一台无人使用的DECPDP-7小型计算机上玩星际探险游戏);IV.实时系统:控制,信息处理,及时,可靠;V.分布式操作系统:无主从关系,资源共享;VI.……嵌入式操作系统EmbeddedOperatingSystemLinux,WinCE,VxWorks,OSE,Nucleus,uC/OS-II,eCos,uTTRON……80年代开始:WinCE——MicrosoftVxWorks——WindRiverWinCE1.支持针对小内存体积占用进行的优化:200k2.“硬”实时内核:由于支持256个优先级别和嵌套中断3.强健的内存管理:虚拟地址空间从32MB扩展到当前的64MB。另外还支持内存映射文件。这些基于Win32®的文件映射API除了允许数据文件映射到内存当中并建立类似于内存指针的引用之外,还可以用来分配能够在多个进程之间进行共享的内存。4.开放的通信平台:TCP/IP,IPv6…5.远程和系统管理6.对标准的支持7.广泛的存储和文件系统8.……VxWorksVxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),是嵌入式开发环境的关键组成部分。良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域占据一席之地。它以其良好的可靠性和卓越的实时性被广泛地应用在通信、军事、航空、航天等高精尖技术及实时性要求极高的领域中,如卫星通讯、军事演习、弹道制导、飞机导航等。在美国的F-16、FA-18战斗机、B-2隐形轰炸机和爱国者导弹上,甚至连1997年4月在火星表面登陆的火星探测器上也使用到了VxWorks。μC/OS-Ⅱ是一种免费公开源代码、结构小巧、具有可剥夺实时内核的实时操作系统。其内核提供任务调度与管理、时间管理、任务间同步与通信、内存管理和中断服务等功能。适合小型控制系统,具有执行效率高、占用空间小、实时性能优良和可扩展性强等特点,最小内核可编译至2KB。抢占式内核。UClinux则是继承标准Linux的优良特性,针对嵌入式处理器的特点设计的一种操作系统,具有内嵌网络协议、支持多种文件系统,开发者可利用标准Linux先验知识等优势。其编译后目标文件可控制在几百KB量级。无MMU,采用时间片轮番调度算法。RT_LinuxμC/OS-Ⅱ和UClinux免费且公开源码的E0SμC/OS-ⅡMicroC/OS-IIisahighlyportable,ROMable,scalable,preemptivereal-time,multitaskingkernel(RTOS)formicroprocessorsandmicrocontrollerswithperformancecomparableto-andinsomecasesexceeding-commerciallyavailablekernels.无操作系统-有操作系统区别无操作系统CPUTaskInterface有操作系统Task0Task1……InterfaceTask0Task1CPU无操作系统:1严格按所规定的顺序执行2程序执行的封闭性3独占资源,执行过程和结果不受其它程序的影响4程序结果的可再现性(结果的确定性)5只要初始状态相同,程序多次重复运行,其结果与程序执行速度无关(连续或间断),结果都应相同。有操作系统:多任务系统可以充分的利用系统资源,在对Interface进行操作时,其他任务可以在CPU中运行。特点:可靠性实时性可裁减性要求:多任务抢占式调度任务的通讯与同步任务与中断之间的通讯RTOSDormantReadyRunningISRWaiting/SuspendOSTaskCreate()OSTaskCreateExt()OsTaskDel()OSMBoxPost()OSQPost()OSSemPost()OSTaskResume()OSTimeDlyResume()OSTimeTick()OSMBoxPend()OSQPend()OSSemPend()OSTaskSuspend()OSTimeDly()OSTimeDlyHMSM()OS_TASK_SW()OSIntExit()OSTart()TaskispreemptedOsTaskDel()OsTaskDel()InterruptOsIntExit()OSSched()时钟节拍(ClockTick)μC/OS是系统心脏的脉动,需要用户提供周期性信号源,用于实现时间延时和确认超时。节拍率应在每秒10次到100次之间,或者说10到100Hz。时钟节拍率越高,系统的额外负荷就越重。时钟节拍的实际频率取决于用户应用程序的精度。时钟节拍源可以是专门的硬件定时器,也可以是来自50/60Hz交流电源的信号。用户必须在多任务系统启动以后再开启时钟节拍器OS_TICK_PER_SEC设定时钟节拍OSTimeISR()在每一个时钟节拍时发生中断。OSTimeTick()voidOSTimeTick(void){#ifOS_CRITICAL_METHOD==3/*AllocatestorageforCPUstatusregister*/OS_CPU_SRcpu_sr;#endifOS_TCB*ptcb;OSTimeTickHook();/*Calluserdefinablehook*/#ifOS_TIME_GET_SET_EN0OS_ENTER_CRITICAL();/*Updatethe32-bittickcounter*/OSTime++;OS_EXIT_CRITICAL();#endifif(OSRunning==TRUE){ptcb=OSTCBList;/*PointatfirstTCBinTCBlist*/while(ptcb-OSTCBPrio!=OS_IDLE_PRIO){/*GothroughallTCBsinTCBlist*/OS_ENTER_CRITICAL();if(ptcb-OSTCBDly!=0){/*DelayedorwaitingforeventwithTO*/if(--ptcb-OSTCBDly==0){/*Decrementnbroftickstoendofdelay*/if((ptcb-OSTCBStat&OS_STAT_SUSPEND)==OS_STAT_RDY){/*Istasksuspended?*/OSRdyGrp|=ptcb-OSTCBBitY;/*No,MaketaskR-to-R(timedout)*/OSRdyTbl[ptcb-OSTCBY]|=ptcb-OSTCBBitX;}else{/*Yes,Leave1ticktoprevent...*/ptcb-OSTCBDly=1;/*...loosingthetaskwhenthe...*/}/*...suspensionisremoved.*/}}ptcb=ptcb-OSTCBNext;/*PointatnextTCBinTCBlist*/OS_EXIT_CRITICAL();}}}voidmain(void){..OSInit();/*初始化uC/OS-II*/../*应用程序初始化代码...OSTaskCreate(TaskStart,(void*)0,&TaskStart_Stk[Stk_size-1],4);允许时钟节拍(TICKER)中断;/*千万不要在这里允许时钟节拍中断!!!*/..OSStart();/*开始多任务调度*/}VoidTaskCreate(void*pdata){pdata=pdata;TargetInit();……}OSInit()voidOSInit(void){#ifOS_VERSION=204OSInitHookBegin();/*Callportspecificinitializationcode*/#endifOS_InitMisc();/*Initializemiscellaneousvariables*/OS_InitRdyList();/*InitializetheReadyList*/OS_InitTCBList();/*InitializethefreelistofOS_TCBs*/OS_InitEventList();/*InitializethefreelistofOS_EVENTs*/#if(OS_VERSION=251)&&(OS_FLAG_EN0)&&(OS_MAX_FLAGS0)OS_FlagInit();/*Initializetheeventflagstructures*/#endif#if(OS_MEM_EN0)&&(OS_MAX_MEM_PART0)OS_MemInit();/*Initializethememorymanager*/#endif#if(OS_Q_EN0)&&(OS_MAX_QS0)OS_QInit();/*Initializethemessagequeuestructures*/#endifOS_InitTaskIdle();/*CreatetheIdleTask*/#ifOS_TASK_STAT_EN0OS_InitTaskStat();/*CreatetheStatisticTask*/#endif#ifOS_VERSION=204OSInitHookEnd();/*Callportspecificinit.code*/#endif}TaskControlBlockstypedefstructos_tcb{OS_STK*OSTCBStkPtr;/*Pointertocurrenttopofstack*/#ifOS_TASK_CREATE_EXT_EN0void*OSTCBExtPtr;/*PointertouserdefinabledataforTCBextension*/OS_STK*OSTCBStkBottom;/*Pointertobottomofstack*/INT32UOSTCBStkSize;/*Sizeoftaskstack(innumberofstackelements)*/INT16UOSTCBOpt;/*TaskoptionsaspassedbyOSTaskCreateExt()*/INT16UOSTCBId;/*TaskID(0..65535)*/#endifstructos_tcb*OSTCBNext;/*PointertonextTCBintheTCBlist*/structos_tcb*OSTCBPrev;/*PointertopreviousTCBintheTCBlist*/...…INT16UOSTCBDly;/*Nbrtickstodelaytaskor,timeoutwaitingforevent*/INT8UOSTCBStat;/*Taskstatus*/INT8UOSTCBPrio;/*Taskpriority(0==highest,63==lowest)*/INT8UOSTCBX;/*Bitpositioningroupcorrespondingtotaskpriority(0..7)*/INT8UOSTCBY;/*Indexintoreadytablecorrespondingtotaskpriority*/INT8UOSTCBBitX;/*Bitmasktoaccessbitpositioninreadytable*/INT8UOSTCBBitY;/*Bitmasktoaccessbitpositioninreadygroup*