Zephyr OS 入门与实战

第5章 - 内存管理策略

5.1 动态内存分配

k_malloc 与内存分区

Zephyr RTOS 提供了动态内存分配机制,主要通过 k_malloc()k_free() 函数实现。

#include <zephyr/kernel.h>

void *ptr = k_malloc(size); // 分配内存
k_free(ptr); // 释放内存

注意: Zephyr 的内存分配器不是线程安全的,如果多个线程同时调用 k_malloc()k_free(),必须使用互斥锁保护。

Zephyr 支持两种内存分配策略:

系统堆 (System Heap)

默认的内存分配方式,从全局内存池中分配。通过 CONFIG_HEAP_MEM_POOL_SIZE 配置堆大小。

内存分区 (Memory Partitions)

预定义的固定大小内存块集合,适合确定性内存分配需求。

内存分区示例代码:

#define BLOCK_SIZE 64
#define NUM_BLOCKS 4

K_MEM_POOL_DEFINE(my_pool, BLOCK_SIZE, NUM_BLOCKS, 1, 4);

void *block = k_mem_pool_alloc(&my_pool, BLOCK_SIZE, K_NO_WAIT);
if (block != NULL) {
  // 使用内存块
  k_mem_pool_free(block);
}

5.2 堆空间监控与优化

CONFIG_HEAP_MEM_POOL_SIZE 配置

Zephyr 的系统堆大小通过 CONFIG_HEAP_MEM_POOL_SIZE 配置,单位是字节。可以在 prj.conf 文件中设置:

CONFIG_HEAP_MEM_POOL_SIZE=8192
            

警告: 堆大小设置过小可能导致内存分配失败,设置过大会浪费内存资源。需要根据应用需求合理配置。

堆使用情况监控

Zephyr 提供了几种监控堆使用情况的方法:

堆监控示例代码:

#ifdef CONFIG_SYS_HEAP_RUNTIME_STATS
struct sys_memory_stats stats;

sys_heap_runtime_stats_get(&sys_heap, &stats);

printk("Heap: %zu/%zu bytes used\n",
      stats.used, stats.total);
#endif

堆优化策略

优化 Zephyr 堆使用的建议:

  1. 尽可能使用静态内存分配(全局变量或静态变量)
  2. 对于频繁分配/释放的小块内存,考虑使用内存池
  3. 监控堆使用情况,合理设置 CONFIG_HEAP_MEM_POOL_SIZE
  4. 避免内存碎片化,尽量分配相同大小的内存块
  5. 考虑使用内存分区替代系统堆,提高确定性
客服小姐姐(优先添加)

客服小姐姐(优先添加)

客服微信

讲师微信(备用)