内存碎片化(Memory Fragmentation)
在 HRTOS 中,动态内存分配与释放在不规则模式下会破坏连续内存结构, 导致“可用总量足够,但无法分配”的现象。
机制定义
Fragmentation = Free Blocks Discontinuity + Allocation Pattern Disorder
分为:外部碎片(External)与内部碎片(Internal)
碎片产生机制
1. 不同大小任务申请内存
2. 释放顺序与申请顺序不一致
3. 内存被切割为多个不连续块
4. 大块连续内存无法满足请求
演示代码
#include "hrtos.h"
#define HEAP_SIZE 32
static u8 heap[HEAP_SIZE];
/* 简化版分配标记 */
u8 alloc(u8 size)
{
u8 i, start;
for(i = 0; i < HEAP_SIZE - size; i++)
{
u8 j, ok = 1;
for(j = 0; j < size; j++)
{
if(heap[i + j])
{
ok = 0;
break;
}
}
if(ok)
{
for(j = 0; j < size; j++)
heap[i + j] = 1;
return i;
}
}
return 0xFF;
}
void free_block(u8 start, u8 size)
{
u8 i;
for(i = 0; i < size; i++)
heap[start + i] = 0;
}
/* 碎片生成任务 */
void task_fragment_demo(void)
{
u8 a, b, c;
while(1)
{
a = alloc(8);
b = alloc(6);
c = alloc(10);
free_block(a, 8);
free_block(c, 10);
/* 此时中间产生碎片 */
alloc(12); // 可能失败(典型碎片问题)
os_delay(10);
}
}
void hrtos_main(void)
{
u8 i;
for(i = 0; i < HEAP_SIZE; i++)
heap[i] = 0;
os_task_create((unsigned int)task_fragment_demo, 1, 4, 5);
}
碎片类型
外部碎片
空闲空间被切割为不连续小块。
内部碎片
分配块大于实际需求造成浪费。
系统意义
碎片问题直接影响 RTOS 长期运行稳定性,
在嵌入式系统中通常通过 slab / pool / static allocation 规避。