针对不同平台特性采用条件编译:
c
运行
// 跨平台对齐解决方案
#ifdef STM32F103xx
// STM32允许非对齐,直接使用8位数组
uint8_t ws2812_buffer[WS2812_BUF_SIZE];
#define WS2812_BUF_ADDR (uint32_t)ws2812_buffer
#elif defined(GD32F130xx)
// GD32需要32位对齐,使用对齐数组
uint32_t ws2812_buffer[(WS2812_BUF_SIZE + 3) / 4];
#define WS2812_BUF_ADDR (uint32_t)ws2812_buffer
#define WS2812_BUF_8BIT ((uint8_t *)ws2812_buffer)
#elif defined(LPC1768)
// LPC系列使用特殊对齐属性
__attribute__((aligned(4))) uint8_t ws2812_buffer[WS2812_BUF_SIZE + 3];
#define WS2812_BUF_ADDR (uint32_t)ws2812_buffer
#endif
// 统一的数据填充接口
void ws2812_set_led(uint32_t index, uint8_t r, uint8_t g, uint8_t b) {
#ifdef GD32F130xx
// 使用8位指针访问32位数组
uint32_t pos = index * 3;
WS2812_BUF_8BIT[pos] = g; // WS2812通常是GRB顺序
WS2812_BUF_8BIT[pos+1] = r;
WS2812_BUF_8BIT[pos+2] = b;
#else
// 其他平台的实现...
#endif
}
优势:针对不同平台优化,兼顾兼容性与效率缺点:增加了代码量,需要维护多平台适配代码
|
|