简要描述:我通过指针向结构中写入了一些内容,但写入了其他内容。我在Atolic true studio 8.1工作,编程STM32F415RG MCU。
最奇怪的是,即使我在变量和表达式窗口中查看,我也能看到具有不同值的相同结构。两个窗口中的相同变量具有不同值
现在来详细说明一下(我将简化很多内容,使其更可读)。我定义了我的协议句柄类型:
typedef struct
{
RS485DriverHandle master_rs485;
} EscomProtocolHandle;
我的RS485驱动程序句柄定义如下:
typedef struct
{
UART_HandleTypeDef* uart_handle;
TransceiverState transceiver_state;
GPIO_TypeDef* dir_gpio;
uint16_t dir_pin;
} RS485DriverHandle;
我已经将我的协议句柄创建为全局变量:
static EscomProtocolHandle hprot1;
我将它传递给我的协议init函数,该函数将指针作为参数进行处理:
Escom_Protocol_Init(&hprot1);
Init函数将其传递给RS485驱动程序Init函数,该函数将指向RS485句柄的指针作为参数(该调用被简化了很多):
void Escom_Protocol_Init(EscomProtocolHandle* protocol_handle)
{
RS485_Init(&protocol_handle->master_rs485)
}
RS485初始化功能设置默认值:
void RS485_Init(RS485DriverHandle* rs485_handle, UART_HandleTypeDef* uart_handle,
GPIO_TypeDef* dir_gpio, uint16_t dir_pin)
{
/* default = listening */
rs485_handle->uart_handle = uart_handle;
rs485_handle->dir_gpio = dir_gpio;
rs485_handle->dir_pin = dir_pin;
ReceiverOutputEnable(rs485_handle);
rs485_handle->transceiver_state = kReceiving;
}
现在,如果我查看局部变量rs485_handle,则值设置正确。但是,如果我查看我的句柄hprot1,则值不匹配。即使rs485_handle的地址与hprot1句柄的master_rs485成员的地址匹配。附言:我没有打乱上面提到的任何结构的包装(#pragma pack),所以这应该不是问题。
明白了!有一个看似不相关的头文件,其中有一个结构原型,它被打包了(1),在结构原型之后没有#pragma pack()
来将打包恢复到默认状态。因此CCD_ 2在不同的地方被不同的包装。在Escom_Protocol_Init
和RS485_Init
中,句柄结构的地址相同,但封装不同,例如GPIO_TypeDef* dir_gpio
成员的地址在Escom_Protocol_Init
中为0x200000D6,但在RS485_Init
中为0x20000 0D9。