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/MSP430FR5994:巨型阵列变量 FRAM

Guru**** 2563960 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/916163/ccs-msp430fr5994-huge-array-variable-fram

器件型号:MSP430FR5994

工具/软件:Code Composer Studio

#pragma PERSISTENT (SFR13Data)// SFR13 データ記憶
CHAR SFR13Data[DimMax][54];

我想放置1024 54个字符的数据。
DimMax 63正常。
但是、当 DimMax 为64或更高时、会输出错误#10099-D、无法保护变量。
如何在 FRAM 中保留64个以上的数组变量? 


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

    我不知道所有错误代码--#10099-D 的文本是什么?

    我记得、PERSISTENT 需要显式初始化。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    pragma PERSISTENT(SFR13Data) 
    CHAR SFR13数据[63][54];
    pragma PERSISTENT(SFR13Data1) 
    CHAR SFR13Data1 [63][54];
    pragma PERSISTENT(SFR13Data2) 
    CHAR SFR13Data2 [63][54];

    可以宣布上述三项。 但是、下一步、一个声明将导致错误。

    pragma PERSISTENT(SFR13Data)// SFR13データ記憶
    CHAR SFR13Data [64][54]; 


    我想声明 char SFR13Data [1024][54];

    
    
    出现以下错误。
    指出物理内存不足。
    但是、FRAM 物理存储器具有额外的100 KB。
    然后、通过将变量名称更改为63来声明54个字符、从而保护存储器。
    但是、尝试保护超过64个(SFR13[64][54])会导致错误。 
    
    
    ---------------------------------------------------- 

    典型消息
    "./lnk.cmd"、第48行:错误#10099-D:程序将不可用
    存储器。 “.text”大小为0x2b12的定位失败。
    可用存储器范围:
    闪存大小:0x1000未使用:0xe56最大空洞:0xe56


    含义

    链接器无法将程序的某些部分安装到器件上。 特定的错误消息指示链接器无法放置程序的哪个部分、其大小以及它尝试放置它的存储器范围。 对于列出的存储器范围、size 表示段的总大小、unused 表示尝试放置失败的段时剩余的空间量、max hole 表示可用的最大连续区域。

    为什么会发生这种情况

    从根本上说、这表明器件没有足够的物理存储器(只读或读写)来处理程序。 但是、这并不一定意味着需要更大的器件。 可以更改几个可以解决该问题的内容。 此外、对于高级用户、此错误也可能来自不正确的链接器命令文件、该文件不能准确地表示当前器件。 (TI 器件通常附带适当的链接器命令文件、不需要用户修改、因此如果您对链接器命令文件一无所知、则不应担心这种可能性。)

    补救措施

    出现此错误消息的原因有多种、因此有多种可能的解决方案。 需要考虑的几个常见问题:  
    ##如果一个段未能放置到 RAM 中、请确保为器件和程序正确设置了堆栈和堆大小。 请考虑减小它们。
    ##尝试启用或提高编译器使用的优化级别。 与优化的程序相比、未优化的程序需要更多的空间。
    ##如果您添加了用于调试的 I/O 代码、则可能会大于预期。 具体而言,printf()不适合许多小型嵌入式器件。 根据器件的大小,--printf_support=minimal 选项可能会解决问题,而 printf()可能根本不是一种可行的调试方法。

    如果上述建议无法解决问题、则需要进行更多调查、以确定问题是否仅仅是器件对于程序而言不够大、或者空间是否被不必要地使用。 查找更多信息的最佳位置是由链接器生成的映射文件。 映射文件提供了有关段的放置位置、组成和大小的详细信息。 在查看此问题时、请记住、未能放置的部分不一定是问题的根源。 之前放置在同一存储器区域中的另一个段可能比预期的要大得多、并引入了该问题。

    风险、严重性

    此错误会阻止可执行程序的构建。

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

    您好、Nodar、

    我在 FR5994上测试了这些变量声明、不会遇到任何问题。 您是否修改了.cmd 文件?

    此致

    Johnson

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


    您进行了内存分配实验。

    谢谢你。

    我的环境是 CCS v9.0.1。 编译器版本为 TI18.12.2.LTS[TI v18.12.1LTS]。

    我尚未修改 cmd 文件。

    但您成功了、所以我认为它是由于编译条件造成的。

    我重新检查编译参数。

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

    您好、Nodar、

    我使用 CCS v9.0.1、编译器版本为 TI 18.12.1、看起来 PC 环境是相同的。

    此致

    Johnson

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


    Johnson 的您好

    我看到了您指出的 cmd 文件。

    我修复了。

    错误消失。 谢谢你