ucosii的特点

上传人:cn****1 文档编号:567920583 上传时间:2024-07-22 格式:PPT 页数:59 大小:1.37MB
返回 下载 相关 举报
ucosii的特点_第1页
第1页 / 共59页
ucosii的特点_第2页
第2页 / 共59页
ucosii的特点_第3页
第3页 / 共59页
ucosii的特点_第4页
第4页 / 共59页
ucosii的特点_第5页
第5页 / 共59页
点击查看更多>>
资源描述

《ucosii的特点》由会员分享,可在线阅读,更多相关《ucosii的特点(59页珍藏版)》请在金锄头文库上搜索。

1、提纲1 13 32 24 45 5uCOSII操作系统的特点uCOSII操作系统时间管理uCOSII操作系统任务管理uCOSII操作系统内核结构6 67 7第十章嵌入式操作系统UCOSII的使用uCOSII操作系统移植uCOSII操作系统内存管理uCOSII操作系统任务间的通讯1C/OS-II的特点qUC/OS是一个非常小巧的实时操作系统;整个代码分为内核层以及移植层,这样使得它的植性很方便。q采用抢占式调度策略,保证任务的实时性。q能够管理多达64个任务。q提供了邮箱、消息队列、信号量、内存管理、时间管理等系统服务。C/OS-II的特点2C/OS-II的各种商业应用q全世界有数百种产品在应用

2、:医疗器械移动电话路由器工业控制GPS导航系统智能仪器更多C/OS-II的特点3q为了实现资源共享,一个操作系统必须提供临界为了实现资源共享,一个操作系统必须提供临界段擦作的功能。段擦作的功能。qC/OS-C/OS-为了处理临界段代码需要关中断,处理为了处理临界段代码需要关中断,处理完毕后再开中断。这使得完毕后再开中断。这使得C/OS-C/OS-能够避免同能够避免同时有其它任务或中断服务进入临界段代码。时有其它任务或中断服务进入临界段代码。 qC/OS-C/OS-定义两个宏定义两个宏( (macros)macros)来开关中断。分别来开关中断。分别是是:OS_ENTER_CRITICAL()O

3、S_ENTER_CRITICAL()和和OS_EXIT_CRITICALOS_EXIT_CRITICAL()()。q这这两个宏的定两个宏的定义义取决于所用的微取决于所用的微处处理器,每种微理器,每种微处处理器都有自己的理器都有自己的OS_CPU.HOS_CPU.H文件。文件。 临界段(CriticalSections)C/OS-II的内核结构4任务(task)一个任务通常是一个无限的循环一个任务通常是一个无限的循环: :void void mytaskmytask(void *(void *pdatapdata) ) do initdo init while (1) while (1) do

4、something;do something; waiting;waiting; do something;do something; C/OS-II的内核结构5任务(task)qC/OS-C/OS-可以管理多达可以管理多达6464个任务。个任务。 q保留了优先级为保留了优先级为0 0、1 1、2 2、3 3、OS_LOWEST_PRIO-3OS_LOWEST_PRIO-3、OS_LOWEST_PRI0-2OS_LOWEST_PRI0-2,OS_LOWEST_PRI0-1OS_LOWEST_PRI0-1以及以及OS_LOWEST_PRI0OS_LOWEST_PRI0这这8 8个任务以被将来使用

5、。个任务以被将来使用。 q用户可以有多达用户可以有多达5656个应用任务。必须给每个任务个应用任务。必须给每个任务赋以不同的优先级赋以不同的优先级。优先级号越低,任务的优先优先级号越低,任务的优先级越高。级越高。C/OS-II的内核结构6C/OS中的中断处理qC/OSC/OS中,中断服务子程序要用汇编语言来写。中,中断服务子程序要用汇编语言来写。然而,如果用户使用的然而,如果用户使用的C C语言编译器支持在线汇语言编译器支持在线汇编语言的话,用户可以直接将中断服务子程序代编语言的话,用户可以直接将中断服务子程序代码放在码放在C C语言的程序文件中。语言的程序文件中。q用户中断服务子程序框架用户

