器件型号: MSP430F1232
GNU ld (Mitto Systems Limited - MSP430-gcc 9.3.1.11) 2.34 编译器似乎会生成不正确的汇编代码、这些代码会sluft_value_在某些条件分支中写入成员变量的错误内存地址。
我得到了这个简化的 IF 结构。 这将产生与实际实现相同的结果。
uint8_t AppVtux_Slave::dummyID() {
static uint32_t counter = 0;
uint8_t values[] = {0x03, 0x05};
uint8_t index = counter % 2;
counter++;
return values[index];
}
#pragma GCC push_options
#pragma GCC optimize("O0")
void AppVtux_Slave::SLuftDetection() {
valve_flash_.iot_cs_number_ = 1;
uint16_t tmp_ven_id = dummyID();
sluft_connected_ = 3;
if (tmp_ven_id == 5) {
sluft_connected_ = 1;
sluft_value_ = 0;
} else if (tmp_ven_id == 3) {
sluft_connected_ = 1;
sluft_value_ = 1;
}
SendUInt16(tmp_ven_id);
SendStringNoLen("|");
SendUInt16(sluft_connected_);
SendStringNoLen("|");
SendUInt16(sluft_value_);
SendStringNoLen("\n");
}
#pragma GCC pop_options
根据 ID 设置两个变量、然后打印结果。 这是类中的变量定义。
private:
uint16_t sluft_value_;
uint16_t sluft_connected_;
当我查看打印时、它看起来不正确。
已缓存:
当tmp_ven_id == 5: sluft_value_ 应设置为 0
当tmp_ven_id == 3: sluft_value_ 应设置为 1
实际行为
sluft_value_ 1无论执行哪个条件分支、成员变量始终读取为。
ID |已连接|值
00005 | 00001 | 00001 (预期值:00000)
00003 | 00001 | 00001 (预计:00001)
00005 | 00001 | 00001 (预期值:00000)
00003 | 00001 | 00001 (预计:00001)
查看沉降器代码时、问题明显可见。 在第 5 种情况下、0 值的 wirte 发生在另一个地址、然后将其传递给打印该值的函数。 我花了一些时间进行调试、但无法找到导致此问题的真正原因。 只是一堆变化,我可以做似乎“解决“这个问题.
// Option 1:
//add Dummy variable.
private:
uint16_t dummy = 0xFFFF;
uint16_t sluft_value_;
uint16_t sluft_connected_;
// Option 2:
//Change the else if to if
if (tmp_ven_id == 5) {
sluft_connected_ = 1;
sluft_value_ = 0;
}
if (tmp_ven_id == 3) {
sluft_connected_ = 1;
sluft_value_ = 1;
}
对于选项 1、文本大小按预期增加 2、代码正常工作。 从“Else if“链接到“IFS “不起作用。
GNU ld (Mitto Systems Limited - MSP430-gcc 9.3.1.11) 2.34
文本 数据 BSS 十进 制文件名
29556 1338 1292 32186 7dba ->已断开
29558 1338 1292 32188 7dbc ->正在工作
29534 1340 1292 32166 7da6 -> IF
29534 1340 1292 32166 7da6 ->否则
生成的汇编器代码如下。 3 种不同实现方案中的每一种。 在 BROKEN 示例中、mov 0 显示为一个距离很远的地址。

我正在使用所有选项来减小代码大小并优化链接时。
使用的编译器标志: -g3 -os -fno-rtti -fno-exceptions -std=GNU+11 -wl、-mcpu=430 -mhwmult=16 位-mno-warn-mcu
我怀疑内存对齐中存在导致这种情况的错误。 我禁用了 LTO 并更改了.ld 文件中 ROM 段的大小、汇编器代码仍然具有错误地址。