内存管理
我本人觉得内存管理反而是最容易的管理函数。
作为一个RTOS操作系统,内存管理是必备的功能,因此UCOSIII也就内存管理能力。通常应用程序可以调用ANSI C编译器的malloc()和free()函数来动态的分配和释放内存,但是在嵌入式事实操作系统中最好不要这么做,多次这样的操作会把原来很大的一块连续存储区域逐渐地分割成许多非常小并且彼此不相邻的存储区域,这就是存储碎片。
UCOSIII中提供了一种替代malloc()和free()函数的方法,UCOSIII中将存储空间分成区和块,每个存储区有数量不等大小相同的存储块,在一个系统中可以有多个存储区。
一般存储区是固定的,在程序中可以用数组来表示一个存储区,比如u8 buffer[20][10],就表示一个拥有20个存储块,每个存储块10个字节的存储区。
UCOSIII中用存储控制块来表示存储区,存储控制块为OS_MEM。
struct os_mem {
OS_OBJ_TYPE Type;
void *AddrPtr;
CPU_CHAR *NamePtr;
void *FreeListPtr;
OS_MEM_SIZE BlkSize;
OS_MEM_QTY NbrMax;
OS_MEM_QTY NbrFree;
#if OS_CFG_DBG_EN > 0u
OS_MEM *DbgPrevPtr;
OS_MEM *DbgNextPtr;
#endif
};
函数相关:
举个例子:
//定义一个存储区
OS_MEM INTERNAL_MEM;
//存储区中存储块数量
#define INTERNAL_MEM_NUM 5
//每个存储块大小
#define INTERNAL_MEMBLOCK_SIZE 100
//内存池使用内部RAM
CPU_INT08U Internal_RamMemp[INTERNAL_MEM_NUM][INTERNAL_MEMBLOCK_SIZE];
OSMemCreate((OS_MEM* )&INTERNAL_MEM,//需要在代码最前面定义,指向存储区
(CPU_CHAR* )"Internal Mem",//存储区名字
(void* )&Internal_RamMemp[0][0],//存储区基地址
(OS_MEM_QTY )INTERNAL_MEM_NUM,//有多少个存储块可用,建议宏定义
(OS_MEM_SIZE)INTERNAL_MEMBLOCK_SIZE,//每个存储块大小,建议宏定义
(OS_ERR* )&err);
//申请存储块
OSMemGet((OS_MEM*)&INTERNAL_MEM,
(OS_ERR*)&err);
//释放存储块
OSMemPut((OS_MEM* )&INTERNAL_MEM,
(void* )internal_buf,
(OS_ERR* )&err);