6、中断服务子程序框架: : 1.1.保存全部保存全部CPUCPU寄存器寄存器; ; 2.2.调用调用OSIntEnterOSIntEnter或或OSIntNestingOSIntNesting直接加直接加1 1;3.3.执行用户代码做中断服务执行用户代码做中断服务; ; 4.4.调用调用OSIntExitOSIntExit()();5.5.恢复所有恢复所有CPUCPU寄存器;寄存器;6.6.执行中断返回指令;执行中断返回指令;C/OS-II的内核结构7OSIntEnter()voidOSIntEnter(void)OS_ENTER_CRITICAL();OSIntNesting+;OS_EXIT

7、_CRITICAL();C/OS-II的内核结构8OSIntExitOS_ENTER_CRITICAL();if(-OSIntNesting|OSLockNesting)=0)OSIntExitY=OSUnMapTblOSRdyGrp;OSPrioHighRdy=(INT8U)(OSIntExitY3)+OSUnMapTblOSRdyTblOSIntExitY);if(OSPrioHighRdy!=OSPrioCur)OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy;OSCtxSwCtr+;OSIntCtxSw();OS_EXIT_CRITICAL();C/OS-I

8、I的内核结构9中断与时钟节拍q当发生中断时,首先应保护现场当发生中断时,首先应保护现场,将,将CPUCPU寄存器入栈,寄存器入栈,再处理中断函数,然后恢复现场,将再处理中断函数,然后恢复现场,将CPUCPU寄存器出栈,寄存器出栈,最后执行中断返回。最后执行中断返回。quCuC/OS/OS中提供了中提供了OSIntEnterOSIntEnter()()和和OSIntExitOSIntExit()()告诉内核告诉内核进入了中断状态。进入了中断状态。q时钟节拍是一种特殊的中断,操作系统的心脏。对任时钟节拍是一种特殊的中断,操作系统的心脏。对任务列表进行扫描,判断是否有延时任务应该处于准备务列表进行扫

9、描,判断是否有延时任务应该处于准备就绪状态,最后进行上下文切换。就绪状态,最后进行上下文切换。C/OS-II的内核结构10时钟节拍qC/OSC/OS需要用户提供周期性信号源,用于实现时间延时和需要用户提供周期性信号源,用于实现时间延时和确认超时。节拍率应在说确认超时。节拍率应在说1010到到100100HzHz。时钟节拍率越高,时钟节拍率越高,系统的额外负荷就越重。系统的额外负荷就越重。q时钟节拍的实际频率取决于用户应用程序的精度。时钟节时钟节拍的实际频率取决于用户应用程序的精度。时钟节拍源可以是专门的硬件定时器,也可以是来自拍源可以是专门的硬件定时器,也可以是来自50/6050/60HzHz

10、交交流电源的信号。流电源的信号。 q用户必须在多任务系统启动以后再开启时钟节拍器,也就用户必须在多任务系统启动以后再开启时钟节拍器,也就是在调用是在调用OSStartOSStart()()之后。之后。C/OS-II的内核结构11OSTickISRvoidvoid OSTickISR OSTickISR(void)(void) 保存处理器寄存器的值;保存处理器寄存器的值; 调用调用OSIntEnterOSIntEnter()()或是将或是将OSIntNestingOSIntNesting加加1;1; 调用调用OSTimeTickOSTimeTick();(); 调用调用OSIntExitOSIn

11、tExit();(); 恢复处理器寄存器的值恢复处理器寄存器的值; ; 执行中断返回指令执行中断返回指令; ; C/OS-II的内核结构12C/OS-初始化q在调用在调用C/OS-C/OS-的任何其它服务之前,的任何其它服务之前,C/OS-C/OS-要求用要求用户首先调用系统初始化函数户首先调用系统初始化函数OSInitOSInit()()。qOSInitOSInit()()建立空闲任务建立空闲任务idle taskidle task,这个任务总是处于就这个任务总是处于就绪态的。空闲任务绪态的。空闲任务OSTaskIdleOSTaskIdle()()的优先级总是设成最低,的优先级总是设成最低,

