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.

[参考译文] C2000-CGT:TI-CG-C2000_20.2.5.LTS 在禁用优化时优化变量

Guru**** 2534260 points
Other Parts Discussed in Thread: TMS320F280049C

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1051241/c2000-cgt-ti-cg-c2000_20-2-5-lts-optimises-variable-when-optimisations-are-disabled

器件型号:C2000-CGT
主题中讨论的其他器件:TMS320F280049C

您好!

我尝试使用#pragma PERSISTENT 来定义存储器中的一些数据。

例如  

#pragma PERSISTENT (bootloaderVersion)
const version_t bootloaderVersion ={
.mor = main_version、
.minor = MINOR_VERSION、
.patch = patch_version、
.build = build_no、
.sha = SHA_NO
};

如果我不在代码中的任何位置使用该变量、则值不会存储在闪存中。

但是、如果我添加类似的内容

if (bootloaderVersion.Major = main_version){

 ///虚拟代码

然后、内存会正确初始化。

是否有任何明确的方法可以告诉编译器不要将其优化掉?  

谢谢你

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="481008" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1051241/c2000-cgt-ti-cg-c2000_20-2-5-lts-optimizes-variable-when-optimizations-are-disabled ]是否有任何明确的方法可以告诉编译器不要优化该位置?  [/报价]

    试用 Retain Pragma

    请参阅 《C2000编译器用户指南》中的第6.10.24节"RETAIN Pragma "

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

    PERSISTENT 工作正常、但如果在代码中的任何位置未使用该变量、则不会

    Retain 似乎 根本不起作用、即使我尝试使用该变量  

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

    项目是使用 COFF 还是 EABI?

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

    eabi

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

    使用 TI 编译器 v20.2.5并借助以下代码在 CCS 11中为 TMS320F280049C 创建了一个新项目、其中 bootloaderVersion 变量未在代码中使用:

    typedef struct
    {
        int major;
        int minor;
        int patch;
        int build;
        int sha;
    } version_t;
    
    #pragma RETAIN (bootloaderVersion)
    const version_t bootloaderVersion =
    {
        .major = 2,
        .minor = 3,
        .patch = 4,
        .build = 5,
        .sha = 6
    };
    
    int main(void)
    {
    	return 0;
    }
    

    通过查看链接器映射文件、可以看到放置的 bootloaderVersion:

    .econst    1    0000a80a    00000005     
                      0000a80a    00000005     main.obj (.econst:_bootloaderVersion)

    如果没有 pragma、则会保留 bootloaderVersion 不在链接器映射文件中。

    我尚未尝试刷写上述微不足道的示例、但它似乎显示 pragma RETAIN 正常工作。

    [引用 userid="481008" URL"~/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1051241/c2000-cgt-ti-cg-c2000_20-2-5-lts-optimizes-variable-when-optimizations-are-disabled "]如果我在代码中的任何位置都不使用此变量,则这些值不会存储在闪存中。

    如何检查未存储在闪存中的变量?

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

    我将闪烁、然后查看该部分的地址处的内容  

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

    我让它与 GNU 扩展一起工作  

    +__attribute (((section(".bootloaderversion")、retain)) static const version_t bootloaderVersion ={ 
    +.major = main_version、
    +.minor = MINAL_VERSION、 
    +.patch = patch_version、 
    +.build = build_no、 
    +.SHA = SHA_NO 
    +};