ucos-ii的使用内容摘要:

OS_TASK_SW()。 } } OS_EXIT_CRITICAL()。 } C/OSII的任务管理 23 任务切换 (Task switching) 将被挂起的任务寄存器入栈 将最高优先级任务的寄存器出栈 C/OSII的任务管理 24 任务级的任务切换 OS_TASK_SW() •通过系统调用指令完成 •保护当前任务的现场 •恢复新任务的现场 •执行中断返回指令 •开始执行新的任务 C/OSII的任务管理 25 任务切换 OS_TASK_SW()的代码 Void OSCtxSw(void) { 将 R1,R2,R3及 R4推入当前堆栈; OSTCBCurOSTCBStkPtr = SP。 OSTCBCur = OSTCBHighRdy。 SP = OSTCBHighRdy OSTCBSTKPtr。 将 R4,R3,R2及 R1从新堆栈中弹出; 执行中断返回指令; } C/OSII的任务管理 26 内存管理 在 ANSI C中可以用 malloc()和 free()两个函数动态地分配内存和释放内存。 在嵌入式实时操作系统中,容易产生内存碎片。 181。 C/OSII中,操作系统把连续的大块内存按分区来管理。 每个分区中包含有整数个大小相同的内存块。 在一个系统中可以有多个内存分区。 这样,用户的应用程序就可以从不同的内存分区中得到不同大小的内存块。 但是,特定的内存块在释放时必须重新放回它以前所属于的内存分区。 C/OSII的内存管理 27 内存分区示意图 C/OSII的内存管理 28 内存控制块 为了便于内存的管理,在 181。 C/OSII中使用内存控制块( memory control blocks)的数据结构来跟踪每一个内存分区,系统中的每个内存分区都有它自己的内存控制块。 typedef struct { void *OSMemAddr。 /*分区起始地址 */ void *OSMemFreeList。 /*下一个空闲内存块 */ INT32U OSMemBlkSize。 /*内存块的大小 */ INT32U OSMemNBlks。 /*内存块数量 */ INT32U OSMemNFree。 /*空闲内存块数量 */ } OS_MEM。 C/OSII的内存管理 29 内存管理初始化 如果要在 181。 C/OSII中使用内存管理,需要在 OS_MEM_EN设置为 1。 这样 181。 C/OSII 在启动时就会对内存管理器进行初始化 ( OSMemInit() )。 C/OSII的内存管理 30 建立一个内存分区, OSMemCreate() 在使用一个内存分区之前,必须使用 OSMemCreate()先建立该内存分区。 该函数共有 4个参数:内存分区的起始地址、分区内的内存块总块数、每个内存块的字节数和一个指向错误信息代码的指针。 每个内存分区必须含有至少两个内存块,每个内存块至少为一个指针的大小。 OS_MEM *CommTxBuf。 INT8U CommTxPart[100][32]。 CommTxBuf = OSMemCreate(CommTxPart, 100, 32, amp。 err)。 C/OSII的内存管理 31 分配一个内存块, OSMemGet() 调用 OSMemGet()函数从已经建立的内存分区中申请一个内存块。 该函数的唯一参数是指向特定内存分区的指针,该指针在建立内存分区时,由OSMemCreate()函数返回。 注意的是,用户可以在中断服务子程序中调用OSMemGet(),因为在暂时没有内存块可用的情况下, OSMemGet()不会等待,而是马上返回 NULL指针。 C/OSII的内存管理 32 释放一个内存块, OSMemPut() 应用程序不再使用一个内存块时,必须及时地把它释放并放回到相应的内存分区中。 这个操作由OSMemPut()函数完成。 必须注意的是, OSMemPut()并不知道一个内存块是属于哪个内存分区的。 释放内存块时必须将它释放到正确的分区。 C/OSII的内存管理 33 时间管理 181。 C/OSⅡ( 其它内核也一样 )要求用户提供定时中断来实现延时与超时控制等功能。 这个定时中断叫做时钟节拍,它应该每秒发生 10至 100次。 时钟节拍的频率越高,系统的负荷就越重。 与时钟管理相关的系统服务有:  OSTimeDLY(INT16U ticks )  OSTimeDLYHMSM(INT8U hours, INT8U minutes, INT8U seconds, INT16U milli )  OSTimeDlyResmue(INT8U prio )  OStimeGet(void)  OSTimeSet(INT32U ticks ) 不可以延时另一个任务 如果一个任务处理结果中,要求另一个任务延迟一段时间,怎么实现。 C/OSII的时间管理 34 任务间交互方法 C/OS中,采用多种方法保护任务之间的共享数据和提供任务之间的通信。 数据共享  提供 OS_ENTER_CRITICAL和 OS_EXIT_CRITICAL来对临界资源进行保护  OSSchedLock( )禁止调度保护任务级的共享资源。 任务间通讯  提供了经典操作系统任务间通信方法:信号量。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。