12、即即OS_LOWEST_PRIOOS_LOWEST_PRIO。 qC/OS-C/OS-还初始化了还初始化了4 4个空数据结构缓冲区。个空数据结构缓冲区。C/OS-II的内核结构13C/OS-初始化后的一些数据结构内容C/OS-II的内核结构14C/OS-初始化后的缓冲区C/OS-II的内核结构15C/OS-的启动q多任务的启动是用户通过调用多任务的启动是用户通过调用OSStartOSStart()()实现的。实现的。然而,启动然而,启动C/OS-C/OS-之前,用户至少要建立一个之前,用户至少要建立一个应用任务。应用任务。 OSInitOSInit(); /* (); /* 初始化初始化uCu

13、C/OS-II*/OS-II*/ 调用调用OSTaskCreateOSTaskCreate()()或或OSTaskCreateExtOSTaskCreateExt()(); OSStartOSStart(); /*(); /*开始多任务调度开始多任务调度! !永不返回永不返回 * */ /C/OS-II的内核结构16OSStartif (if (OSRunningOSRunning = FALSE) = FALSE) y = y = OSUnMapTbl OSUnMapTbl OSRdyGrpOSRdyGrp; x = x = OSUnMapTbl OSUnMapTbl OSRdyTblOSR

14、dyTbly;y; OSPrioHighRdy OSPrioHighRdy = (INT8U)(y 3) + x); = (INT8U)(y 3;3;OSRdyTblOSRdyTbl prioprio3 |=3 |=OSMapTblOSMapTbl prioprio & 0x07; & 0x07;n假设优先级为假设优先级为12121100b1100bOSRdyGrp OSRdyGrp |=0x02 |=0x02;OSRdyTbl1 |=0x10;OSRdyTbl1 |=0x10;C/OS-II的任务管理27使任务脱离就绪态n将将任任务务就就绪绪表表OSRdyTblOSRdyTbl priopr

15、io33相相应应元元素素的的相相应应位位清清零零,而而且且当当OSRdyTblOSRdyTbl prioprio33中中的的所所有有位位都都为为零零时时,即即全全组组任务中没有一个进入就绪态时,任务中没有一个进入就绪态时,OSRdyGrpOSRdyGrp的相应位才为零。的相应位才为零。if(if(OSRdyTblOSRdyTbl prioprio3&=3&= OSMapTblOSMapTbl prioprio & 0x07)=0); & 0x07)=0);OSRdyGrpOSRdyGrp&=&=OSMapTblOSMapTbl prioprio3;3;C/OS-II的任务管理28任务调度器vo

16、idOSSched(void)INT8Uy;OS_ENTER_CRITICAL();if(OSLockNesting|OSIntNesting)=0)y=OSUnMapTblOSRdyGrp;OSPrioHighRdy=(INT8U)(y3)+OSUnMapTblOSRdyTbly);if(OSPrioHighRdy!=OSPrioCur)OSTCBHighRdy=OSTCBPrioTblOSPrioHighRdy;OSCtxSwCtr+;OS_TASK_SW();OS_EXIT_CRITICAL();C/OS-II的任务管理29任务切换q将被挂起的任务寄存器入栈将被挂起的任务寄存器入栈q将较

17、高优先级任务的寄存器出栈将较高优先级任务的寄存器出栈C/OS-II的任务管理30任务级的任务切换OS_TASK_SW()q通过系统调用指令完成通过系统调用指令完成q保护当前任务的现场保护当前任务的现场q恢复新任务的现场恢复新任务的现场q执行中断返回指令执行中断返回指令q开始执行新的任务开始执行新的任务C/OS-II的任务管理31调用OS_TASK_SW()前的数据结构低优先级任务 OS_TCBOSTCBCur(1)存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)C/OS

18、-II的任务管理32保存当前CPU寄存器的值低优先级任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSW存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdy(3)(2)CPU(4)(5)(1)(3)C/OS-II的任务管理33重新装入要运行的任务低优先级任务 OS_TCBOSTCBCurPSWPCR1R2R3R4存贮器低地址存贮器高地址堆栈方向堆栈方向SPR1R2R3R4PCPSWPSWPCR1R2R3R4存贮器低地址存贮器高地址高优先级任务 OS_TCBOSTCBHighRdyOSTCBCur

