gpt4 book ai didi

c - 在没有 uint8_t 数据类型的 MCU 上使用 uint8_t 的结构

转载 作者:太空狗 更新时间:2023-10-29 17:25:55 25 4
gpt4 key购买 nike

我是一名嵌入式软件开发人员,我想连接到外部设备。该设备通过 SPI 发送数据。该数据的结构由外部设备制造商预定义,无法编辑。制造商正在提供一些头文件,其中包含通过 SPI 发送的所有数据的许多类型定义。制造商还提供了一个 API 来以正确的方式处理接收到的数据包(我可以访问该 API 的源代码)。

现在解决我的问题:typedefed 结构包含许多 uint8_t 数据类型。不幸的是,我们的 MCU 不支持 uint8_t 数据类型,因为最小的类型是 16 位宽(所以即使是 char 也有 16 位)。

要正确使用 API,结构必须填充通过 SPI 接收的数据。由于传入数据是字节数据包,我们不能只将此数据复制到结构中,因为我们的结构对那些 8 位类型使用 16 位。因此,我们需要进行许多位移位操作才能正确分配接收到的数据。

示例:(制造商 typedef 结构)

typedef struct NETX_COMMUNICATION_CHANNEL_INFOtag
{
uint8_t bChannelType; //uint16_t in our system
uint8_t bChannelId; //uint16_t in our system
uint8_t bSizePositionOfHandshake; //uint16_t in our system
uint8_t bNumberOfBlocks; //uint16_t in our system
uint32_t ulSizeOfChannel;
uint16_t usCommunicationClass;
uint16_t usProtocolClass;
uint16_t usProtocolConformanceClass;
uint8_t abReserved[2]; //uint16_t in our system
} NETX_COMMUNICATION_CHANNEL_INFO;

谁能想出一个简单的解决方法来解决这个问题?我真的不想为每个接收到的数据包类型编写一个单独的移位操作。 (性能/时间/空间浪费)

我的想法(使用位域将 2xuint8_t 填充到 uint16_t 或将 4xuint8_t 填充到 uint32_t)

typedef struct NETX_COMMUNICATION_CHANNEL_INFOtag
{
struct packet_uint8{
uint32_t bChannelType :8;
uint32_t bChannelId :8;
uint32_t bSizePositionOfHandshake :8;
uint32_t bNumberOfBlocks :8;
}packet_uint8;
uint32_t ulSizeOfChannel;
uint16_t usCommunicationClass;
uint16_t usProtocolClass;
uint16_t usProtocolConformanceClass;
uint16_t abReserved;
} NETX_COMMUNICATION_CHANNEL_INFO;

现在我不确定这个解决方案是否可行,因为位域中的位顺序不一定是源文件中的顺序。 (或者如果所有位域都具有相同的大小?)

我希望我对问题的描述足以让您理解。

感谢和问候。

最佳答案

您的编译器手册应该描述位字段的布局方式。仔细阅读。还有一个叫做 __attribute__((byte_peripheral)) 的东西也应该有助于在内存映射设备中合理地打包位域。


如果您不确定位域,只需对这些字段使用uint16_t 和一个带有移位的访问宏,例如

#define FIRST(x) ((x) >> 8)
#define SECOND(x) ((x) & 0xFF)

...
uint16_t channel_type_and_id;
...

int channel_type = FIRST(x->channel_type_and_id);
int channel_id = SECOND(x->channel_type_and_id);

那么您只需要确定平台的字节顺序即可。如果您需要更改 MCU 似乎支持的字节顺序?您可以重新定义这些宏。


位域很可能仍会根据移位来实现,因此不会节省太多 - 如果寄存器有字节访问函数,那么编译器就会知道优化 x & 0xff 使用它们

关于c - 在没有 uint8_t 数据类型的 MCU 上使用 uint8_t 的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53204008/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com