打印
[程序源码]

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

[复制链接]
22|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
forgot|  楼主 | 2025-4-30 11:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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()。


使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1924

主题

13923

帖子

58

粉丝