forgot 发表于 2025-4-30 11:39

uC/OS-II中内存分区(Memory Partition)实现

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


页: [1]
查看完整版本: uC/OS-II中内存分区(Memory Partition)实现