为什么拆分高低字节而不直接存入数组

[复制链接]
发表于 2025-9-16 20:43:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您的代码片断是在将一个16位值()拆分为高字节和低字节:IR_RF_Signal.length
  1. temp_low = IR_RF_Signal.length & 0xFF;  
  2. temp_high = IR_RF_Signal.length >> 8;  
复制代码
固然我在 PX4-Autopilot 仓库中没有找到这段确切的代码,但这是嵌入式体系中的常见做法,特殊是在处置处罚通讯协议时。这么做的原因主要有以下几点:
1. 通讯协议的数据包格式

在大多数低级通讯协议中(如UART、SPI、I2C等),数据是按字节一个一个传输的。当需要传输一个多字节的值(如16位的长度值)时,必须将其拆分成单个字节举行传输。拆分成高低字节是标准做法。
2. 字节序(Endianness)思量

差别的体系大概利用差别的字节序(大端序或小端序)。通过明白地将值拆分为高字节和低字节,可以确保通讯两边以雷同的方式表明数据,制止字节序差别导致的问题。
3. 内存服从

在资源受限的嵌入式体系中,明白控制每个字节如何存储和传输可以进步内存和带宽服从。
4. 协议兼容性

许多通讯协议有特定的数据包格式要求,必须按照固定的格式构造数据包。拆分高低字节是遵照这些格式要求的一种方式。
为什么不直接用数组?

您问为什么不能直接将值存入数组。技术上来说,可以如许做:
  1. uint8_t length_bytes[2];  
  2. length_bytes[0] = IR_RF_Signal.length & 0xFF;  // 低字节  
  3. length_bytes[1] = IR_RF_Signal.length >> 8;    // 高字节  
复制代码
大概利用连合体(union)或布局体指针转换。但是,明白地拆分为独立变量有几个上风:

  • 代码可读性更高,明白体现这是长度值的高字节和低字节
  • 制止大概的内存对齐问题
  • 在某些环境下大概需要单独处置处罚这些字节,如添加到差别的数据包位置
留意事项

这种拆分方式实际上是在实现小端序(little-endian)的字节序,即低字节在前,高字节在后。假如吸取方盼望大端序(big-endian),则应该调解存储次序。

为什么需要将IR_RF_Signal.length拆分成高低字节

在嵌入式体系中,经常需要将多字节数据拆分成单字节举行存储或传输,这段代码就是如许的一个例子。
原因是是一个16位的无符号整数(),而是一个8位字节()的数组:IR_RF_Signal.length uint16_tW25Q64_Bufferuint8_t
  1. <strong>volatile</strong> <strong>uint8_t</strong> W25Q64_Buffer[4096] = {0};
复制代码
在函数中,需要将16位的值存储到这个8位的缓冲区中:Module_IR_RF_Copy_To_Bufferlength
  1. temp_low = IR_RF_Signal.length & 0xFF; temp_high = IR_RF_Signal.length >> 8; W25Q64_Buffer[0] = temp_low; W25Q64_Buffer[1] = temp_high;
复制代码
如许做的原因是:

  • W25Q64闪存芯片的接口是基于字节操纵的,每次只能读写8位数据
  • 必须将16位的值分解成两个8位字节才气存储length
  • 利用获取低8位,利用获取高8位& 0xFF>> 8
同样地,步调也对数组中的每个16位值举行了类似的拆分:duration
  1. for (i = 0; i < IR_RF_Signal.length; i++) {  
  2.     temp_low = IR_RF_Signal.duration[i] & 0xFF;  
  3.     temp_high = IR_RF_Signal.duration[i] >> 8;  
  4.     W25Q64_Buffer[i * 2 + 2] = temp_low;  
  5.     W25Q64_Buffer[i * 2 + 3] = temp_high;  
  6. }
复制代码
反过来,当从闪存读取数据时,也需要将两个字节重新组合成一个16位值:
  1. temp_low = W25Q64_Buffer[0];  
  2. temp_high = W25Q64_Buffer[1];  
  3. IR_RF_Signal.length = (temp_high << 8) | temp_low;
复制代码
这种拆分和重组16位值的方法在嵌入式体系和通讯协议中非常常见,特殊是在处置处罚跨字节界限的多字节数据时。
留意

假如想直接存储在数组中而不拆分,那么需要利用uint16_t范例的缓冲区,但W25Q64闪存的接口是基于字节(8位)作的,以是终极在与硬件交互时仍旧需要举行字节拆分。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表