内存碎片(Fragmentation)

HRTOS采用基于Bitmap的连续块分配机制,通过固定粒度扫描与连续区间申请实现内存管理。 碎片问题主要来源于连续空间切割与栈增长不均衡。

Bitmap Allocation Model

① 分配模型概述

HRTOS内存管理以OS_MEMORY位图为核心,每一位表示一个最小分配单元。 分配过程本质是“连续bit段查找”。

单位粒度:2 bytes 映射区域:OS_USER_RAM_INIT → OS_USER_RAM_EXIT OS_MEMORY[x] bit = 1 → 已占用 OS_MEMORY[x] bit = 0 → 空闲
该模型天然避免指针碎片,但仍可能产生“连续区不足”的外部碎片问题。

② 连续块分配过程(来自 os_task_create)

任务创建时,通过扫描bitmap寻找连续空闲块:

for(i=0; i= sd){ allocate(); } }
sd = stack深度(实际 +1)
k = 连续空闲块计数
找到连续区域后一次性标记占用

该机制决定:内存不是“随机碎片”,而是“连续段碎片(contiguous fragmentation)”。

③ 栈空间增长与碎片来源

i = OS_USER_RAM_INIT + (index * 2) + 1 SP = i OS_INSIDE_STACK_USE_MAXIMUM = i + sd * 2
栈空间按任务创建顺序连续分配,不回收重排。 长期运行后会形成“尾部空洞”。

这类碎片属于外部碎片,但特点是:
- 不来自malloc/free
- 来自任务生命周期分布不均
- 不可自动压缩

④ 碎片形成机制

HRTOS中的碎片主要来源:

1. bitmap连续段被切割 2. task创建/删除不对称 3. stack区域单向增长 4. 高速任务与普通任务混合分配
特点:碎片不可“随机恢复”,只能通过重启或重建内存池消除。

⑤ 优化策略

策略1:固定任务上限(OS_PROCESS_MAX) 策略2:预分配栈深度(sd上限控制) 策略3:高速任务独立区 策略4:启动阶段集中创建任务
HRTOS核心思想:用“确定性分配”替代“动态整理”。

⑥ 关键结论

Bitmap模型不会产生传统malloc碎片
但会产生“连续空间碎片”
系统稳定性取决于任务创建顺序设计
长期运行必须依赖静态规划