收藏 分享(赏)

实时操作系统uCOS开发与实例.ppt

上传人:精品资料 文档编号:11274503 上传时间:2020-03-08 格式:PPT 页数:98 大小:2.64MB
下载 相关 举报
实时操作系统uCOS开发与实例.ppt_第1页
第1页 / 共98页
实时操作系统uCOS开发与实例.ppt_第2页
第2页 / 共98页
实时操作系统uCOS开发与实例.ppt_第3页
第3页 / 共98页
实时操作系统uCOS开发与实例.ppt_第4页
第4页 / 共98页
实时操作系统uCOS开发与实例.ppt_第5页
第5页 / 共98页
点击查看更多>>
资源描述

1、嵌入式系统设计与实例开发 实时操作系统C/OS-,本节提要,1,3,2,5,4,6,C/OS-简介,C/OS-内核结构,C/OS-任务通信与同步,C/OS-任务管理,C/OS-时间管理,C/OS-移植,RTOS是32位的嵌入式CPU的软件基础,RTOS内核 提供CPU的管理 硬件初时化,MMU,定时器,中断 RTOS 内核提供任务,内存管理 RTOS提供设备管理,文件和网络的支持 RTOS提供C/C+,JAVA,图形模块等编程接口,C/OS简介,1、C/OSMicro Controller O S,微控制器操作系统2、 C/OS简介 美国人Jean Labrosse 1992年完成 应用面覆盖

2、了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等 1998年C/OS-II,目前的版本C/OS -II V2.61 2000年,得到美国航空管理局(FAA)的认证,可以用于飞行器中 网站www.ucos-II.com(),公开源代码 可移植性(Portable)绝大部分 C/OS-II的源码是用移植性很强的ANSI C写的。和微处理器硬件相关的那部分是用汇编语言写的。汇编语言写的部分已经压到最低限度,使得 C/OS-II便于移植到其他微处理器上。 C/OS-II可以在绝大多数8位、16位、32位以至64位微处理器、微控制器 、数字信号处理器(DSP)上运行。

