




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
ARM原理及应用第五讲
实时操作系统C/OS-Ⅱ分析嵌入式实时操作系统分析详解ppt课件实时操作系统
C/OS-II1324
C/OS-II概述任务管理中断和时间管理任务之间的通信与同步5存储管理实时操作系统C/OS-II1324C/OS-II概述任务通用操作系统和嵌入式(实时)操作系统通用操作系统:Windows/NT/XP、Linux、UNIX等,用于PC机、服务器,嵌入式(实时)操作系统:用于嵌入式设备的操作系统,具有通用操作系统的基本特点,又具有系统实时性、硬件的相关依赖性、软件固态化以及应用的专用性等特点;嵌入式(实时)操作系统通常包括与硬件相关的底层驱动软件、系统内核、设备驱动接口、通信协议、图形界面、标准化浏览器Browser等;嵌入式(实时)操作系统的重要指标:实时性(中断响应时间、任务切换时间等)、尺寸(可裁剪性)、可扩展性(内核、中间件);通用操作系统和嵌入式(实时)操作系统通用操作系统:Windo嵌入式操作系统特点:可装卸性。开放性、可伸缩性的体系结构。强实时性。EOS实时性一般较强,可用于各种设备控制当中。统一的接口。提供各种设备驱动接口。操作方便、简单、提供友好的图形GUI,图形界面,追求易学易用。提供强大的网络功能,支持TCP/IP协议及其它协议,提供TCP/UDP/IP/PPP协议支持及统一的MAC访问层接口,为各种移动计算设备预留接口。强稳定性,弱交互性。嵌入式系统一旦开始运行就不需要用户过多的干预,这就要负责系统管理的EOS具有较强的稳定性。嵌入式操作系统的用户接口一般不提供操作命令,它通过系统的调用命令向用户程序提供服务。固化代码。在嵌入式系统中,嵌入式操作系统和应用软件被固化在嵌入式系统计算机的ROM中。辅助存储器在嵌入式系统中很少使用,因此,嵌入式操作系统的文件管理功能应该能够很容易地拆卸,而用各种内存文件系统。更好的硬件适应性,也就是良好的移植性。嵌入式操作系统特点:嵌入式操作系统的发展操作系统内核应用程序驱动程序和固件操作系统内核文件系统驱动程序和固件APIGUI应用程序操作系统内核文件系统驱动程序和固件APIGUI应用程序通信协议库函数80年代初期80年代中期-90年代中期90年代末期-21世纪嵌入式操作系统的发展操作系统内核应用程序驱动程序和固件操作系常见的嵌入式操作系统实时嵌入式操作系统的种类繁多,大体上可分为两种,商用型和免费型。商用型的实操作系统功能稳定、可靠,有完善的技术支持和售后服务,但往往价格昂贵,如Vxworks、QNX、WinCE、PalmOS等。免费型的实时操作系统在价格方面具有优势,目前主要有Linux,μC/OS是一种源码开放的商业RTOS;μC/OS是商业操作系统常见的嵌入式操作系统实时嵌入式操作系统的种类繁多,大体上RTOS在嵌入式系统中的位置嵌入式硬件平台BSPKERNELFSTCP/IP设备驱动设备I/O调试工具其它组件应用RTOSC/C++RTOS在嵌入式系统中的位置嵌入式硬件平台BSPKERNELC/OS简介
1、C/OS——MicroControllerOS,微控制器操作系统2、C/OS简介美国人JeanLabrosse1992年完成应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等1998年C/OS-II,目前的版本C/OS-IIV2.61,2.722000年,得到美国航空管理局(FAA)的认证,可以用于飞行器中网站www.ucos-II.com()C/OS简介
1、C/OS——MicroControl公开源代码可移植性(Portable)
绝大部分
C/OS-II的源码是用移植性很强的ANSIC写的。和微处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最低限度,使得
C/OS-II便于移植到其他微处理器上。
C/OS-II可以在绝大多数8位、16位、32位以至64位微处理器、微控制器、数字信号处理器(DSP)上运行。可固化(ROMable)
C/OS-II是为嵌入式应用而设计的,这就意味着,只要读者有固化手段(C编译、连接、下载和固化),
C/OS-II可以嵌入到读者的产品中成为产品的一部分。可裁剪(Scalable)
可以只使用
C/OS-II中应用程序需要的那些系统服务。也就是说某产品可以只使用很少几个
C/OS-II调用,而另一个产品则使用了几乎所有
C/OS-II的功能,这样可以减少产品中的
C/OS-II所需的存储器空间(RAM和ROM)。这种可剪裁性是靠条件编译实现的。C/OS的性能特点(一)公开源代码C/OS的性能特点(一)占先式(Preemptive)多任务
C/OS-II可以管理64个任务,然而,目前这一版本保留8个给系统。应用程序最多可以有256个任务可确定性
全部
C/OS-II的函数调用与服务的执行时间具有可确定性。任务栈
每个任务有自己单独的栈,
C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。系统服务
C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。中断管理
中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。稳定性与可靠性C/OS的性能特点(二)占先式(Preemptive)C/OS的性能特点(二)µC/OS-II图书描述了µC/OS-II内部的工作原理随书的CD中包含了源代码工业界最清晰的源代码除英文版外,有中文和韩文版ChineseKoreanEnglishISBN1-57820-103-9美国CMPBOOKISBN7-81077-290-2北京航空航天大学出版社ISBN89-951540-5-5µC/OS-II图书描述了µC/OS-II内部的工作原理ChµC/OS-II的各种商业应用全世界有数百种产品在应用:AvionicsMedicalCellphonesRoutersandswitchesHigh-endaudioequipmentWashingmachinesanddryersUPS(UninterruptiblePowerSupplies)IndustrialcontrollersGPSNavigationSystemsMicrowaveRadiosInstrumentationPoint-of-saleterminals更多µC/OS-II的各种商业应用全世界有数百种产品在应用:µC/OS-II提供的系统服务信号量带互斥机制的信号量减少优先级倒置的问题事件标志消息信箱消息队列内存管理时钟管理任务管理µC/OS-II提供的系统服务信号量µC/GUIandµC/FSµC/GUI嵌入式的用户界面用ANSIC书写支持任何8,16,32-bitsCPU彩色,灰、度,等级或黑白显示代码尺寸小µC/FS嵌入式的文件系统WritteninANSIC用ANSIC书写支持任何8,16,32-bitsCPU支持SMC,MMC,SD,CF,IDE,Flash,RAM其他介质µC/GUIandµC/FSµC/GUIC/OS-II的文件结构C/OS-II的文件结构多道程序技术为了提高计算机系统中各种资源的利用率,现代操作系统广泛采用多道程序技术(multi-programming),使多个程序同时在系统中存在并运行。多道程序技术为了提高计算机系统中各种资源的利用率,CPUI/O单道程序:多道程序:CPUI/O作业甲(红黄)作业乙(蓝绿)CPUI/O单道程序:多道程序:CPUI/O作业甲(红黄)作嵌入式实时操作系统分析详解ppt课件进程、线程和任务在多道程序系统中,各个程序之间是并发执行的,共享系统资源。CPU需要在各个运行的程序之间来回地切换,这样的话,要想描述这些多道的并发活动过程就变得很困难。为此,操作系统设计者提出了进程的概念。进程、线程和任务在多道程序系统中,各个程序之间是并发执什么是进程?Aprocess=aprograminexecution一个进程应该包括:程序的代码;程序的数据;PC中的值,用来指示下一条将运行的指令;一组通用的寄存器的当前值,堆、栈;一组系统资源(如打开的文件)总之,进程包含了正在运行的一个程序的所有
状态信息。什么是进程?Aprocess=aprogramain()
{…..}A()
{…..}
PROCESSAprogramisCstatementsorcommands
静态的;Aprocessisprogram+runningcontext
动态的.main()
{…..}A()
{…..}
PROGRAMheap
StackAMainRegisters,PCProcess≠Programmain()
{AprogramisCstatem进程的特性动态性:程序的运行状态在变,PC、寄存器、
堆和栈等;独立性:是一个独立的实体,是计算机系统资
源的使用单位。每个进程都有“自己”
的PC和内部状态,运行时独立于其他
的进程(逻辑PC和物理PC);并发性:从宏观上看各进程是同时独立运行的进程的特性动态性:程序的运行状态在变,PC、寄存器、
四个进程在并发地运行(本图摘自AndrewS.Tanenbaum:“ModernOperatingSystems”)四个进程在并发地运行(本图摘自AndrewS.Tanen什么是线程?自从60年代提出进程概念以来,在操作系统中一直都是以进程作为独立运行的基本单位,直到80年代中期,人们又提出了更小的能独立运行的基本单位线程。什么是线程?自从60年代提出进程概念以来,在操作系统中Why线程?【案例】编写一个MP3播放软件。核心功能模块有三个:(1)从MP3音频文件当中读取数据;(2)对数据进行解压缩;(3)把解压缩后的音频数据播放出来。Why线程?【案例】编写一个MP3播放软件。核心功能单进程的实现方法
main()
{
while(TRUE)
{Read();
Decompress();
Play();
}}Read(){…}
Decompress(){…}Play(){…}问题:播放出来的声音能
否连贯?各个函数之间不是
并发执行,影响资
源的使用效率;I/OCPU单进程的实现方法
main()
{
wh多进程的实现方法
程序1
main()
{
while(TRUE)
{Read();
}}Read(){…}问题:进程之间如何通信,共享数据?程序3
main()
{
while(TRUE)
{Play();
}}Play(){…}程序2
main()
{
while(TRUE)
{Decompress();
}}Decompress(){…}多进程的实现方法
程序1
main()
{
wh怎么办?
需要提出一种新的实体,满足以下特性:(1)实体之间可以并发地执行;(2)实体之间共享相同的地址空间;这种实体就是:线程(Thread)怎么办?
需要提出一种新的实体,满足以下特性:这种实体就是什么是线程?
Thread:Asequentialexecutionstreamwithin
aprocess;Athreadofexecution;进程当中的一条执行流程。什么是线程?
Thread:从两个方面来理解进程:从资源组合的角度:进程把一组相关的
资源组合起来,构成了一个资源平台
(环境),包括地址空间(代码段、数据
段)、打开的文件等各种资源;从运行的角度:代码在这个资源平台上的
一条执行流程(线程)。资源平台线程从两个方面来理解进程:资源平台线程进程=线程+资源平台优点:一个进程中可以同时存在多个线程;各个线程之间可以并发地执行;各个线程之间可以共享地址空间。进程=线程+资源平台优点:线程所需的资源
(本图摘自Silberschatz,GalvinandGagne:“OperatingSystemConcepts”)线程所需的资源
(本图摘自Silberschatz,Gal1324
C/OS-II概述任务管理中断和时间管理任务之间的通信与同步5存储管理1324C/OS-II概述任务管理中断和时间管理任务之间的什么是任务?
在许多嵌入式操作系统当中,一般把能够独立运行的实体称为“任务”(Task),那么这里所说的任务到底是进程还是线程呢?什么是任务?
在许多嵌入式操作系统当中,一般把任务的实现在多道程序(多任务)的嵌入式操作系统中,任务之间的结构为层状结构,存在着父子关系;当嵌入式内核刚刚启动时,只有一个任务存在,然后由该任务派生出所有其他的任务。任务的实现在多道程序(多任务)的嵌入式操作系统中,任务之间的任务的层次结构OS初始任务任务任务任务任务任务任务任务任务的层次结构OS初始任务任务任务任务任务任务任任务的创建在嵌入式操作系统当中,任务的创建主要有两种模型:fork/exec和spawn;fork/exec:符合IEEE/ISOPOSIX1003.1标准,先用fork系统调用创建与父任务完全相同的一份内存空间,然后再用exec系统调用来移除父任务的内容,并调入子任务的程序代码。优点:允许继承;spawn:直接为子任务创建一个全新的地址空间,并装入其程序代码。任务的创建在嵌入式操作系统当中,任务的创建主要有两种模型:f任务的描述问题:如果让你来设计OS当中的任务
机制,那么你将如何来描述一个任务?描述任务的数据结构:任务控制块(TaskControlBlock,TCB)。系统为每个任务都维护了一个TCB,用来保存与该任务有关的所有信息。任务的描述问题:如果让你来设计OS当中的任务
机制,那么你将任务控制块的内容任务ID、任务的状态、任务的优先级;CPU上下文信息:通用寄存器的值、PC寄存器的值、程序状态字、栈指针的值;如果在该OS中,任务描述的是进程,则还应包括其他的一些内容,如段表地址、页表地址等存储管理方面的信息;根目录、文件描述字等文件管理方面的信息。任务控制块的内容任务ID、任务的状态、任务的优先级;任务的创建:为该任务生成一个TCB;任务的终止:回收它的TCB;任务的组织管理:通过对TCB的组织管理来实现。系统用TCB来描述任务的基本情况以及运行变化的过程,TCB是任务存在的唯一标志。任务的创建:为该任务生成一个TCB;系统用TCB来描述任务的任务的实现创建任务的系统服务OSTaskCreate()INT8UOSTaskCreate(
void(*task)(void*pd),//任务代码指针
void*pdata,//任务参数指针
OS_STK*ptos,//任务栈的栈顶指针
INT8Uprio//任务的优先级
);OSTaskCreateExt()提问:C/OS-II中的任务是进程还是线程?任务的实现创建任务的系统服务提问:C/OS-II中的任务是任务主函数一个任务通常是一个无限循环(返回值类型void)voidMyTask(void*pdata){while(1){dosomething;waiting; dosomething; }}Why?任务主函数一个任务通常是一个无限循环(返回值类型void)W任务也可以自我删除(并非真的删除,只是内核不再知道该任务)voidMyTask(void*pdata){....../*用户代码*/OSTaskDel(OS_PRIO_SELF);}任务也可以自我删除(并非真的删除,只是内核不再知道该任务)μC/OS-Ⅱ可以管理多达64个任务;每个任务被赋以不同的优先级,取值从0到OS_LOWEST_PRIO-2,数值越小,优先级越高;系统保留了优先级为0、1、2、3、OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1以及OS_LOWEST_PRI0这8个任务以被将来使用,用户可以有56个应用任务;任务的优先级同样也是它的标识号ID。OS_CFG.H
中定义=63μC/OS-Ⅱ可以管理多达64个任务;OS_CFG.H
中定空闲任务和统计任务内核总是创建一个空闲任务OSTaskIdle();总是设置为最低优先级,OS_LOWEST_PRIOR;当所有其他任务都未在执行时,空闲任务开始执行;应用程序不能删除该任务;空闲任务的工作就是把32位计数器OSIdleCtr加1,该计数器被统计任务所使用;统计任务OSTaskStat(),提供运行时间统计。每秒钟运行一次,计算当前的CPU利用率。其优先级是OS_LOWEST_PRIOR-1,可选。空闲任务和统计任务内核总是创建一个空闲任务OSTaskIdl任务控制块TCB任务控制块OS_TCB是描述一个任务的核心数据结构,存放了它的各种管理信息,包括任务堆栈指针,任务的状态、优先级,任务链表指针等;一旦任务建立了,任务控制块OS_TCB将被赋值。任务控制块TCB任务控制块OS_TCB是描述一个任务的核心任务控制块TCBtypedefstructos_tcb{栈指针;INT16UOSTCBId;/*任务的ID*/链表指针;OS_EVENT*OSTCBEventPtr;/*事件指针*/void*OSTCBMsg;/*消息指针*/INT8UOSTCBStat;/*任务的状态*/INT8UOSTCBPrio;/*任务的优先级*/其他……}OS_TCB;任务控制块TCBtypedefstructos_tcb任务的状态-休眠休眠状态(Dormant):任务存在于内存空间中,但内核不可见;可以通过以下函数通知内核,使之变为就绪状态:OSTaskCreate()或OSTaskCreateExt()可以通过以下函数返回到休眠状态:OSTaskDel()
任务的状态-休眠休眠状态(Dormant):任务存在于内存空任务的状态-就绪就绪状态(Ready):万事具备,只欠CPU;在所有的就绪任务当中,具有最高优先级的任务被选中去运行;如果任务在运行的时候被抢占了CPU,则又回到就绪状态。任务的状态-就绪就绪状态(Ready):万事具备,只欠CPU任务的状态-运行运行状态(Running):任务在CPU上运行;当一个任务在运行时,如果没有关闭中断,则有可能被中断所打断;当一个任务在运行时,可能因为各种原因进入阻塞状态。OSMBoxPend(),OSQPend(),OSSemPend()OSTaskSuspend(),OSTimeDly()任务的状态-运行运行状态(Running):任务在CPU上运任务的状态-ISR中断服务状态(ISR):该任务原来在CPU上运行,后来被中断所打断,由中断服务程序ISR接管了CPU;当中断服务程序运行完毕后,内核要判断是否有新的、更高优先级的任务就绪,如果有,则原有的任务被抢占;如果没有,则原有的任务重新运行。任务的状态-ISR中断服务状态(ISR):该任务原来在CPU任务的状态-阻塞阻塞/等待状态(Waiting):任务由于正在等待某个事件(信号量、邮箱或队列)而被挂起;当任务等待的事件发生时,回到就绪状态。OSMBoxpost(),OSQPost(),OSSemPost(),OSTaskResume(),OSTimeDlyResume()或OSTimeTick()任务的状态-阻塞阻塞/等待状态(Waiting):任务由于正状态的转换删除任务状态的转换删除任务任务就绪表每个任务的就绪态标志放入在就绪表中,就绪表中有两个变量OSRdyGrp和OSRdyTbl[]。在OSRdyGrp中,任务按优先级分组,8个任务为一组。OSRdyGrp中的每一位表示8组任务中每一组中是否有进入就绪态的任务。任务进入就绪态时,就绪表OSRdyTbl[]中的相应元素的相应位也置位。任务就绪表每个任务的就绪态标志放入在就绪表中,就绪表中有两个任务就绪表OSRdyGrp1207654300XXXYYY任务优先级2017654310891514131211181617232221201926242531302928273432333938373635424041474645444350484955545352515856576362616059[0][1][2][3][4][5][6][7]OSRdyTbl[8]XY优先级最低任务(空闲任务)优先级最高任务任务优先级号对于整数OSRdyTbl[i](0i7),若它的某一位
为1,则OSRdyGrp的第i位为1。任务的优先级由X和Y确定任务就绪表OSRdyGrp1207654300XXXYYY根据优先级确定就绪表(1)假设优先级为12的任务进入就绪状态,12=1100b,则OSRdyTbl[1]的第4位置1,且OSRdyGrp的第1位置1,相应的数学表达式为:
OSRdyGrp|=0x02;OSRdyTbl[1]|=0x10;而优先级为21的任务就绪21=10101b,则OSRdyTbl[2]的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为:
OSRdyGrp|=0x04;OSRdyTbl[2]|=0x20;根据优先级确定就绪表(1)假设优先级为12的任务进入就绪状态根据优先级确定就绪表(2)从上面的计算可知:若OSRdyGrp及OSRdyBbl[]的第n位置1,则应该把OSRdyGrp及OSRdyBbl[]的值与2n相或。uC/OS中,把2n的n=0-7的8个值先计算好存在数组OSMapTbl[7]中,也就是:
OSMapTbl[0]=20=0x01(00000001)OSMapTbl[1]=21=0x02(00000010)
……OSMapTbl[7]=27=0x80(10000000)根据优先级确定就绪表(2)从上面的计算可知:若OSRdyGr使任务进入就绪态如果prio是任务的优先级,即任务的标识号,则将任务放入就绪表,即使任务进入就绪态的方法是:OSRdyGrp|=OSMapTbl[prio>>3];OSRdyTbl[prio>>3]|=OSMapTbl[prio&0x07];假设优先级为12——1100bOSRdyGrp|=OSMapTbl[12>>3](0x02);OSRdyTbl[1]|=0x10;使任务进入就绪态如果prio是任务的优先级,即任务的标识号,使任务脱离就绪态将任务就绪表OSRdyTbl[prio>>3]相应元素的相应位清零,而且当OSRdyTbl[prio>>3]中的所有位都为零时,即该任务所在组的所有任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。if((OSRdyTbl[prio>>3]&=
OSMapTbl[prio&0x07])==0)OSRdyGrp&=
OSMapTbl[prio>>3];使任务脱离就绪态将任务就绪表OSRdyTbl[prio>>3任务的调度
C/OS是可抢占实时多任务内核,它总是运行就绪任务中优先级最高的那一个。
C/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。
C/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关。任务的调度C/OS是可抢占实时多任务内核,它总是运行就绪任确定哪个任务的优先级最高,应该选择哪个任务去运行,这部分的工作是由调度器(Scheduler)来完成的。任务级的调度是由函数OSSched()完成的;中断级的调度是由另一个函数OSIntExt()完成的。确定哪个任务的优先级最高,应该选择哪个任务去运行,这部分的工根据就绪表确定最高优先级两个关键:将优先级数分解为高三位和低三位分别确定;高优先级有着小的优先级号;根据就绪表确定最高优先级两个关键:根据就绪表确定最高优先级通过OSRdyGrp值确定高3位,假设OSRdyGrp=0x08=
0x00001000,第3位为1,优先级的高3位为011;通过OSRdyTbl[3]的值来确定低3位,假设OSRdyTbl[3]=0x3a,第1位为1,优先级的低3位为001,3*8+1=25任务优先级根据就绪表确定最高优先级通过OSRdyGrp值确定高3位,假任务调度器voidOSSched(void){INT8Uy;
OS_ENTER_CRITICAL();if((OSLockNesting|OSIntNesting)==0){ y=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((y<<3)+ OSUnMapTbl[OSRdyTbl[y]]); if(OSPrioHighRdy!=OSPrioCur){ OSTCBHighRdy=OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++;OS_TASK_SW();}}OS_EXIT_CRITICAL();}检查是否中断调用和允许任务调用找到优先级最高的任务该任务是否正在运行任务调度器voidOSSched(void)检查是否中断源代码中使用了查表法查表法具有确定的时间,增加了系统的可预测性,uC/OS中所有的系统调用时间都是确定的Y=OSUnMapTbl[OSRdyGrp];X=OSUnMapTbl[OSRdyTbl[Y]];Prio=(Y<<3)+X;参见OS_CORE.C源代码中使用了查表法查表法具有确定的时间,增加了系统的可预测INT8UconstOSUnMapTbl[]={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};优先级判定表OSUnMapTbl[256]举例:
如OSRdyGrp的值为01101000B,即0X68,则查得OSUnMapTbl[OSRdyGrp]的值是3,它相应于OSRdyGrp中的第3位置1;如OSRdyTbl[3]的值是11100100B,即0XE4,则查OSUnMapTbl[OSRdyTbl[3]]的值是2,则进入就绪态的最高任务优先级Prio=3*8+2=26
INT8UconstOSUnMapTbl[]={优先任务的调度在操作系统中,负责去做这个选择的那
部分程序,称为调度程序或调度器(scheduler);调度程序在决策过程中所采用的算法,
称为是调度算法;调度程序是CPU资源的管理者。任务的调度在操作系统中,负责去做这个选择的那
部分程序,称为何时进行调度?当一个新的任务被创建时,是执行新任务还是继续执行父任务?当一个任务运行完毕时;当一个任务由于I/O、信号量或其他的某个原因被阻塞时;当一个I/O中断发生时,表明某个I/O操作已经完成,而等待该I/O操作的任务转入就绪状态;在分时系统中,当一个时钟中断发生时。何时进行调度?当一个新的任务被创建时,是执行新任务还是继续执两种调度方式不可抢占(non-preemptive)调度方式:一个进程若被选中就一直运行下去,直到它被阻塞(I/O,或正在等待其他进程),或主动地交出CPU。以上的情形1-3均可发生调度;可抢占(preemptive)调度方式:当一个进程在运行时,调度程序可以打断它。以上的情形1-5均可发生调度,另外,在其他一些情形下,如就绪队列中有新进程的优先级高于当前正运行的进程,也可能立即进行调度。两种调度方式不可抢占(non-preemptive)调度方式嵌入式调度算法的评价指标响应时间(responsetime):调度器为一个就绪任务进行上下文切换的时间,以及任务在就绪队列中等待的时间;周转时间(turnaroundtime):一个任务从提交到完成所经历的时间;调度开销(overhead):调度算法在执行时所需要的时间和空间开销;公平(fairness):大致相当的两个进程所得到的CPU时间也应是大致相同的,防止饥饿(starvation);均衡:尽可能使整个系统的各部分(CPU、I/O)都忙起来,提高系统资源的使用效率;吞吐量(Throughput):单位时间内完成的任务数。嵌入式调度算法的评价指标响应时间(responsetime先来先服务调度算法先来先服务(FirstComeFirstServed,FCFS;
FirstInFirstOut,FIFO):按照任务到达就绪队列的先后次序进行调度;不可抢占方式:当前任务占用CPU,直到执行
完或被阻塞,才让出CPU给另外一个任务;在任务被唤醒后(如I/O完成),并不立即恢复
执行,而是放在就绪队列的末尾;优点:简单、公平,易于理解也易于实现。
现实生活中应用广泛:排队。先来先服务调度算法先来先服务(FirstComeFirsFCFS算法的问题平均周转时间取决于各任务到达的顺序,若短任务位于长任务之后,将增大平均周转时间。例如,三个任务A、B、C的运行时间为24、3、3时间242730ABC平均周转时间=(24+27+30)/3=27时间3630ABC平均周转时间=(3+6+30)/3=13FCFS算法的问题平均周转时间取决于各任务到达的顺序,若短任短作业优先调度算法
短作业优先(ShortestJobFirst,SJF),设计
目标是改进FCFS算法,减少平均周转时间;SJF算法要求任务在开始执行时预计执行时间,
对预计执行时间短的任务优先分派处理器;两种实现方案:不可抢占方式:当前任务在运行时不会被打
断,只有运行完毕或阻塞时,才让出CPU;可抢占方式:如果一个新的短任务到来,其
运行时间小于当前正在运行任务的剩余时间,
则抢占CPU运行,称为SRTF(Shortest
RemainingTimeFirst)。短作业优先调度算法短作业优先(ShortestJob可以证明:对于一组同时到达的任务,采用SJF
算法将得到一个最小的平均周转时间。D时间ACaa+ba+b+ca+b+c+d例如,考察4个任务A、B、C、D,其运行时间分
别为a、b、c、dBA、B、C、D的周转时间分别为a、a+b、a+b+c和a+b+c+d,因此平均周转时间为:(4a+3b+2c+d)/4显然,当abcd时,平均周转时间最小。可以证明:对于一组同时到达的任务,采用SJF
算法时间片轮转调度算法在时间片轮转算法(Round-Robin,RR)中,将
所有的就绪任务按照FCFS原则,排成一个队列;每次调度时将处理器分派给队首任务,让其执行
一小段CPU时间(时间片,timeslice);在一个时间片结束时,如果任务还没有执行完的
话,将发生时钟中断,在时钟中断中,调度程序
将暂停当前任务的执行,并将其送到就绪队列的
末尾,然后执行当前的队首任务;如果一个任务在它的时间片用完之前就已结束或
被阻塞,那么立即让出CPU。时间片轮转调度算法在时间片轮转算法(Round-Robin开始时,任务B位于队列之首,因此被调度执行。当
它的时间片用完后,就把它送到就绪队列的末尾。
同时,任务F成为新的队首,被调度运行。开始时,任务B位于队列之首,因此被调度执行。当
它的时间片用Roundrobin,too….Roundrobin,too….时间片轮转法的特点
优点:
公平性:各个就绪任务平均地分配CPU的使用
时间。假设有n个就绪任务,时间片大小为q,
那么每个任务将得到1/n的CPU时间;
活动性:每个任务最多等待(n-1)q时间就能够
再次得到CPU去运行;缺点:q的大小难以确定(一般在20-50ms)。q太大:退化为FCFS算法,进程在一个时间片
内都执行完,响应时间长。如q=100ms;q太小:每个任务都需要更多的时间片才能处理
完,任务切换次数增加,增大系统开销。如q=4ms时间片轮转法的特点优点:优先级调度算法轮转法有一个缺省的前提,即各任务同等重要;“人人生而平等”?恐怕不太现实!同样,并
不是每个任务都同等重要,怎么办?分等级!优先级算法(PriorityScheduling):给每个任
务设置一个优先级,然后在所有就绪任务中选择
优先级最高的那个任务去运行;SJF就是一个优先级算法,每个任务的优先级是
它的CPU运行时间(时间越短,优先级越高);分为可抢占和不可抢占两种方式;各任务优先级
的确定方式可分为静态和动态两种。优先级调度算法轮转法有一个缺省的前提,即各任务同等重要;可抢占方式任务1任务2任务1优先级高低时间任务2任务3表示抢占表示结束可抢占方式任务1任务2任务1优先级高时间任务2任静态优先级方式:指在创建任务时即确定任务的优先级,并保持不变到任务运行结束。缺点:如果一直有高优先级的任务出现,则它们一直占用着CPU,而低优先级的任务“饥饿”。动态优先级方式:指在创建任务时赋予给进程的优先级,在任务运行过程中可以动态改变,以便获得更好的调度性能。为防“饥饿”,根据任务的等待时间调整优先级。在就绪队列中,等待时间延长则优先级提高,从而使优先级较低的任务在等待足够的时间后,其优先级提高到可被调度执行。静态优先级方式:指在创建任务时即确定任务的优先级,并保持不变优先级类别(本图摘自AndrewS.Tanenbaum:“ModernOperatingSystems”)可以把进程按照不同的优先级别分组,然后在不同
级别之间使用优先级算法,而在同一级别的各个进
程之间使用时间片轮转法。优先级类别(本图摘自AndrewS.Tanenbaum:实时系统调度对于RTOS调度器来说,公平性并不重要。例如:如果老师给你布置了五个家庭作业,其中有一个作业必须在一个小时内完成,显然先做那个作业;RTOS调度器的主要目标就是要使得每个任务都必须在其最终时间期限(deadline)之前完成。实时系统调度对于RTOS调度器来说,公平性并不重要。例如:如优先级反转优先级反转大多数RTOS调度器都采用基于优先级的可抢占调度算法;但在具体实现上:如何设定各个任务的优先级?优先级是静态设置的还是动态可变的?算法的性能如何,能否满足实时要求?大多数RTOS调度器都采用基于优先级的可抢占调度算法;任务模型(周期性任务)启动时间r(i,j):第i个任务的第j次执行的开始时间;时间期限Deadline,D(i):第i个任务所允许的最大响应时间(从任务启动到运行结束所需的时间);周期Period,P(i):第i个任务的连续两次运行之间的最小时间间隔;执行时间ExecutionTime,E(i):对于第i个任务,当它所需要的资源都已具备时,它的执行所需要的最长时间。任务模型(周期性任务)启动时间r(i,j):第i个任务的第j典型的RTOS任务模型每个任务用一个三元组来表示(执行时间、周期、deadline);一般来说,周期=deadline;任务可以一个周期内的任何时刻被启动;启动时间执行时间周期0
1
2
3
4
5
6
78p=(2,8,8)典型的RTOS任务模型每个任务用一个三元组来表示(执行时间、单调速率调度算法单调速率调度(RateMonotonicScheduling,RMS)算法;RMS是一种静态优先级调度算法,也是最常用的一种确定任务优先级的算法;思路:单位时间内任务被执行的次数越多,优先级越高。即任务的周期越短,优先级越高。周期 优先级10 1(最高)
12 2
15 3
20 4(最低)例如:单调速率调度算法单调速率调度(RateMonotonicRMS算法是一种最优算法:如果存在一种基于静态优先级的调度顺序,使得每个任务都能够在期限时间内完成,那么RMS算法总能找到一种可行的调度方案;对于一组任务,这种调度方案不一定存在;处理器的利用率:如果U
1,则RMS调度方案不存在(处理器不可能一天工作25小时);如果U
n(21/n
1),n为任务的个数,则RMS调度方案一定存在。RMS算法是一种最优算法:如果存在一种基于静态优先级的调度顺Task1的优先级高于Task2任务1任务2RMS算法超时Task1的优先级任务1任务2RMS算法超时最早期限优先调度算法最早期限优先(EarliestDeadlineFirst,EDF)调度算法:EDF是一种动态优先级调度算法,也是性能最好的一种调度算法;基本思路:对时间期限最近的任务,分配最高的优先级。最早期限优先调度算法最早期限优先(EarliestDeadTask1和Task2的优先级是动态调整的。任务1任务2EDF算法未超时Task1和Task2任务1任务2EDF算法未超时任务切换将被挂起任务的寄存器内容入栈;将较高优先级任务的寄存器内容出栈,恢复到硬件寄存器中。任务切换将被挂起任务的寄存器内容入栈;任务级的任务切换OS_TASK_SW()通过sc系统调用指令完成保护当前任务的现场恢复新任务的现场执行中断返回指令开始执行新的任务任务级的任务切换OS_TASK_SW()通过sc系统调用指令调用OS_TASK_SW()前的数据结构低优先级任务OS_TCBOSTCBCur(1)存贮器低地址存贮器高地址堆栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)调用OS_TASK_SW()前的数据结构低优先级任务OSTC保存当前CPU寄存器的值低优先级任务OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)(1)(3)保存当前CPU寄存器的值低优先级任务OSTCBCurPSWP重新装入要运行的任务低优先级任务OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务OS_TCBOSTCBHighRdyOSTCBCur(1)(2)CPU(4)(4)(1)(3)(3)(4)重新装入要运行的任务低优先级任务OSTCBCurPSWPCR任务切换OS_TASK_SW()的代码VoidOSCtxSw(void){将R1,R2,R3及R4推入当前堆栈;OSTCBCurOSTCBStkPtr=SP;OSTCBCur=OSTCBHighRdy;SP=OSTCBHighRdyOSTCBSTKPtr;将R4,R3,R2及R1从新堆栈中弹出;执行中断返回指令;}任务切换OS_TASK_SW()的代码VoidOSCtxS给调度器上锁OSSchedlock():给调度器上锁函数,用于禁止任务调度,保持对CPU的控制权(即使有优先级更高的任务进入了就绪态);OSSchedUnlock():给调度器开锁函数,当任务完成后调用此函数,调度重新得到允许;当低优先级的任务要发消息给多任务的邮箱、消息队列、信号量时,它不希望高优先级的任务在邮箱、队列和信号量还没有得到消息之前就取得了CPU的控制权,此时,可以使用调度器上锁函数。给调度器上锁OSSchedlock():给调度器上锁函数,用任务管理的系统服务创建任务删除任务修改任务的优先级挂起和恢复任务获得一个任务的有关信息任务管理的系统服务创建任务创建任务创建任务的函数OSTaskCreate();OSTaskCreateExt();OSTaskCreateExt()是OSTaskCreate()的扩展版本,提供了一些附加的功能;任务可以在多任务调度开始(即调用OSStart())之前创建,也可以在其它任务的执行过程中被创建。但在OSStart()被调用之前,用户必须创建至少一个任务;不能在中断服务程序(ISR)中创建新任务。创建任务创建任务的函数OSTaskCreate()INT8UOSTaskCreate(
void(*task)(void*pd),//任务代码指针
void*pdata,//任务参数指针
OS_STK*ptos,//任务栈的栈顶指针
INT8Uprio//任务的优先级
);返回值 OS_NO_ERR:函数调用成功;
OS_PRIO_EXIT:任务优先级已经存在;
OS_PRIO_INVALID:任务优先级无效。OSTaskCreate()INT8UOSTaskCreaOSTaskCreate()的实现过程任务优先级检查该优先级是否在0到OS_LOWSEST_PRIO之间?该优先级是否空闲?调用OSTaskStkInit(),创建任务的栈帧;调用OSTCBInit(),从空闲的OS_TCB池(即OSTCBFreeList链表)中获得一个TCB并初始化其内容,然后把它加入到OSTCBList链表的开头,并把它设定为就绪状态;任务个数OSTaskCtr加1;调用用户自定义的函数OSTaskCreateHook();判断是否需要调度(调用者是正在执行的任务)OSTaskCreate()的实现过程任务优先级检查OSTaskCreateExt()INT8UOSTaskCreateExt(
前四个参数与OSTaskCreate相同,
INT16Uid,//任务的ID
OS_STK*pbos,//指向任务栈底的指针
INT32Ustk_size,//栈能容纳的成员数目
void*pext,//指向用户附加数据域的指针
INT16Uopt//一些选项信息
);返回值:与OSTaskCreate()相同。OSTaskCreateExt()INT8UOSTaskC任务的栈空间每个任务都有自己的栈空间(Stack),栈必须声明为OS_STK类型,并且由连续的内存空间组成;栈空间的分配方法静态分配:在编译的时候分配,例如:
staticOS_STKMyTaskStack[stack_size];
OS_STKMyTaskStack[stack_size];动态分配:在任务运行的时候使用malloc()函数来动态申请内存空间;任务的栈空间每个任务都有自己的栈空间(Stack),栈必须声OS_STK*pstk;
pstk=(OS_STK*)malloc(stack_size);/*确认malloc()能得到足够的内存空间*/
if(pstk!=(OS_STK*)0){Createthetask;}
动态分配OS_STK*pstk;动态分配内存碎片问题在动态分配中,可能存在内存碎片问题。特别是当用户反复地建立和删除任务时,内存堆中可能会出现大量的碎片,导致没有足够大的一块连续内存区域可用作任务栈,这时malloc()便无法成功地为任务分配栈空间。3Kb堆初始状态3个任务删除A,C内碎片/
外碎片?内存碎片问题在动态分配中,可能存在内存碎片问题。特别是当用户栈的增长方向栈的增长方向的设置从低地址到高地址:在OS_CPU.H中,将常量OS_STK_GROWTH设定为0;从高地址到低地址:在OS_CPU.H中,将常量OS_STK_GROWTH设定为1;OS_STKTaskStack[TASK_STACK_SIZE];OSTaskCreate(task,pdata,
&TaskStack[TASK_STACK_SIZE-1],
prio);栈的增长方向栈的增长方向的设置OSTaskChangePrio():在程序运行期间,用户可以通过调用本函数来改变某个任务的优先级。 INT8UOSTaskChangePrio(INT8Uoldprio,
INT8Unewprio)OSTaskQuery():获得一个任务的有关信息获得的是对应任务的OS_TCB中内容的拷贝。OSTaskChangePrio():在程序运行期间,用户可OSTaskSuspend():挂起一个任务如果任务处于就绪态,把它从就绪表中移出;在任务的TCB中设置OS_STAT_SUSPEND标志,表明该任务正在被挂起。OSTaskResume():恢复一个任务恢复被OSTaskSuspend()挂起的任务;清除TCB中OSTCBStat字段的OS_STAT_SUSPEND位挂起和恢复任务OSTaskSuspend():挂起一个任务挂起和恢复任务1324
C/OS-II概述任务管理中断和时间管理任务之间的通信与同步5存储管理6
C/OS-II的移植1324C/OS-II概述任务管理中断和时间管理任务之间的中断处理中断:由于某种事件的发生而导致程序流程的改变。产生中断的事件称为中断源。CPU响应中断的条件:至少有一个中断源向CPU发出中断信号;系统允许中断,且对此中断信号未予屏蔽。中断处理中断:由于某种事件的发生而导致程序流程的改变。产生中中断服务程序ISR中断一旦被识别,CPU会保存部分(或全部)运行上下文(context,即寄存器的值),然后跳转到专门的子程序去处理此次事件,称为中断服务子程序(ISR)。μC/OS-Ⅱ中,中断服务子程序要用汇编语言来编写,然而,如果用户使用的C语言编译器支持在线汇编语言的话,用户可以直接将中断服务子程序代码放在C语言的程序文件中。中断服务程序ISR中断一旦被识别,CPU会保存部分(或全部)(1)保存全部CPU寄存器的值;(2)调用OSIntEnter(),或直接把全局变量OSIntNesting(中断嵌套层次)加1;(3)执行用户代码做中断服务;(4)调用OSIntExit();(5)恢复所有CPU寄存器;(6)执行中断返回指令。用户ISR的框架(1)保存全部CPU寄存器的值;用户ISR的框架嵌入式实时操作系统分析详解ppt课件OSIntEnter()/*在调用本函数之前必须先将中断关闭*/voidOSIntEnter(void){if(OSRunning==TRUE){if(OSIntNesting<255){OSIntNesting++;}}}OSIntEnter()/*在调用本函数之前必须先将中断关OSIntExit的意义OSIntExit的意义OSIntExit()voidOSIntExit(void){OS_ENTER_CRITICAL();//关中断if((--OSIntNesting|OSLockNesting)==0)//判断嵌套是否为零{//把高优先级任务装入OSIntExitY=OSUnMapTbl[OSRdyGrp];OSPrioHighRdy=(INT8U)((OSIntExitY<<3)+OSUnMapTbl[OSRdyTbl[OSIntExitY]]);if(OSPrioHighRdy!=OSPrioCur){OSTCBHighRdy=
OSTCBPrioTbl[OSPrioHighRdy];OSCtxSwCtr++;
OSIntCtxSw();}}OS_EXIT_CRITICAL();//开中断返回}OSIntExit()voidOSIntExit(voiOSIntCtxSw()在任务切换时,为什么使用OSIntCtxSw()而不是调度函数中的OS_TASK_SW()?原因有二点一半的任务切换工作,即CPU寄存器入栈,已经在前面做完了;需要保证所有被挂起任务的栈结构是一样的。OSIntCtxSw()在任务切换时,为什么使用OSIntCOSIntExit的关键——OSIntCtxSw实现中断级的任务切换ARM在栈指针调整过程中的优势OSIntExit的关键——OSIntCtxSw实现中断级的调用中断切换函数OSIntCtxSw()后的堆栈情况调用中断切换函数OSIntCtxSw()后的堆栈情况时钟节拍时钟节拍是一种特殊的中断,相当于操作系统的心脏起搏器;μC/OS需要用户提供周期性信号源,用于实现时间延时和确认超时。节拍率应在10到100Hz之间,时钟节拍率越高,系统的额外负荷就越重;时钟节拍的实际频率取决于用户应用程序的精度。时钟节拍源可以是专门的硬件定时器,或是来自50/60Hz交流电源的信号。时钟节拍时钟节拍是一种特殊的中断,相当于操作系统的心脏起搏器时钟节拍ISRvoidOSTickISR(void){
(1)保存处理器寄存器的值;
(2)调用OSIntEnter()或将OSIntNesting加1;
(3)调用OSTimeTick();/*检查每个任务的时间延时*/
(4)调用OSIntExit();
(5)恢复处理器寄存器的值;
(6)执行中断返回指令;}时钟节拍ISRvoidOSTickISR(void)时钟节拍函数OSTimtick()时钟节拍函数OSTimtick()时间管理与时间管理相关的系统服务:OSTimeDLY()OSTimeDLYHMSM()OSTimeDlyResmue()OStimeGet()OSTimeSet()时间管理与时间管理相关的系统服务:OSTimeDLY()OSTimeDLY():任务延时函数,申请该服务的任务可以延时一段时间;调用OSTimeDLY后,任务进入等待状态;使用方法voidOSTimeDly(INT16Uticks);ticks表示需要延时的时间长度,用时钟节拍的个数来表示。OSTimeDLY()OSTimeDLY():任务延时函数,OSTimeDLY()voidOSTimeDly(INT16Uticks){if(ticks>0){OS_ENTER_CRITICAL();if((OSRdyTbl[OSTCBCur->OSTCBY]&=~OSTCBCur->OSTCBBitX)==0){OSRdyGrp&=~OSTCBCur->OSTCBBitY;}OSTCBCur->OSTCBDly=ticks;OS_EXIT_CRITICAL();OSSched();}}OSTimeDLY()voidOSTimeDly(INTOSTimeDLY(1)的问题OSTimeDLY(1)的问题OSTimeDlyHMSM()OSTimeDlyHMSM():OSTimeDly()的另一个版本,即按时分秒延时函数;使用方法INT8UOSTimeDlyHMSM(
INT8Uhours,//小时
INT8Uminutes,//分钟
INT8Useconds,//秒
INT16Umilli//毫秒
);OSTimeDlyHMSM()OSTimeDlyHMSM()OSTimeDlyResume()OSTimeDlyResume():让处在延时期的任务提前结束延时,进入就绪状态;使用方法INT8UOSTimeDlyResume(INT8U
prio);prio表示需要提前结束延时的任务的优先级/任务ID。OSTimeDlyResume()OSTimeDlyResu系统时间每隔一个时钟节拍,发生一个时钟中断,将一个32位的计数器OSTime加1;该计数器在用户调用OSStart()初始化多任务和4,294,967,295个节拍执行完一遍的时候从0开始计数。若时钟节拍的频率等于100Hz,该计数器每隔497天就重新开始计数;OSTimeGet():获得该计数器的当前值;INT32UOSTimeGet(void);OSTimeSet():设置该计数器的值。voidOSTimeSet(INT32Uticks);系统时间每隔一个时钟节拍,发生一个时钟中断,将一个32位的计何时启动系统定时器如果在OSStart之前启动定时器,则系统可能无法正确执行完OSStartHighRdyOSStart函数直接调用OSStartHighRdy去执行最高优先级的任务,OSStart不返回。系统定时器应该在系统的最高优先级任务中启动使用OSRunning变量来控制操作系统的运行在我们的移植版本中,使用了uCOS-II中的保留任务1作为系统任务。负责启动定时器何时启动系统定时器如果在OSStart之前启动定时器,则系统时钟节拍的启动用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用OSStart()之后;在调用OSStart()之后做的第一件事是初始化定时器中断。voidmain(void){...OSInit();/*初始化uC/OS-II*//*应用程序初始化代码...*//*调用OSTaskCreate()创建至少一个任务*/
允许时钟节拍中断;/*错误!可能crash!*/OSStart();/*开始多任务调度*/}时钟节拍的启动用户必须在多任务系统启动以后再开启时钟节拍器,系统的初始化与启动在调用
C/OS-II的任何其它服务之前,用户必须首先调用系统初始化函数OSInit()来初始化
C/OS的所有变量和数据结构;OSInit()建立空闲任务OSTaskIdle(),该任务总是处于就绪状态,其优先级一般被设成最低,即OS_LOWEST_PRIO;如果需要,OSInit()还建立统计任务OSTaskStat(),并让其进入就绪状态;OSInit()还初始化了4个空数据结构缓冲区:空闲TCB链表OSTCBFreeList、空闲事件链表OSEventFreeList、空闲队列链表OSQFreeList和空闲存储链表OSMemFreeList。系统的初始化与启动在调用C/OS-II的任何其它服务之前,系统初始化后的状态系统初始化后的状态C/OS-II的启动多任务的启动是用户通过调用OSStart()实现的。然而,启动μC/OS-Ⅱ之前,用户至少要建立一个应用任务。voidmain(void){OSInit();/*初始化uC/OS-II*/...
通过调用OSTaskCreate()或OSTaskCreateExt()
创建至少一个任务;...
OSStart();
/*开始多任务调度!永不返回*/
}C/OS-II的启动多任务的启动是用户通过调用OSStarOSStart()voidOSStart(void){INT8UY;INT8UX;if(OSRunning==FALSE){y=OSUnMapTbl[OSRdyGrp];x=OSUnMapTbl[OSRdyTbl[y]];OSPrioHighRdy=(INT8U)((Y<<3)+X);OSPrioCur=OSPrioHighRdy;OSTCBHighRdy=
OSTCBPrioTbl[OSPrioHighRdy];OSTCBCur=OSTCBHighRdy;OSStartHighRdy();}}OSStart()voidOSStart(void)统计任务初始化函数OSStatInit(void)统计任务初始化函数OSStatInit(void)统计任务初始化统计任务初始化系统启动后的状态假设用户创建的任务优先级为6系统启动后的状态假设用户创建的1324
C/OS-II概述任务管理中断和时间管理任务之间的通信与同步5存储管理1324C/OS-II概述任务管理中断和时间管
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 服务管理中的马工学应用试题及答案
- 地震带与火山带分布试题及答案
- 婴幼儿行为管理技巧试题及答案
- 2024年陪诊师考试考纲试题及答案
- 2024年份第3季度跨境卫星服务协议轨道资源使用规范
- 2024年度中医康复理疗师全面试题及答案
- 医院护士培训检查总结分析
- 2025年-上海市安全员知识题库附答案
- 建筑公司项目负责人劳动合同
- 股份制企业运营策略文书集
- 化工行业保安工作计划
- 人教版一年级数学上册《6-10的认识和加减法》同步练习题及答案
- 二十案例示轮回
- 老年营养示范化病房创建方案
- 设备安全操作培训
- 西方文化概论(第二版)课件全套 曹顺庆 第0-6章 绪论 西方文化的渊源与流变、西方文学 -西方社会生活与习俗
- 某地区现代有轨电车施工方案
- GB/T 6974.3-2024起重机术语第3部分:塔式起重机
- DB11T 2103.1-2023 社会单位和重点场所消防安全管理规范 第1部分:通则
- 物业品质巡查管理制度
- 高中物理-《互感与自感》课件-新人教版选修3
评论
0/150
提交评论