This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] MSP430F5659:静态常量变量未正确初始化

Guru**** 2528170 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/861955/msp430f5659-static-const-variable-not-correctly-initialized

器件型号:MSP430F5659

您好!

我看到函数中声明的静态常量变量存在一种奇怪的行为。

uint32_t function1 (void){

静态常量 uint16_t var1 = 14000;
静态常量 uint16_t var2 = 2000;
静态常量 uint16_t var3 = 1750;

/*一些计算*/

返回计算值; 

如果我在调试模式(无优化)下单步执行这些函数、并在这些变量上添加观察表达式、我会得到:

VAR1:找不到标识符:VAR1

VAR2:240

Var3:16383

如果我从声明中删除"静态"、那么我会得到正确的值:

VAR1:14000

VAR2:2000

Var3:1750

我认为它可能只是调试器、但如果我添加或删除"static"属性、计算值实际上会发生变化。

此编译器是特定的吗? 我正在使用 TI v18.1.0.LTS、但我也尝试过 v18.12.2.LTS、两者的行为相同。
编辑:我还尝试过19.6.0.STS

谢谢、

Fred

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我错了、计算值不会改变。 这似乎是静态变量的调试器问题。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我怀疑"const"可能是在编译器中实现的、(尤其是在打开优化的情况下)不是由存储器位置中的值实现的、而是作为内联编译器常量实现的。

    例如:

    A = 2+ 2;

    将生成与相同的代码

    静态常量 int b = 2;

    a = b+b;

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    此外、"优化器"和"真正好的代码生成器"之间的行是模糊的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    优化级别关闭、硬件乘法器除外。 以下是优化标志:

    -off -opt_for_speed=0 -use_hw_mpy=F5

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    实际上、即使是原始 C 编译器预计算的编译时间常量表达式、我的示例也会在编译时完成。 我想、确保常量变量实际存储在存储器中的唯一方法是在存储器上使用&运算符、或其他一些指针运算。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    为什么要将常量变为静态变量? 为什么甚至有变量? 只需在表达式中直接使用它们。

    使用 const 关键字的唯一原因是作为一个更适合调试器的#define、当在一个小函数内局部使用时、这毫无意义。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    这些变量最初被编写为具有可读性乘法的定义。

    #define VAR1 (Operand1 * Operand2 / OPERAND3)/*等于14000 */ 

    为了确保在初始化时只执行一次乘法运算、定义被切换到一个静态常量。

    它确实是 work­ μ F、但调试器无法正确评估静态常量变量。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    正如我说过的、如果一个表达式中充满了常量、无论如何、它将在编译时进行计算。

    FWiw、我认为静态初始化是在第一次输入函数时计算的、而不是在初始化时计算的。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    即使优化已关闭?

    是的、我没有正确地说我的句子。 目标实际上是只完成一次计算。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    是的、请参阅上文 Bruce 的评论。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    好的、因为这些值实际上是编译时常量、所以它们不是作为变量存在的。

    我仍然不明白为什么将它们声明为"const"而不是"static const"会使调试器能够评估变量、前提是这两个声明都是编译时常量。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我所知道的是、根据 Harbison 和 Steele 的说法、静态常量被允许在只读存储器中。

    如果您真的想得到答案、请发布代码、以便像 George Mock 这样的人可以查看生成的汇编代码、告诉您实际发生了什么。