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/MSP430F123:在对器件进行编程期间初始化数据段中的数据

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/680239/ccs-msp430f123-initializing-data-in-the-data-section-during-programing-the-part

器件型号:MSP430F123
主题中讨论的其他器件: MSP430FR2422

工具/软件:Code Composer Studio

我正在使用 CCS 版本:8.0.0.00016。 在我的代码中、我有:

#pragma DATA_SECTION (EngSet、".infoB")
int   EngSet = 250;              //发动机温度设定点

这会将变量放置在闪存中的 infoB 段中、如 Code .map 文件中所示:

00001000 EngSet                        

Code.txt 文件从@e000开始、并且没有任何位于@1000的数据。 我希望在对该部件进行编程时将 EngSet 变量初始化为250。 我将在程序中更改 EngSet 的值(不能声明 const)、但我需要对其进行初始化。 我已经尝试了对 lnk_msp430f123.cmd 的几个修改、但它们没有工作。

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

    也许有些像...   

    链接器.cmd:

    存储器

    #您好、Geoffrey、不确定您是否希望0x1000或0xe000作为此微小数据段的原点、请根据您的需要考虑/调整  

    ENGINESETPOINT (rwx):org = 0x1000,len = 0x2  

    部分

    .enginesetpoint:load > ENGINESETPOINT,fill = 0xFA;  

    C 代码:

    int EngSet;  //通过链接 器.cmd 文件将 EngSet 初始化为254。   这可能有点模糊、但应该起作用。  *  

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

    我在 processors.wiki.ti.com/.../Placing_Variables_in_Specific_Memory_Location_-_MSP430上查看、 其中指出:

    "修改链接器配置文件
    如上所示、IAR 链接器配置文件中定义的存储器段和 CCS 链接器命令文件的存储器部分可分别与 constseg pragma 和 DATA_SECTION pragma 搭配使用、以将变量放置在特定的存储器位置内。 因此、可以修改链接器配置/命令文件以定义新的存储器段/段、并将必要的变量放置在定义的存储器段/位置内。
    有关修改连接器配置/命令文件的更多信息、请参阅 CCS 和 IAR 文档。"

    我有几个变量、我希望将它们放置在信息 B 部分@ 0x1000中、它们的值在 C 源代码中指定。 他们的示例显示了这一操作、但未说明如何修改链接器配置文件。

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

    请理解、我对 MSP 器件上可用的存储器只有一个模糊的理解。  我在这里的观点可能是错误的。

    [报价用户="Geoffrey Probert"]我将更改程序中 EngSet 的值(无法声明为 const)

    这意味着 EngSet 不能像闪存那样位于非易失性存储器中。  信息 B 是闪存。  它必须位于 RAM 等易失性存储器中。

    谢谢、此致、

    乔治

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

    infoB 是闪存的一部分、可由程序写入以更改其值。 它涉及特殊的处理来设置它的擦除和写入操作、我让它们工作。 这些值需要在断电期间保持不变、并在下次器件上电时可用。 在首次对器件 CCS 和 FET 进行编程时、我希望将我指定的初始值写入存储器的信息 B 部分。

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

    [报价 USER="Geoffrey Probert"]这些值需要在断电期间保持不变,并在下次打开设备电源时可用。

    为此、请使用#pragma PERSISTENT。 请在 MSP430编译器手册中阅读相关内容。   

    我仍然怀疑您的设备不支持此功能。  使用#pragma PERSISTENT 时、它会在.TI.persistent 段中创建一个条 目。  链接器命令文件 lnk_msp430f123.cmd 没有此段的条目。  但在其他 MSP 器件的链接器命令文件中有.TI.persistent 条目。  解释这一差异需要有关这些器件的专业知识、我对此缺乏了解。  因此、我要将此主题介绍给 MSP 器件论坛中的专家。

    谢谢、此致、

    乔治

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

    所有、

    pragma PERSISTENT 仅用于 FRAM 器件。 在 INFOB 中放置初始化变量的一种方法是执行以下操作:

    #pragma RETAIN (VAR)
    #pragma LOCATION = 0x0fde //替换为要存储 VAR
    的位置 unsigned int VAR = 0xAA55;//初始化 VAR
    

    希望这对您有所帮助! 我没有在 F1xx 器件中尝试过这种方法、但我已经将其用于我们的一些较新器件。  

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

    我使用您的示例的代码是:

    #pragma RETAIN (EngSet)
    #pragma LOCATION = 0x1000
    int   EngSet = 250;              //发动机温度设定点

    我之前的代码是:

    #pragma DATA_SECTION (EngSet、".infoB")
    int   EngSet = 250;              //发动机温度设定点

    两者都将变量 EngSet 放置在 infoB 段的闪存中、但两者都不会在 code.map 中生成数据以在编程期间初始化变量。 code.txt 文件实际上显示:

    .TI.bound:EngSet
    0            00001000   00000002    未初始化
                     00001000   00000002    eG400.obj (.TI.bound:EngSet)

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

    Geoffrey、

    请尝试以下操作:

    #pragma RETAIN (EngSet)
    #pragma LOCATION = 0x1900
    int EngSet; //发动机温度设定点
    
    EngSet = 250; 

    我在工作台上的某个部件上看到了这个初始化。 我之前看到的错误是、我通常将它用作常量、对您没有帮助。 我想知道您是如何使用此变量的、您必须将其复制到 RAM 中的 temp var、执行您想要的操作、然后定期对其 InfoB 位置执行闪存写入以在闪存中更新。  

    如果您能够切换器件、我建议您使用我们的 FRAM 器件之一、因为这样做变得更容易。 您只需使用前面提到的持久性 Pragma、一切都将为您服务。 这是因为它易于写入 FRAM、因此您可以像使用 RAM 变量一样使用它、并且它将在两个电源周期之间保持更新(也称为持续更新)。 基本上、您可以不断地对其进行覆盖、因为 FRAM 的存储器寿命在规模上比闪存更类似于 RAM。 这将有助于减小代码大小、并且您不必编写闪存写入例程。 MSP430FR2422可能是适合您的代码、因为它具有与 MSP430F123相似的规格、其1k 单位定价大约是 MSP430F123成本的一半。