【发布时间】:2014-07-23 19:54:13
【问题描述】:
我在 PC(mingw32、32 位架构)上模拟来自嵌入式系统(stm32、Keil µVision 5、MDK-ARM)的代码。 ARM 编译器的对齐方式与我的桌面 mingw build 不匹配:
// ARM Code (ARM compiler uses __packed)
typedef __packed struct _file
{
uint8_t var1;
uint16_t var2;
} FILE;
// PC mingw gcc code trying to emulate layout above.
typedef struct __attribute__((packed, aligned(1))) _file
{
uint8_t var1;
uint16_t var2;
} FILE;
在源代码中,我执行以下操作:file.var1 = 0x22; file.var2 = 0xAA55; 然后将其写入内存。当我在嵌入式系统上读取内存时,它显示0x22, 0x55, 0xAA。在 Windows 机器上,它读取 0x22, 0xFF, 0x55, 0xAA,在第 2nd 字节处有填充。我该如何纠正这种行为?
【问题讨论】:
-
OT:我建议使用与
FILE不同的名称,该名称由标准库定义,并且您在 Windows 环境中包含的任何标准头文件也可能包含stdio.h,即使嵌入式环境没有它 -
哈哈是的,你是对的,但这不是我实际使用的代码。为了演示这种行为,我更改了名称并将其删减。
-
你误解了,误用语言是问题所在。实现定义的功能就是这样。没有理由期望他们在某一天/版本之外以这种方式工作......