19、(1)(2)CPU(4)(4)(1)(3)(3)(4)C/OS-II的任务管理34任务切换OS_TASK_SW()的代码Void Void OSCtxSwOSCtxSw(void)(void) 将将R1,R2,R3R1,R2,R3及及R4R4推入当前堆栈;推入当前堆栈; OSTCBCurOSTCBCurOSTCBStkPtrOSTCBStkPtr = SP; = SP; OSTCBCur OSTCBCur = = OSTCBHighRdyOSTCBHighRdy; ; SP = SP = OSTCBHighRdyOSTCBHighRdy OSTCBSTKPtrOSTCBSTKPtr; ; 将将

20、R4,R3,R2R4,R3,R2及及R1R1从新堆栈中弹出;从新堆栈中弹出; 执行中断返回指令;执行中断返回指令; C/OS-II的任务管理35内存管理q在在ANSI CANSI C中可以用中可以用mallocmalloc()()和和free()free()两个函数动态地分配两个函数动态地分配内存和释放内存。在嵌入式实时操作系统中,容易产生内内存和释放内存。在嵌入式实时操作系统中,容易产生内存碎片。存碎片。 q C/OS-IIC/OS-II中,操作系统把连续的大块内存按分区来管理。中,操作系统把连续的大块内存按分区来管理。每个分区中包含有整数个大小相同的内存块。每个分区中包含有整数个大小相同的

21、内存块。q在一个系统中可以有多个内存分区。这样,用户的应用程在一个系统中可以有多个内存分区。这样,用户的应用程序就可以从不同的内存分区中得到不同大小的内存块。但序就可以从不同的内存分区中得到不同大小的内存块。但是,特定的内存块在释放时必须重新放回它以前所属于的是,特定的内存块在释放时必须重新放回它以前所属于的内存分区。内存分区。C/OS-II的内存管理36内存分区示意图C/OS-II的内存管理37内存控制块q为了便于内存的管理,在为了便于内存的管理,在C/OS-IIC/OS-II中使用内存控制块中使用内存控制块(memory control blocksmemory control block

22、s)的数据结构来跟踪每一个内的数据结构来跟踪每一个内存分区,系统中的每个内存分区都有它自己的内存控制块。存分区,系统中的每个内存分区都有它自己的内存控制块。 typedef structtypedef struct void * void *OSMemAddrOSMemAddr; ; /*/*分区起始地址分区起始地址* */ / void * void *OSMemFreeListOSMemFreeList; ; /*/*下一个空闲内存块下一个空闲内存块* */ / INT32U INT32U OSMemBlkSize OSMemBlkSize; ;/*/*内存块的大小内存块的大小* */ /

23、 INT32U INT32U OSMemNBlks OSMemNBlks; ;/*/*内存块数量内存块数量* */ / INT32U INT32U OSMemNFree OSMemNFree; ;/*/*空闲内存块数量空闲内存块数量 * */ / OS_MEM; OS_MEM;C/OS-II的内存管理38内存管理初始化q如果要在如果要在 C/OS-IIC/OS-II中使用内存管理,需要在中使用内存管理,需要在OS_CFG.HOS_CFG.H文件文件中将开关量中将开关量OS_MEM_ENOS_MEM_EN设置为设置为1 1。这样。这样C/OS-II C/OS-II 在启动时在启动时就会对内存管理

24、器进行初始化就会对内存管理器进行初始化 (OSMemInitOSMemInit() () )。)。C/OS-II的内存管理39建立一个内存分区,OSMemCreate()q在使用一个内存分区之前,必须使用在使用一个内存分区之前,必须使用OSMemCreateOSMemCreate()()先建先建立该内存分区。该函数共有立该内存分区。该函数共有4 4个参数:内存分区的起始地个参数:内存分区的起始地址、分区内的内存块总块数、每个内存块的字节数和一个址、分区内的内存块总块数、每个内存块的字节数和一个指向错误信息代码的指针。指向错误信息代码的指针。 q每个内存分区必须含有至少两个内存块每个内存分区必须

