1. 定义内存池相关参数#define MEM_POOL_SIZE 1024 // 内存池总大小(字节)
#define MEM_BLOCK_SIZE 32 // 每个内存块的大小(字节)
#define MEM_BLOCK_NUM (MEM_POOL_SIZE / MEM_BLOCK_SIZE) // 内存块数量
// 静态分配内存池空间(通常用数组实现)
OS_MEM *MemPool; // 内存分区控制块指针
CPU_INT08U MemPoolArea[MEM_POOL_SIZE] __attribute__((aligned(4))); // 内存池空间(按4字节对齐)
2. 创建内存分区
void MyTask(void *p_arg) {
OS_ERR err;
// 创建内存分区
MemPool = OSMemCreate(
(void *)MemPoolArea, // 内存池起始地址
MEM_BLOCK_NUM, // 内存块数量
MEM_BLOCK_SIZE, // 每个内存块的大小
&err // 错误码
);
if (err != OS_ERR_NONE) {
// 处理错误(如内存不足、参数错误等)
}
// ... 其他任务代码 ...
}
3. 分配内存块
void *mem_block;
OS_ERR err;
mem_block = OSMemGet(
MemPool, // 内存分区指针
&err // 错误码
);
if (err == OS_ERR_NONE) {
// 成功获取内存块,可使用mem_block
} else {
// 处理错误(如内存池已空)
}
4. 释放内存块
OS_ERR err;
OSMemPut(
MemPool, // 内存分区指针
mem_block, // 待释放的内存块指针
&err // 错误码
);
if (err != OS_ERR_NONE) {
// 处理错误(如内存块不属于该分区)
}
关键注意事项
内存对齐
内存池地址需按处理器架构对齐(如4字节对齐),避免硬件异常。
分区大小与块数
确保 MEM_POOL_SIZE = MEM_BLOCK_SIZE * MEM_BLOCK_NUM,避免内存浪费或不足。
线程安全
uC/OS-II的内存管理函数本身是线程安全的,但中断服务程序(ISR)中需使用 OSMemGet() 和 OSMemPut() 的中断安全版本(带_ISR后缀)。
错误处理
始终检查 OS_ERR 错误码,避免因内存不足或参数错误导致系统崩溃。
避免内存泄漏
确保每次 OSMemGet() 后都有对应的 OSMemPut()。
|