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/MSP430FR5969:了解RAM内存部分的(高)修饰符,对其他内存部分的使用和适用性

Guru**** 2535750 points
Other Parts Discussed in Thread: MSP430FR5969

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/566713/ccs-msp430fr5969-understanding-high-modifier-with-ram-memory-section-use-and-applicability-to-other-memory-sections

部件号:MSP430FR5969
主题中讨论的其他部件: MSP430WARE

工具/软件:Code Composer Studio

如果已在其他地方回答了此问题,请表示歉意。 Google和论坛搜索结果不好。

我正在尝试将大容量数据放置在MSP430FR5969上FRAM和FRAM2的NOINIT阵列中。 为此,我已按以下方式修改了默认链接程序命令文件:

.TI.noinit :{}> RAM更改为.TI.noinit :{}>> FRAM | FRAM2

我注意到使用了high关键字,例如.stack :{}> ram (high ),我想知道它的含义/用途以及 它是否适用于FRAM? 与此相关的是,我正在尝试了解将数据阵列放置在组织良好的内存位置的最佳做法,例如,如果我想将noinit阵列与FRAM的结尾或FRAM2的开头对齐,可以使用哪些工具来执行此操作?

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

    无法将.TI.noinit部分分配给闪存(FRAM或FRAM2)。  不受NOINIT pragma或属性约束的普通数组必须进入可读写的内存中,即RAM。  NOINIT数组出于相同的原因具有相同的限制。  普通数组和NOINIT数组之间的唯一区别是,该数组在main启动之前是否为零初始化。  普通数组初始化为零,而NOINIT数组未初始化。  

    谢谢,此致,

    -George

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

    汇编语言工具的用户指南第8.5 .5.2 4节“使用高位置说明符控制放置”中介绍了high关键字。

    [编辑-我无法让论坛接受此链接的URL。  请访问 http://downloads.ti.com/docs/esd/SLAU131/index.html 并从此处导航--考古学家]

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

    感谢您的回复。 请注意,FR5969是基于铁电RAM的设备,而不是闪存。 FRAM可被视为可替换的,用于数据和代码存储。 此外,链接程序命令文件的原始帖子中包含的代码片段I可以根据需要工作,这表明您的回复不准确。

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

    您好,Bret,

    您是否正在尝试存储变量或常量? 如果是变量,则建议在数组上使用#pragma持久性。 这会将所有这些数据自动放入内存中,位于FRAM内存的开头。 您想要将所有读/写FRAM组合在一起的原因是因为设备具有一个MPU,用于在FRAM的不同区域设置不同的权限(读/写/执行)-您希望确保使用MPU,因为它有助于防止代码受到攻击 意外被覆盖,例如,如果您注销了数组的末尾。 有关 CCS如何自动对FRAM进行分区并为您启用MPU (如果您使用持久性pragma指定变量)的详细信息,请参阅MSP430 FRAM技术–操作方法和最佳实践www.ti.com/.../slaa628部分6.4 3-1。

    如果可能,我建议您将数据保存在较低的FRAM中(而不是FRAM2),因为它更容易访问(您必须使用__data20_write_char()之类的内部函数来写入或读取20位地址空间)。 但是,如果您存储的数据太多,这是不可行的,请参阅另一个主题: e2e.ti.com/.../205.5681万 或告诉我,我们可以进一步讨论链接程序文件修改的最佳选项。 另请参阅我们将LZ4压缩示例作为MSP430Ware中包含的FRAM实用程序的一部分: dev.ti.com/.../ 这可以让您压缩数据并将其存储在FRAM中(如果这对您的应用有意义)(因为听起来您需要大量存储)。


    此致,
    Katie

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

    您好Katie。 感谢您的回复。 实际上,我正在存储一个数据阵列,用于长期传感器数据存储(R/W)。 我原本希望使用FRAM的两个部分来增加容量,但如果需要,我可以坚持使用较低的模块。 我不想为了实现基本操作而列入特别指令,因为其他人将使用这一传感器网络,为了使人理解得尽可能干净,我希望代码尽可能干净。 关于使用持久性pragma而不是NOINIT pragma,我发现,持久性要求我预初始化数据数组,键入正确的字节数(4000以上)听起来不是很有吸引力, 但是,如果我忽略了一些简单的工具来避免这种不便,我很乐意考虑。

    此致

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

    关于使用持久pragma而不是NOINIT pragma,我发现,持久希望我预初始化数据数组并键入正确的字节数组(4000以上) 听起来不是很有吸引力[/QUOT]根据C标准,如果使用部分初始化程序,其余元素将隐式初始化为零。

    例如,在下面的MSP430FR5969的4000元素数组示例中,仅显式初始化第一个元素, 然后在FRAM中分配lare_array:

    #include <MSP40.0.h>
    
    #pragma persistent(lare_array)
    int lare_array[40万]={0};
    
    /*
    main.c
    */
    int main(void){
    WDTCTL = WDTPW | WDTHOLD;	//停止看门狗计时器
    	
    larate_array[0]+;
    
    	返回larate_array[0];}
    
    

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

    很高兴我们能提供帮助。 正如切斯特所说的,我认为您应该能够用={0}进行初始化;如果您遇到更多问题,请告诉我们-您也可以在 MSP低功耗微控制器论坛上发布!

    此致,
    Katie
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    谢谢切斯特,我明白了,以后还会再用。 谢谢。