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.

[参考译文] CCS/MSP430FR2422:#pragma PERSISTENT 变量未放置在 FRAM 中

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/905996/ccs-msp430fr2422-pragma-persistent-variable-is-not-placed-in-fram

器件型号:MSP430FR2422

工具/软件:Code Composer Studio

在下面的小程序中、变量 FramVar 不是在.TI.persistent 段中创建的、而是在.bss 段中、请参阅底部映射文件的提取。 我使用 CodeComposerStudio 版本:9.3.0.00012 

有什么建议吗?

此致、Robert



#include #pragma PERSISTENT (FramVar) unsigned int FramVar; void main (void){ WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器 SYSCFG0 = FRWPPW | DFWP; //设置 FRAM 写入使能 ++FramVar; SYSCFG0 = FRWPPW | PFWP | DFWP; //设置 FRAM 写保护(不可写) while (1){}


从映射文件提取:

部分分配映射

 输出                                 属性/
段  页   原点     长度      输入段
----  --------   ------   --------
.TI.persistent
0            0000e300   00000000    未初始化

.cinit    0   0000e300   00000012     
                 0000e300   00000006    (.cinit、.bss.load)[加载映像、压缩= zero_init]
                 0000e306   00000004    (_TI_handler_table)
                 0000e30a   00000008    (_TI_cinit_table)

.pinit    0   0000e312   00000000    未初始化

.binit    0   0000e312   00000000     

init_array
0            0000e312   00000000    未初始化

mspabi.exidx
0            0000e312   00000000    未初始化

.mspabi.extab
0            0000e312   00000000    未初始化

.const    0   0000e312   00000000    未初始化

.text     0   0000e312   000000ce     
                 0000e312   0000006a    rts430x_lc_sd_eabi.lib:autobinit.c.obj (.text:__TI_auto_init_nobinit_nopinit_hold_wdt:__TI_auto_init_nobinit_nopinit_hold_wdt)
                 0000e37c   0000003e                           :copy_zero_init.c.obj (.text:decompress:Zi:_TI_zero_init_nomemset:_TI_zero_init_nomemset)
                 0000e3ba   0000001a    main.obj (.text:main)
                 0000e3d4   00000006    rts430x_lc_sd_eabi.lib:exit.c.obj (.text:abort)
                 0000e3da   00000004                           :pre_init.c.obj (.text:_system_pre_init)
                 0000e3de   00000002                           :startup.c.obj (.text:_system_post_cinit)

.text:_ISR
*         0   0000e3e0   00000024     
                 0000e3e0   0000001c    rts430x_lc_sd_eabi.lib:boot.c.obj (.text:_isr:_c_int00_noargs)
                 0000e3fc   00000008                           :ISR_TRAP_ASM.obj (.text:_ISR:__TI_ISR_TRAP)

.bss      0   00002000   00000002    未初始化
                 00002000   00000002    (.common:FramVar)

.stack    0   00002760   000000a0    未初始化
                 00002760   00000002    rts430x_lc_sd_eabi.lib:boot.c.obj (.stack)
                 00002762   0000009e    --孔--

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

    当我构建代码时,我得到一个类似于 ...的诊断。

    "main.c"、第2行(第14列):警告:变量"FramVar"被声明为持久、应显式初始化 

    如果我将 FramVar 的定义更改为...

    #pragma PERSISTENT (FramVar)
    unsigned int FramVar = 0; 

    (笑声) 则未检测到诊断。  变量 FramVar 分配给.TI.persistent 段

    谢谢、此致、

    乔治

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

    乔治
    感谢您的回答!


    但这是否意味着变量在每次程序启动时都初始化为0、因此不再持久?

    此致、

    Robert

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

    此引用来自 MSP430编译器手册 ...

    默认情况下、noinit 或 persistent 变量分别放置在名为.TI.noinit 和.TI.persistent 的段中。 这些段的位置由链接器命令文件控制。 对于支持 FRAM 的器件、通常将.TI.persistent 段放置在 FRAM 中、并将.TI.noinit 段放置在 RAM 中。

    如果您使用 TI 提供的链接器命令文件、则.TI.persistent 段会分配给 FRAM。  它与包含程序指令的.text 等其他初始化段一样被编程到内存中。

    谢谢、此致、

    乔治

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

    定义为 persistent 的变量即使在发生电源故障时也应保留其内容、并在下一次通电时继续使用该内容。 我认为,这只有在变量的情况下才能实现
    (a)放置在 FRAM 中;和
    (b)未初始化。

    此致
    Robert

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

    尽管 #pragma PERSISTENT 变量已在 C 源代码中初始化,但在运行时仍是如此...

    [引用 user="Robert Lang1"]定义为 persistent 的变量即使在发生电源故障时也应保留其内容,并在下一次开机时继续使用该内容。

    谢谢、此致、

    乔治

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

    好的、
    我收到了我的硬件并尝试了它。 它的工作方式与您的建议一致。 再次感谢您的帮助。

    此致、

    Robert