数据类型适配与转换
根据传输宽度调整数据类型,利用自然对齐特性:c
运行
// 对于32位DMA传输,使用uint32_t数组并处理剩余字节
#define BUF_SIZE 100
#define ALIGNED_BUF_SIZE ((BUF_SIZE + 3) / 4)// 向上取整
uint32_t aligned_buffer = {0};
uint8_t *data_ptr = (uint8_t *)aligned_buffer;// 8位访问指针
// 填充数据(8位方式)
void fill_buffer(const uint8_t *data, uint32_t len) {
for(uint32_t i = 0; i < len; i++) {
data_ptr = data;
}
}
// 配置DMA传输(32位方式)
void configure_dma() {
uint32_t transfer_words = (BUF_SIZE + 3) / 4;// 总字数
uint32_t remaining_bytes = BUF_SIZE % 4; // 剩余字节数
// 配置DMA传输大部分数据(32位)
if(transfer_words > 0) {
DMA_Config(aligned_buffer, transfer_words - (remaining_bytes ? 0 : 1));
}
// 处理剩余字节(若有)
if(remaining_bytes) {
// 使用8位DMA传输剩余字节
DMA_Config_8bit(&data_ptr, remaining_bytes);
}
}
优势:完全满足对齐要求,适用于混合宽度传输
缺点:需要处理字节序和剩余字节,逻辑较复杂
建议简化剩余字节处理 完全使用 32 位传输,逻辑简单。 适用高性能、严格对齐的 DMA 传输场景。 满足严格对齐要求,提升传输效率。适用于混合宽度传输场景。 建议用填充法简化剩余字节处理。统一字节序,避免解析错误。 数据类型适配与转换是确保程序高效运行和资源合理利用的核心环节。 浮点数运算在嵌入式中通常较慢,且可能没有硬件支持 通过DMA传输大块数据时,使用uint32_t数组并处理剩余字节,确保对齐且减少传输次数 避免因类型不对齐导致内存浪费或访问效率下降。 需按自然边界对齐,否则可能导致访问错误或性能下降8。 通信协议中的字节序与对齐 直接决定了程序的内存占用、运行速度和稳定性。 转换分为隐式转换和显式转换 “转换”指的是将一个数据从一种类型变为另一种类型。这分为隐式转换和显式转换。 合运算时要特别小心,最好统一类型后再进行比较或运算。 通过填充字节或调整数组大小实现对齐 “适配” 是指在开始编码前,根据具体应用场景选择最合适的数据类型。 ***选择能容纳你数据范围的最小类型。 小心整数与浮点数转换,避免精度丢失