TI E2E™ 设计支持论坛将于 5 月 30 日至 6 月 1 日进行维护。如果您在此期间需要技术支持,请联系 TI 的客户支持中心寻求帮助。

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.

[参考译文] 编译器/CCCStudio-C2000:使用关键字" volatile和quot;声明的变量仍得到优化

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/617671/compiler-ccstudio-c2000-variable-declared-with-keyword-volatile-still-got-optimized

部件号:CCStudio-C2000

工具/软件:TI C/C++编译器

您好,

我使用C2000编译我的项目,并将标志设置为:

-v28 -ml -mt --float_support=fpu32 --tmu_support=tmu0 --cla_support=cla1--vcu_support=vcu2 -O2 --opt_for speed=3...

问题是我定义了一个带有volatile的全局变量,但似乎我从未在代码中明确引用它,所以它经过了优化,在.map文件中找不到它。

.cpp:

volatile const int __attribute__((section(".init_proc"),used )) test =99;

地图:

...

init_proc

* 0.0827万 0008278万 0000万未初始化

.text:lib

...

谢谢!

邵玉

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

    很遗憾,我无法再现此问题。  您的代码是否组织为CCS项目?  如果是这样,我希望您按照项目 共享一文中的说明将其打包,然后将该zip文件附加到下一篇文章。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    "问题是我定义了一个带有volatile的全局变量,但似乎我从未在代码中明确引用过它,因此它得到了优化"

    听起来不错。如果它没有引用代码中的变量,为什么要保留它? volatile并不意味着将此变量视为sacrosanct,它只是意味着每次访问该变量时,都必须从内存访问它,而不是从存储器访问它。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    请注意,该示例还使用属性“used”。 用户有一个合理的期望,即这需要编译来保留变量。 这是CodeGen-1928的主题,这是一个增强请求,将属性“已使用”视为pragma“保留”。 这一请求仍在调查中。

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

    Keith Barkley,

    是的,这是有意义的,但实际上我在.init_proc部分引用这些变量,并使用指向指定该部分位置的链接程序脚本符号的指针。

    所以我试着用关键字和属性选项告诉编译器,这些变量可能被引用,甚至被隐式修改,但正如你所看到的,它不起作用。

    感谢你的回复:))

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

    George,

    我 使用6.2 0.0.005万 版本处理项目,我需要请求上载项目的权限,这可能需要一些时间。

    顺便说一句,我通过在 声明中添加关键字extern来解决问题,使其处于全局范围内,它工作正常,但这仍然不能解释为什么C2000编译器会忽略"used (已使用)"属性。 是否有任何编译器选项允许它执行此操作?

    我会尽快上传项目,非常感谢您的快速回复:)))

    邵玉

     

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

    考古学家,

    是的,我确实尝试了

    #pragma保留

    volatile const int __attribute__((section(".init_proc"))) test =99;

    但仍然不起作用。

    暗示文件范围的const似乎会覆盖编译器指令。 (--keep unneeded_statics未选中)

    感谢您的回复:]]>

    邵玉

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

    Shaoyu Chen 说:
    我通过向 声明中添加关键字extern来解决问题,使其处于全局范围[/QUOT]

    我怀疑您正在C++模式下编译(选项--cpp_default,也称为-fg)。  在C++中,声明为"const"的全局变量被视为TRUE常量,可以由编译器删除。  如果要保留变量,必须将其声明为"extern const"。  或者,您可以将文件编译为C文件,而不是C++文件。

    这不能解决二手车的问题,这是一个单独的问题。