uc/os-iii学习笔记---存储管理(内存管理)

内存管理


我本人觉得内存管理反而是最容易的管理函数。
作为一个RTOS操作系统,内存管理是必备的功能,因此UCOSIII也就内存管理能力。通常应用程序可以调用ANSI C编译器的malloc()和free()函数来动态的分配和释放内存,但是在嵌入式事实操作系统中最好不要这么做,多次这样的操作会把原来很大的一块连续存储区域逐渐地分割成许多非常小并且彼此不相邻的存储区域,这就是存储碎片。
UCOSIII中提供了一种替代malloc()和free()函数的方法,UCOSIII中将存储空间分成区和块,每个存储区有数量不等大小相同的存储块,在一个系统中可以有多个存储区。


一般存储区是固定的,在程序中可以用数组来表示一个存储区,比如u8 buffer[20][10],就表示一个拥有20个存储块,每个存储块10个字节的存储区。
uc/os-iii学习笔记---存储管理(内存管理)_第1张图片


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
};

函数相关:
uc/os-iii学习笔记---存储管理(内存管理)_第2张图片


举个例子:

//定义一个存储区
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);
需要注意的是,申请一次后,必须对应的释放一次,而且必须连续成对,如果申请四次后再释放四次,去查看的话却只能再申请一次。也就是说,申请一次后,下一个执行的内存函数必须是释放。

你可能感兴趣的:(uc/os-iii)