通过添加填充字节确保缓冲区起始地址满足对齐要求:
c
运行
// 动态计算填充字节数
#define ALIGNMENT 4 // 32位对齐要求
uint8_t padding = 0;
uint8_t *ws2812_buffer;
// 分配缓冲区时计算所需填充
void init_ws2812_buffer() {
// 先分配足够的内存(原始大小 + 可能的填充)
uint8_t *temp = malloc(WS2812_BUF_SIZE + ALIGNMENT);
// 计算需要填充的字节数
padding = (ALIGNMENT - ((uint32_t)temp % ALIGNMENT)) % ALIGNMENT;
// 调整缓冲区地址至对齐位置
ws2812_buffer = temp + padding;
}
// 使用完毕释放内存(需释放原始地址)
void deinit_ws2812_buffer() {
if(ws2812_buffer) {
free(ws2812_buffer - padding);
ws2812_buffer = NULL;
}
}
内存利用率高,适用于动态分配场景缺点:需要额外管理填充字节,增加代码复杂度
|
|