25、含有至少两个内存块,每个内存块至少每个内存块至少为一个指针的大小为一个指针的大小 。OS_MEM *OS_MEM *CommTxBufCommTxBuf; ;INT8UINT8U CommTxPart CommTxPart10032;10032;CommTxBufCommTxBuf = = OSMemCreate OSMemCreate( (CommTxPartCommTxPart, 100, 32, , 100, 32, &err); &err); C/OS-II的内存管理40分配一个内存块,OSMemGet()q调用调用OSMemGetOSMemGet()()函数从已经建立的内存分区中申请

26、一个内函数从已经建立的内存分区中申请一个内存块。该函数的唯一参数是指向特定内存分区的指针,该存块。该函数的唯一参数是指向特定内存分区的指针,该指针在建立内存分区时,由指针在建立内存分区时,由OSMemCreateOSMemCreate()()函数返回。函数返回。 q注意的是,用户可以在中断服务子程序中调用注意的是,用户可以在中断服务子程序中调用OSMemGetOSMemGet()(),因为在暂时没有内存块可用的情况下,因为在暂时没有内存块可用的情况下,OSMemGetOSMemGet()()不会不会等待,而是马上返回等待,而是马上返回NULLNULL指针。指针。 C/OS-II的内存管理41释

27、放一个内存块,OSMemPut()q应用程序不再使用一个内存块时,必须及时地把它释放并应用程序不再使用一个内存块时,必须及时地把它释放并放回到相应的内存分区中。这个操作由放回到相应的内存分区中。这个操作由OSMemPutOSMemPut()()函数完函数完成。成。 q必须注意的是必须注意的是,OSMemPutOSMemPut()()并不知道一个内存块是属于哪并不知道一个内存块是属于哪个内存分区的。个内存分区的。 释放内存块时必须将它释放到正确的分释放内存块时必须将它释放到正确的分区。区。C/OS-II的内存管理42时间管理qC/OS-(其它内核也一样)要求用户提供定时中断来实现延时与超时控制等

28、功能。这个定时中断叫做时钟节拍,它应该每秒发生10至100次。时钟节拍的频率越高,系统的负荷就越重。q与时钟管理相关的系统服务有:OSTimeDLY()OSTimeDLYHMSM()OSTimeDlyResmue()OStimeGet()OSTimeSet()C/OS-II的时间管理43任务间通信手段q C/OSC/OS中,采用多种方法保护任务之间的共享数据和提供中,采用多种方法保护任务之间的共享数据和提供任务之间的通信。任务之间的通信。提供提供OS_ENTER_CRITICALOS_ENTER_CRITICAL和和OS_EXIT_CRITICALOS_EXIT_CRITICAL来对临界来对临

29、界资源进行保护资源进行保护OSSchedLockOSSchedLock( )( )禁止调度保护任务级的共享资源。禁止调度保护任务级的共享资源。提供了经典操作系统任务间通信方法:信号量、邮箱、提供了经典操作系统任务间通信方法:信号量、邮箱、消息队列,事件标志。消息队列,事件标志。 C/OS-II的任务间通讯44事件控制块ECB所有的通信信号都被看成是事件所有的通信信号都被看成是事件(event), (event), 一个称为事件控制一个称为事件控制块块(ECB, Event Control Block)(ECB, Event Control Block)的数据结构来表征每一个具体的数据结构来表征

30、每一个具体事件,事件,ECBECB的结构如下:的结构如下:typedef structtypedef struct void * void *OSEventPtrOSEventPtr; /*; /*指向消息或消息队列的指针指向消息或消息队列的指针* */ / INT8UINT8U OSEventTblOSEventTblOS_EVENT_TBL_SIZE; OS_EVENT_TBL_SIZE; /*/*等等待待任任务务列表列表* */ / INT16UINT16U OSEventCnt OSEventCnt; /*; /*计数器(事件是信号量时)计数器(事件是信号量时)* */ / INT8U

