ucosii的特点.ppt
文本预览下载声明
* 任务切换 将被挂起的任务寄存器入栈 将较高优先级任务的寄存器出栈 ?C/OS-II的任务管理 * 任务级的任务切换OS_TASK_SW() 通过系统调用指令完成 保护当前任务的现场 恢复新任务的现场 执行中断返回指令 开始执行新的任务 ?C/OS-II的任务管理 * 调用OS_TASK_SW()前的数据结构 低优先级任务 OS_TCB OSTCBCur (1) 存贮器低地址 存贮器高地址 堆栈方向 SP R1 R2 R3 R4 PC PSW 存贮器低地址 存贮器高地址 高优先级任务 OS_TCB OSTCBHighRdy (3) (2) CPU (4) (5) ?C/OS-II的任务管理 * 保存当前CPU寄存器的值 低优先级任务 OS_TCB OSTCBCur PSW PC R1 R2 R3 R4 存贮器低地址 存贮器高地址 堆栈方向 SP R1 R2 R3 R4 PC PSW 存贮器低地址 存贮器高地址 高优先级任务 OS_TCB OSTCBHighRdy (3) (2) CPU (4) (5) (1) (3) ?C/OS-II的任务管理 * 重新装入要运行的任务 低优先级任务 OS_TCB OSTCBCur PSW PC R1 R2 R3 R4 存贮器低地址 存贮器高地址 堆栈方向 SP R1 R2 R3 R4 PC PSW PSW PC R1 R2 R3 R4 存贮器低地址 存贮器高地址 高优先级任务 OS_TCB OSTCBHighRdy OSTCBCur (1) (2) CPU (4) (4) (1) (3) (3) (4) ?C/OS-II的任务管理 * 任务切换OS_TASK_SW()的代码 Void OSCtxSw(void) { 将R1,R2,R3及R4推入当前堆栈; OSTCBCur?OSTCBStkPtr = SP; OSTCBCur = OSTCBHighRdy; SP = OSTCBHighRdy ?OSTCBSTKPtr; 将R4,R3,R2及R1从新堆栈中弹出; 执行中断返回指令; } ?C/OS-II的任务管理 * 内存管理 在ANSI C中可以用malloc()和free()两个函数动态地分配内存和释放内存。在嵌入式实时操作系统中,容易产生内存碎片。 μC/OS-II中,操作系统把连续的大块内存按分区来管理。每个分区中包含有整数个大小相同的内存块。 在一个系统中可以有多个内存分区。这样,用户的应用程序就可以从不同的内存分区中得到不同大小的内存块。但是,特定的内存块在释放时必须重新放回它以前所属于的内存分区。 ?C/OS-II的内存管理 * 内存分区示意图 ?C/OS-II的内存管理 * 内存控制块 为了便于内存的管理,在μC/OS-II中使用内存控制块(memory control blocks)的数据结构来跟踪每一个内存分区,系统中的每个内存分区都有它自己的内存控制块。 typedef struct { void *OSMemAddr; /*分区起始地址*/ void *OSMemFreeList; /*下一个空闲内存块*/ INT32U OSMemBlkSize; /*内存块的大小*/ INT32U OSMemNBlks; /*内存块数量*/ INT32U OSMemNFree; /*空闲内存块数量 */ } OS_MEM; ?C/OS-II的内存管理 * 内存管理初始化 如果要在μC/OS-II中使用内存管理,需要在OS_CFG.H文件中将开关量OS_MEM_EN设置为1。这样μC/OS-II 在启动时就会对内存管理器进行初始化 (OSMemInit() )。 ?C/OS-II的内存管理 * 建立一个内存分区,OSMemCreate() 在使用一个内存分区之前,必须使用OSMemCreate()先建立该内存分区。该函数共有4个参数:内存分区的起始地址、分区内的内存块总块数、每个内存块的字节数和一个指向错误信息代码的指针。 每个内存分区必须含有至少两个内存块,每个内存块至少为一个指针的大小 。 OS_MEM *CommTxBuf; INT8U CommTxPart[100][32]; CommTxBuf = OSMemCreate(CommTxPart, 100, 32, err); ?C/OS-II的内存管理 * 分配一个内存块,OSMemGet() 调用OSMemGet()函数从已经建立的内存分区中申请一个内存块。该函数的唯一参数是指向特定内存分区的指针,该指针在建立内存分区时,由OSMemCreate()函数返回。 注意的
显示全部