c-通过指针访问结构中的结构



简要描述:我通过指针向结构中写入了一些内容,但写入了其他内容。我在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_InitRS485_Init中,句柄结构的地址相同,但封装不同,例如GPIO_TypeDef* dir_gpio成员的地址在Escom_Protocol_Init中为0x200000D6,但在RS485_Init中为0x20000 0D9。

相关内容

  • 没有找到相关文章

最新更新