[程序源码] uC/OS-II中内存分区(Memory Partition)实现

[复制链接]
 楼主| forgot 发表于 2025-4-30 11:39 | 显示全部楼层 |阅读模式
1. 定义内存池相关参数
  1. #define MEM_POOL_SIZE     1024  // 内存池总大小(字节)
  2. #define MEM_BLOCK_SIZE    32    // 每个内存块的大小(字节)
  3. #define MEM_BLOCK_NUM     (MEM_POOL_SIZE / MEM_BLOCK_SIZE)  // 内存块数量

  4. // 静态分配内存池空间(通常用数组实现)
  5. OS_MEM  *MemPool;              // 内存分区控制块指针
  6. CPU_INT08U MemPoolArea[MEM_POOL_SIZE] __attribute__((aligned(4))); // 内存池空间(按4字节对齐)

2. 创建内存分区
  1. void MyTask(void *p_arg) {
  2.     OS_ERR err;

  3.     // 创建内存分区
  4.     MemPool = OSMemCreate(
  5.         (void *)MemPoolArea,   // 内存池起始地址
  6.         MEM_BLOCK_NUM,         // 内存块数量
  7.         MEM_BLOCK_SIZE,         // 每个内存块的大小
  8.         &err                   // 错误码
  9.     );

  10.     if (err != OS_ERR_NONE) {
  11.         // 处理错误(如内存不足、参数错误等)
  12.     }

  13.     // ... 其他任务代码 ...
  14. }
3. 分配内存块
  1. void *mem_block;
  2. OS_ERR err;

  3. mem_block = OSMemGet(
  4.     MemPool,       // 内存分区指针
  5.     &err           // 错误码
  6. );

  7. if (err == OS_ERR_NONE) {
  8.     // 成功获取内存块,可使用mem_block
  9. } else {
  10.     // 处理错误(如内存池已空)
  11. }
4. 释放内存块
  1. OS_ERR err;

  2. OSMemPut(
  3.     MemPool,       // 内存分区指针
  4.     mem_block,      // 待释放的内存块指针
  5.     &err            // 错误码
  6. );

  7. if (err != OS_ERR_NONE) {
  8.     // 处理错误(如内存块不属于该分区)
  9. }
关键注意事项
内存对齐
内存池地址需按处理器架构对齐(如4字节对齐),避免硬件异常。
分区大小与块数
确保 MEM_POOL_SIZE = MEM_BLOCK_SIZE * MEM_BLOCK_NUM,避免内存浪费或不足。
线程安全
uC/OS-II的内存管理函数本身是线程安全的,但中断服务程序(ISR)中需使用 OSMemGet() 和 OSMemPut() 的中断安全版本(带_ISR后缀)。
错误处理
始终检查 OS_ERR 错误码,避免因内存不足或参数错误导致系统崩溃。
避免内存泄漏
确保每次 OSMemGet() 后都有对应的 OSMemPut()。


您需要登录后才可以回帖 登录 | 注册

本版积分规则

2064

主题

14491

帖子

59

粉丝
快速回复 在线客服 返回列表 返回顶部