【发布时间】:2023-03-20 16:12:01
【问题描述】:
我正在将 GCC 用于 STM32 微控制器应用程序,但遇到了一个奇怪的现象。我在闪存中有一个常量值表,其中包含来自链接器符号的地址。现在我想添加另一个值,其中包含来自两个链接器符号的计算(在构建时),但它似乎不起作用。
它看起来像这样:
extern uint32_t _ls1; // Linker symbol 1
extern uint32_t _ls2; // Linker symbol 2
const volatile uint32_t table[4] =
{
(uint32_t)(&_ls1), // 1. Correct value
(uint32_t)(&_ls2), // 2. Correct value
(uint32_t)(&_ls1) + 1, // 3. Correct value
(uint32_t)(&_ls1) + (uint32_t)(&_ls2) // 4. Wrong value, always 0
}
表中的前三个值完全正确。
每当我在计算中放入两个(或更多)链接器符号时,结果为 0。没有给出错误或警告。
有任何想法吗?
【问题讨论】:
-
(uint32_t)(&_ls1) + (uint32_t)(&_ls2)不会溢出吗?&_ls1和&_ls2表达式的值是多少?No error or warning is given.- 你用-Wall -Wextra编译吗?two Linker symbols- 你能提示这些变量是如何从链接器中导出的吗?您是否尝试使用uint64_t或unsigned long long类型进行计算?你如何检查结果值是否正确?你能创建一个最小的可重现示例MCVE吗?包括整个链接器、main() 函数、包含、编译器等? -
>不会 (uint32_t)(&_ls1) + (uint32_t)(&_ls2) 溢出吗?没关系,我尝试什么样的计算(加、减、异或等),结果总是0。