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()。
|