31、INT8U OSEventType OSEventType; /*; /*事件类型:信号量、邮箱等事件类型:信号量、邮箱等* */ / INT8UINT8U OSEventGrp OSEventGrp; /*; /*等待任务组等待任务组* */ / OS_EVENT;OS_EVENT; 与与TCBTCB类似的结构,使用两个链表,空闲链表与使用链表类似的结构,使用两个链表,空闲链表与使用链表C/OS-II的任务间通讯45信号量semaphoreq信号量在多任务系统中用于:控制共享资源的使用权、信号量在多任务系统中用于:控制共享资源的使用权、标志事件的发生、使两个任务的行为同步。标志事件的发生、使

32、两个任务的行为同步。quCuC/OS/OS中信号量由两部分组成:信号量的计数值和等待中信号量由两部分组成:信号量的计数值和等待该信号任务的等待任务表。信号量的计数值可以为二该信号任务的等待任务表。信号量的计数值可以为二进制进制, , 也可以是其他整数。也可以是其他整数。q系统通过系统通过OSSemPendOSSemPend( )( )和和OSSemPostOSSemPost( )( )来支持信号量来支持信号量的两种原子操作的两种原子操作P()P()和和V()V()。P()P()操作减少信号量的值,操作减少信号量的值,如果新的信号量的值不大于如果新的信号量的值不大于0,0,则操作阻塞则操作阻塞;

33、V()V()操作增操作增加信号量的值加信号量的值。 C/OS-II的任务间通讯46总结q不存在一个内核任务不存在一个内核任务/ /实体,内核的管理是通过调用系统实体,内核的管理是通过调用系统函数来实现的。函数来实现的。q每个任务有自己的堆栈空间。内核对任务的占先式调度不每个任务有自己的堆栈空间。内核对任务的占先式调度不会干扰每个任务的总的运行结果。会干扰每个任务的总的运行结果。C/OS-II的任务间通讯47COS-II在ARM7上的移植q所谓移植,是指使一个实时操作系统能够在某个微处理器平台上运行。COS-II的主要代码都是由标准的C语言写成的,移植方便。C/OS-II的移植48移植COS-I

34、I满足的条件 q处理器的C编译器能产生可重入代码q在程序中可以打开或者关闭中断q处理器支持中断,并且能产生定时中断(通常在101000Hz之间)q处理器支承能够容纳一定量数据的硬件堆栈q处理器有将堆栈指针和其他CPU寄存器存储和读出到堆栈(或者内存)的指令C/OS-II的移植49打开/关闭中断 在COS-II中,可以通过:OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()宏来控制系统关闭或者打开中断。这需要处理器的支持。在ARM7TDMI的处理器上,可以设置相应的寄存器来关闭或者打开系统的所有中断。C/OS-II的移植50处理器支持中断并且能产生定时中断 COS-II是

35、通过处理器产生的定时器的中断来实现多任务之间的调度的。ARM7TDMI的处理器上可以产生定时器中断。本系统工作在60MHz的主频下,定时器的中断的频率为100Hz。也就是系统的响应时间为10ms。C/OS-II的移植51处理器支持硬件堆栈 COS-II进行任务调度的时候,会把当前任务的CPU寄存器存放到此任务的堆栈中,然后,再从另一个任务的堆栈中恢复原来的工作寄存器,继续运行另一个任务。所以,寄存器的入栈和出栈是COS-II多任务调度的基础。ARM7处理器中有专门的指令处理堆栈,可以灵活的使用堆栈。C/OS-II的移植52例:C/OS-II在S3C44B0X上的移植 q设置OS_CPU.H中与

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

37、*pdata,void*ptos,INT16Uopt)qvoidOSTaskCreateHook(OS_TCB*ptcb)qvoidOSTaskDelHook(OS_TCB*ptcb)qvoidOSTaskSwHook(void)qvoidOSTaskStatHook(void)qvoidOSTimeTickHook(void)后5个函数为钩子函数,可以不加代码C/OS-II的移植55用汇编语言编写四个与处理器相关的函数 qOSStartHighRdy()qOSCtxSw()qOSIntCtxSw()qOSTickISR()C/OS-II的移植56关于移植相对于其他的嵌入式操作系统,uCOS-

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

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 工作计划

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号