3、 可固化(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的性能特点(一),占先式(Preemptive) 多任务C/OS-II可以管理64个任务,然而,目前这一版本保留8

4、个给系统。应用程序最多可以有56个任务 可确定性 全部 C/OS-II的函数调用与服务的执行时间具有可确定性。 任务栈每个任务有自己单独的栈, C/OS-II允许每个任务有不同的栈空间,以便压低应用程序对RAM的需求。 系统服务C/OS-II提供很多系统服务,例如邮箱、消息队列、信号量、块大小固定的内存的申请与释放、时间相关函数等。 中断管理中断可以使正在执行的任务暂时挂起,如果优先级更高的任务被该中断唤醒,则高优先级的任务在中断嵌套全部退出后立即执行,中断嵌套层数可达255层。 稳定性与可靠性,C/OS的性能特点(二),C/OS-II图书,描述了C/OS-II内部的工作原理 随书的CD中包含

5、了源代码 工业界最清晰的源代码 除英文版外,有中文和韩文版,Chinese,Korean,English,ISBN 1-57820-103-9 美国CMP BOOK,ISBN 7-81077-290-2 北京航空航天大学出版社,ISBN 89-951540-5-5,C/OS-II的各种商业应用,全世界有数百种产品在应用: Avionics Medical Cell phones Routers and switches High-end audio equipment Washing machines and dryers UPS (Uninterruptible Power Supplies

6、) Industrial controllers GPS Navigation Systems Microwave Radios Instrumentation Point-of-sale terminals 更多,C/OS-II提供的系统服务,信号量 带互斥机制的信号量 减少优先级倒置的问题 事件标志 消息信箱 消息队列 内存管理 时钟管理 任务管理,C/GUI and C/FS,C/GUI 嵌入式的用户界面 用ANSI C书写 支持任何8, 16, 32-bits CPU 彩色,灰、度,等级或黑白显示 代码尺寸小C/FS 嵌入式的文件系统Written in ANSI C 用ANSI C书

7、写 支持任何8, 16, 32-bits CPU 支持SMC, MMC, SD, CF, IDE, Flash, RAM其他介质,本节提要,1,3,2,5,4,6,C/OS-简介,C/OS-内核结构,C/OS-任务通信与同步,C/OS-任务管理,C/OS-时间管理,C/OS-移植,C/OS-II的文件结构,内核结构 任务管理 时间管理 任务之间通信与同步 C/OS的移植,C/OS-II的内核结构,任务task,典型的任务一个无限循环。 void mytask(void *pdata) for (;) do something;waiting;do something; C/OS II 2.5版

8、本支持64个任务,每个任务一个特定的优先级。优先级越高,数字越小。 系统占用了8个任务,保留优先级为0、1、2、3、OS_LOWEST_PRIO-3、 OS_LOWEST_PRIO-2、 OS_LOWEST_PRIO-1、 OS_LOWEST_PRIO-0。,任务状态,任务控制块(TCB),任务控制块 OS_TCB是一个数据结构,保存该任务的相关参数,包括任务堆栈指针,状态,优先级,任务表位置,任务链表指针等。所有的任务控制块分为两条链表,空闲链表和使用链表。,空任务列表,所有的任务控制块都被放置在任务控制块列表数组OSTCBTbl中,系统初始化时,所有任务控制块被链接成空任务控制块的单向链表

9、,任务建立后,空任务控制块指针OSTCBFreeList指向的任务控制块就赋给了该任务,然后OSTCBFreeList的值调整为指向链表中的下一个空任务控制块。,任务控制块初始化函数,INT8U OS_TCBInit( INT8U prio, OS_STK *ptos, OS_STK *pbos, INT16U id, INT32U stk_size, void *pext, INT16U opt ) ,任务级的任务调度-OSSched,C/OS是占先式实时多任务内核,优先级最高的任务一旦准备就绪,则拥有CPU的所有权开始投入运行。C/OS中不支持时间片轮转法,每个任务的优先级要求不一样且是唯

10、一的,所以任务调度的工作就是:查找准备就绪的最高优先级的任务并进行上下文切换。C/OS任务调度所花的时间为常数,与应用程序中建立的任务数无关。,根据就绪表确定最高优先级,两个关键: 优先级数分解为高三位和低三位分别确定; 高优先级有着小的优先级号 ;,根据优先级找到任务在就绪任务表中的位置,每个就绪的任务都放入就绪表中(ready list)中,就绪表有两个变量:OSRdyGrp、OSRdyTbl,优先级最低任务,(空闲任务),优先级最高任务,任务优先级号,根据优先级确定就绪表(1),假设优先级为12的任务进入就绪状态,12=1100b,则OSRdyTbl1的第4位置1,且OSRdyGrp的第

11、1位置1,相应的数学表达式为:OSRdyGrp |=0x02;OSRdyTbl1 |=0x10; 而优先级为21的任务就绪21=10 101b,则OSRdyTbl2的第5位置1,且OSRdyGrp的第2位置1,相应的数学表达式为:OSRdyGrp |=0x04;OSRdyTbl2 |=0x20;,根据优先级确定就绪表(2),从上面的计算我们可以得到:若OSRdyGrp及OSRdyBbl的第n位置1,则应该把OSRdyGrp及OSRdyBbl的值与2n 相或。uC/OS中,把2n的n=0-7的8个值先计算好存在数组OSMapTbl7中,也就是:OSMapTbl0 =20=0x01(0000 00

12、01)OSMapTbl1 =21=0x02(0000 0010)OSMapTbl7 =27=0x80(1000 0000),使任务进入就绪态,如果prio是任务是优先级,也是任务的识别号,则将任务放入就绪表,即使任务进入就绪态的方法是: OSRdyGrp |=OSMapTblprio3; OSRdyTblprio3 |=OSMapTblprio ,使任务脱离就绪态,将任务就绪表OSRdyTblprio3相应元素的相应位清零,而且当OSRdyTblprio3中的所有位都为零时,即全组任务中没有一个进入就绪态时,OSRdyGrp的相应位才为零。 If(OSRdyTblprio3,根据就绪表确定最高

13、优先级,通过OSRdyGrp值确定高3位,假设为0x24=100 100b, - 对应OSRdyTbl2 和OSRdyTbl5,高优先级为2 通过OSRdyTbl2的值来确定低3位,假设为0x12=010 010b ,-第2个和第5个任务,取高优先级为2,则最高优先级的任务号为17,源代码中使用了查表法,查表法具有确定的时间,增加了系统的可预测性,uC/OS中所有的系统调用时间都是确定的 High3 =OSUnMapTblOSRdyGrp; Low3 =OSUnMapTblOSRdyTblHigh3; Prio =(Hign33)+Low3;,INT8U const OSUnMapTbl =

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

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

16、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,举例:如OSRdyGrp的值为01101000B,即0X68,则查得OSUnMapTblOSRdyGrp的值是3,它相应于OSRdyGrp中的第3位置1;如OSRdyTbl3的值是11100100B,即0XE4,则查OSUnMapTblOSRdyTbl

17、3的值是2,则进入就绪态的最高任务优先级Prio=3*8+2=26,Task scheduler,给调度器上锁,给调度器开锁,任务切换,将被挂起的任务寄存器入栈 将较高优先级任务的寄存器出栈,任务级的任务切换OS_TASK_SW(),OS_TASK_SW()是宏调用,含有微处理器的软中断指令 OS_TASK_SW()将处理器相关的软件中断机制封装起来,便于操作系统移植,调用OS_TASK_SW()前的数据结构,低优先级任务OS_TCB,OSTCBCur (1),存贮器低地址,存贮器高地址,堆栈方向,SP,R1,R2,R3,R4,PC,PSW,存贮器低地址,存贮器高地址,高优先级任务OS_TCB

18、,OSTCBHighRdy (3),(2),CPU,(4),(5),保存当前CPU寄存器的值,低优先级任务OS_TCB,OSTCBCur,存贮器低地址,存贮器高地址,堆栈方向,SP,R1,R2,R3,R4,PC,PSW,存贮器低地址,存贮器高地址,高优先级任务OS_TCB,OSTCBHighRdy (3),(2),CPU,(4),(5),(1),(3),重新装入要运行的任务,低优先级任务OS_TCB,OSTCBCur,存贮器低地址,存贮器高地址,堆栈方向,SP,R1,R2,R3,R4,PC,PSW,存贮器低地址,存贮器高地址,高优先级任务OS_TCB,OSTCBHighRdy OSTCBCur

19、 (1),(2),CPU,(4),(4),(1),(3),(3),(4),任务切换OS_TASK_SW()的代码,Void OSCtxSw(void) 将R1,R2,R3及R4推入当前堆栈;OSTCBCurOSTCBStkPtr = SP;OSTCBCur = OSTCBHighRdy;SP = OSTCBHighRdy OSTCBSTKPtr;将R4,R3,R2及R1从新堆栈中弹出;执行中断返回指令; ,C/OS-II中的中断,中断:由于某种事件的发生,而导致程序流程的改变。产生中断的事件称为中断源。 CPU响应中断的条件: 至少有一个中断源向CPU发出中断信号; 系统允许中断,且对此中断信

20、号未予屏蔽 中断类型: 硬件中断 外部中断 陷阱中断 现场控制量的中断,C/OS-II中的中断服务子程序,用户中断服务子程序:保存全部CPU寄存器;调用OSIntEnter()或OSIntNesting直接加1;if(OSIntNesting=1)OSTCBCur-OSTCBStkPtr=SP;清中断源;重新开中断;执行用户代码做中断服务;调用OSIntExit();恢复所有CPU寄存器;执行中断返回指令;,uC/OS-II about beginning an ISR,void OSIntEnter(void) OS_ENTER_CRITICAL(); OSIntNesting+; OS_E

21、XIT_CRITICAL(); ,中断与时钟节拍,时钟节拍(时钟滴答)Tick,是一种定时器中断,可通过编程方式实现 时钟节拍是一种特殊的中断,操作系统的心脏。首先32位的整数OSTime加一。对任务列表进行扫描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。,时钟节拍中断服务子程序,Void OSTickISR(void) 保存处理器寄存器的值;调用OSIntEnter(),或是将OSIntNesting加1if(OSIntNesting=1)OSTCBCur-OSTCBStkPtr=SP;调用OSTimeTick();清发出中断设备的中断;重新允许中断(可选用)调用OSInt

22、Exit();恢复处理器寄存器的值;执行中断返回指令; ,时钟节拍函数OSTimTick(),空闲任务OSTaskIdle(),初始化统计任务,C/OS-II初始化,首先调用系统初始化函数OSIint()。OSIint()初始化C/OS-所有的变量和数据结构(见OS_CORE.C)。 OSInit()建立空闲任务idle task,这个任务总是处于就绪态的。空闲任务OSTaskIdle()的优先级总是设成最低,即OS_LOWEST_PRIO。 如果统计任务允许OS_TASK_STAT_EN和任务建立扩展允许都设为1,则OSInit()还得建立统计任务OSTaskStat()并且让其进入就绪态。

23、OSTaskStat的优先级总是设为OS_LOWEST_PRIO-1 空闲和统计任务的任务控制块(OS_TCBs)是用双向链表链接在一起的。OSTCBList指向这个链表的起始处。当建立一个任务时,这个任务总是被放在这个链表的起始处。,调用OSInit()之后的数据结构,空闲缓冲区,C/OS-的启动,启动多任务,关于OSStartHighRdy,OSStartHighRdyLDR r4, addr_OSTCBCur ; Get current task TCB addressLDR r5, addr_OSTCBHighRdy ; Get highest priority task TCB ad

24、dressLDR r5, r5 ; get stack pointerLDR sp, r5 ; switch to the new stackSTR r5, r4 ; set new current task TCB addressLDMFD sp!, r4 ; YYYMSR SPSR_cxsf, r4LDMFD sp!, r4 ; get new state from top of the stackMSR CPSR_cxsf, r4 ; CPSR should be SVC32ModeLDMFD sp!, r0-r12, lr, pc ; start the new task,调用OSSt

25、art()之后的数据结构,本节提要,1,3,2,5,4,6,C/OS-简介,C/OS-内核结构,C/OS-任务通信与同步,C/OS-任务管理,C/OS-时间管理,C/OS-移植,建立任务,Use one of two services OS TaskCreate()OSTaskCreateExt (),建立任务,OSTaskCreate(),堆栈检验,OSTaskStkChk() 删除任务,OSTaskDel() 请求删除任务,OSTaskDelReq() 改变任务的优先级,OSTaskChangePrio() 挂起任务,OSTaskSuspend() 恢复任务,OSTaskResume(),

26、其它相关函数,本节提要,1,3,2,5,4,6,C/OS-简介,C/OS-内核结构,C/OS-任务通信与同步,C/OS-任务管理,C/OS-时间管理,C/OS-移植,时间管理,Five services: OSTimeDLY() OSTimeDLYHMSM() OSTimeDlyResmue() OStimeGet() OSTimeSet(),OSTimeDly( ),延时详解,OSTimeDlyHMSM( ),本节提要,1,3,2,5,4,6,C/OS-简介,C/OS-内核结构,C/OS-任务通信与同步,C/OS-任务管理,C/OS-时间管理,C/OS-移植,任务间通信手段,C/OS中,采用

27、多种方法保护任务之间的共享数据和提供任务之间的通信。提供OS_ENTER_CRITICAL和OS_EXIT_CRITICAL来对临界资源进行保护 OSSchedLock( )禁止调度保护任务级的共享资源。 提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。,事件控制块ECB,程序4.5 ECB的结构如下-typedef struct void *OSEventPtr; /*指向消息或消息队列的指针*/INT8U OSEventTblOS_EVENT_TBL_SIZE; /*等待任务列表*/INT16U OSEventCnt; /*计数器(当事件是信号量时)*/INT8U OS

28、EventType; /*事件类型:信号量、邮箱等*/INT8U OSEventGrp; /*等待任务组*/ OS_EVENT;与TCB类似的结构,使用两个链表,空闲链表与使用链表,所有的通信信号都被看成是事件(event), 一个称为事件控制块(ECB, Event Control Block)的数据结构来表征每一个具体事件,ECB的结构如下,事件的等待任务列表,空闲事件控制块链表,事件控制块TCB的操作,对事件控制块进行的操作包括初始化一个事件控制块OS_EventWaitListInit(); 使一个任务进入就绪态OS_EventTaskRdy(); 使一个任务进入等待某事件的状态OS_

29、EventTaskWait(); 因为等待超时而使一个任务进入就绪态OS_EventTO()。,信号量semaphore,信号量在多任务系统中用于:控制共享资源的使用权、标志事件的发生、使两个任务的行为同步。 uC/OS中信号量由两部分组成:信号量的计数值和等待该信号任务的等待任务表。信号量的计数值可以为二进制, 也可以是其他整数。 系统通过OSSemPend( )和OSSemPost( )来支持信号量的两种原子操作P()和V()。P()操作减少信号量的值,如果新的信号量的值不大于0,则操作阻塞;V()操作增加信号量的值。,任务、中断服务子程序和信号量之间的关系,信号量操作,C/OS-II提供

30、了5个对信号量进行操作的函数。它们是: OSSemCreate() OSSemPend() OSSemPost() OSSemAccept() OSSemQuery()函数。,邮 箱,邮箱是C/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。该指针指向一个包含了特定“消息”的数据结构。为了在C/OS-II中使用邮箱,必须将OS_CFG.H中的OS_MBOX_EN常数置为1。 使用邮箱之前,必须先建立该邮箱。该操作可以通过调用OSMboxCreate()函数来完成,并且要指定指针的初始值。 C/OS-II提供了5种对邮箱的操作:OSMboxCrea

31、te(),OSMboxPend(),OSMboxPost(),OSMboxAccept()和OSMboxQuery()函数,任务、中断服务子程序和邮箱之间的关系,消息队列,消息队列是C/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送以指针方式定义的变量。因具体的应用有所不同,每个指针指向的数据结构变量也有所不同。为了使用C/OS-II的消息队列功能,需要在OS_CFG.H 文件中,将OS_Q_EN常数设置为1,并且通过常数OS_MAX_QS来决定C/OS-II支持的最多消息队列数。 在使用一个消息队列之前,必须先建立该消息队列。这可以通过调用OSQCreate(

32、)函数,并定义消息队列中的单元数(消息数)来完成。 C/OS-II提供了7个对消息队列进行操作的函数:OSQCreate(),OSQPend(),OSQPost(),OSQPostFront(),OSQAccept(),OSQFlush()和OSQQuery()函数,任务、中断服务子程序和消息队列之间的关系,操作系统的启动和运行过程,总结,不存在一个内核任务/实体,内核的管理是通过调用系统函数来实现的。 每个任务有自己的堆栈空间。内核对任务的占先式调度不会干扰每个任务的总的运行结果。,本节提要,1,3,2,5,4,6,C/OS-简介,C/OS-内核结构,C/OS-任务通信与同步,C/OS-任务

33、管理,C/OS-时间管理,C/OS-移植,COS-II在ARM7上的移植,所谓移植,是指使一个实时操作系统能够在某个微处理器平台上运行。COS-II的主要代码都是由标准的C语言写成的,移植方便。,移植COS-II满足的条件,处理器的C编译器能产生可重入代码 在程序中可以打开或者关闭中断 处理器支持中断,并且能产生定时中断(通常在101000Hz之间) 处理器支持能够容纳一定量数据的硬件堆栈 处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈(或者内存)的指令,打开/关闭中断,在COS-II中,可以通过: OS_ENTER_CRITICAL () OS_EXIT_CRITICAL() 宏来控制

34、系统关闭或者打开中断。这需要处理器的支持。 在ARM7TDMI的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。,处理器支持中断并且能产生定时中断,COS-II是通过处理器产生的定时器的中断来实现多任务之间的调度的。ARM7TDMI的处理器上可以产生定时器中断。,处理器支持硬件堆栈,COS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是COS-II多任务调度的基础。 ARM7处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。,例:C/OS-II在S3C44B0X

35、上的移植,设置OS_CPU.H中与处理器和编译器相关的代码 用C语言编写六个操作系统相关的函数(OS_CPU_C.C) 用汇编语言编写四个与处理器相关的函数(OS_CPU.ASM),设置与处理器和编译器相关的代码,OS_CPU.H中定义了与编译器相关的数据类型。比如:INT8U、INT8S等。 与 ARM处理器相关的代码,使用OS_ENTER_CRITICAL() 和OS_EXIT_CRITICAL() 宏开启关闭中断 设置堆栈的增长方向 :堆栈由高地址向低地址增长,用C语言编写六个操作系统相关的函数,void *OSTaskStkInit (void (*task)(void *pd),vo

36、id *pdata, void *ptos, INT16U opt) void OSTaskCreateHook (OS_TCB *ptcb) void OSTaskDelHook (OS_TCB *ptcb) void OSTaskSwHook (void) void OSTaskStatHook (void) void OSTimeTickHook (void) 后5个函数为接口函数,可以不加代码,堆栈初始化,用汇编语言编写四个 与处理器相关的函数,OSStartHighRdy() OSCtxSw() OSIntCtxSw() OSTickISR(),关于移植,相对于其他的嵌入式操作系统,

37、uCOS-II的移植虽然是一个很简单的过程,但是,对于不熟悉uCOS-II的开发者,移植还是有一定难度的。,移植要点,定义函数OS_ENTER_CRITICAL和OS_ENTER_CRITICAL。 定义函数OS_TASK_SW执行任务切换。 定义函数OSCtxSw实现用户级上下文切换,用纯汇编实现。 定义函数OSIntCtxSw实现中断级任务切换,用纯汇编实现。 定义函数OSTickISR。 定义OSTaskStkInit来初始化任务的堆栈。,uC/OS的完善,固定的基于优先级的调度,不支持时间片,使用起来不方便。一个任务的基础上增加一个基于时间片的微型调度核 系统时钟中断,没有提供用户使用定时器,可以借鉴linux的定时器加以修改 在对临界资源的访问上使用关闭中断实现,没有使用CPU提供的硬件指令,例如测试并置位。 只是一个实时多任务内核,没有图形用户接口(GUI)、文件系统(FS)和TCP/IP协议栈,谢谢,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报