gpt4 book ai didi

c - 为什么优化会无缘无故地改变我的指针地址?

转载 作者:行者123 更新时间:2023-11-30 16:22:24 24 4
gpt4 key购买 nike

我在嵌入式 C 应用程序中遇到优化问题。指针的地址意外更改为 0x0 并破坏了我的代码。

我正在使用 GNU MCU Eclipse ARM 嵌入式 GCC 工具链。我正在使用一个传感器,通过 SPI 与其进行通信。该传感器有 8 个配置寄存器,每个寄存器 16 位。我将配置的本地副本保存在名为“hallsensor_zTleConfig”的结构中我定期读取传感器的存储配置(“zTleSensorConfig”),并将其与本地副本进行比较,以查看是否发生任何内存损坏。

如果没有优化,这个过程就可以工作。

经过优化,在下面的代码中,指向主/本地副本的指针突然变为 0x0,没有明显的原因。

// Master copy of configuration of the TLE chips
static TLE5012B_zCONFIG hallsensor_zTleConfig[ HALLSENSOR_COUNT ];

static void Hallsensor_VerifyConfig( HALLSENSOR_eUNIT eUnit )
{
TLE5012B_zCONFIG zTleSensorConfig;
uint16* pu16MasterConfigPointer = &hallsensor_zTleConfig[ eUnit ];
uint16* pu16SensorConfigPointer = &zTleSensorConfig;
uint8 u8Index;

// Read all configuration parameters
(void)Hallsensor_ReadRegister( TLE5012B_MOD_2, &zTleSensorConfig, sizeof( TLE5012B_zCONFIG ) );

// Copy over configurations modified by Auto-calibration and reserved bits
hallsensor_zTleConfig[ eUnit ].zMod3.u12ANG_BASE = zTleSensorConfig.zMod3.u12ANG_BASE;
hallsensor_zTleConfig[ eUnit ].zSynch.i12AmpSynch = zTleSensorConfig.zSynch.i12AmpSynch;
hallsensor_zTleConfig[ eUnit ].zOffsetX.i12XOffset = zTleSensorConfig.zOffsetX.i12XOffset;
hallsensor_zTleConfig[ eUnit ].zOffsetY.i12YOffset = zTleSensorConfig.zOffsetY.i12YOffset;
hallsensor_zTleConfig[ eUnit ].zMod4.u7TCO_X_T = zTleSensorConfig.zMod4.u7TCO_X_T;
hallsensor_zTleConfig[ eUnit ].zTcoY.u7TCO_Y_T = zTleSensorConfig.zTcoY.u7TCO_Y_T;
hallsensor_zTleConfig[ eUnit ].zMod2.u1Reserved = zTleSensorConfig.zMod2.u1Reserved;
hallsensor_zTleConfig[ eUnit ].zMod4.u1Reserved = zTleSensorConfig.zMod4.u1Reserved;
hallsensor_zTleConfig[ eUnit ].zOffsetX.u4Reserved = zTleSensorConfig.zOffsetX.u4Reserved;
hallsensor_zTleConfig[ eUnit ].zOffsetY.u4Reserved = zTleSensorConfig.zOffsetY.u4Reserved;
hallsensor_zTleConfig[ eUnit ].zSynch.u4Reserved = zTleSensorConfig.zSynch.u4Reserved;

// Compare local Master config setting to sensor settings and look for corrupted data
for ( u8Index = 0; u8Index < TLE5012B_CONFIG_REG_COUNT; u8Index++ )
{
// Configuration invalid?
if ( pu16MasterConfigPointer[u8Index] != pu16SensorConfigPointer[u8Index] )
{
hallsensor_bConfigOk[ eUnit ] = FALSE;
}
}

// Data corrupted?
if ( !hallsensor_bConfigOk[ eUnit ] )
{
// Do stuff
}
}

在函数开始时,pu16MasterConfigPointer 和 pu16SensorConfigPointer 正确保存其相应结构的地址。然而,就在第一个 for 循环之前,pu16MasterConfigPointer 更改为 0x0,并且所有 for 循环条件结果为 TRUE。

我已经尝试了许多不同变量和指针的 volatile 组合,结果仍然以各种其他方式破坏代码(例如,for 循环不会分支 for if 语句查看 asm 代码,导致语句总是转到“hallsensor_bConfigOk” [ eUnit ] = FALSE;")

PS:如果有一个很好的资源可以帮助您了解如何保护代码免受优化问题的影响,我们将非常欢迎。

调试器的屏幕截图显示指针 = 0x0 w/asm 代码

enter image description here

最佳答案

@John Bollinger 说得对,指针违反了我不知道的严格别名规则。这个规则对此有很好的解释post .

用 memcmp 替换 for 循环就可以了。

关于c - 为什么优化会无缘无故地改变我的指针地址?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54451067/

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