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.

[参考译文] MSP430FR5739:FRAM 的动态分区

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/568863/msp430fr5739-dynamically-partition-of-fram

器件型号:MSP430FR5739

可以对 FRAM 进行分区吗? 也就是说、我想在 FRAM 变量中保存某些数据、这些变量的大小可能因情况而异、但我不希望 FRAM 的静态段应该更大或更小。

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

    您好、Albert、

    "动态"是指(1)在 MSP430FR5739上执行程序期间还是(2)在生产期间、您知道某些模型/器件需要较大或较小的 FRAM 区域?

    遗憾的是、无法实现#1。 在应用程序构建的链接阶段、链接器命令文件允许链接器组合目标文件并将段分配到目标系统的配置存储器中。 链接器命令文件是一个 ASCII 文件、它使用两个链接器指令 MEMORY 和 SECTIONS 将段分配到存储器的特定区域中。 MEMORY 指令定义目标存储器配置。 SECTIONS 指令控制如何构建和分配段。 此外、链接器命令文件还可以包含输入文件名和链接器选项。 链接器命令文件在嵌入式程序中发挥着重要作用、因为它们指定了代码段和数据段在目标存储器中的分配位置。 如果没有此文件、链接器将不知道目标存储器配置以及如何正确分配段。

    对于#2、这是可能的。 您只需使用两个(或更多)映像、这些映像使用不同的链接器文件为每个模型构建、等等

    假设您是指情景1、这是为什么会引起关注的问题? 您的程序代码是否太大、以至于您的变量空间不足? 我建议在 FRAM 中声明一个足够大的段、以便容纳最大的可能变量、然后在整个代码中使用最大的可能变量。 否则、它会很快变得非常复杂。 例如、假设我们从32位变量更改为64位变量"动态"。 如果您执行的是32位乘法、加法等、则它不能与64位变量正常配合使用。 最大的可能变量提供向后兼容性、但需要更多内存。

    希望这是有道理的。 如果我对您的问题产生误解、我会感到抱歉。 我建议查看我们的 MSP FRAM 最佳实践应用手册。

    此致、

    James

    MSP 客户应用

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

    我认为我的定义符合您的#2。 但让我举一个例子。 我有一个库、其中包含程序员可以调用的函数。 每次程序员在其代码中调用函数时、库都会将函数的参数值保存在 FRAM 位置(不覆盖)。 因此、我希望根据程序员调用我的函数的次数、增加或减少 FRAM 段。 例如

    GET_Aage_person1 (A=20);
    GET_Aage_person2 (a=30);

    在 FRAM A[0]=20中。 A[1]=30。

    其他情况
    GET_Aage_person1 (A=20);
    GET_Aage_person2 (a=30);
    GET_Aage_person3 (a=50);
    GET_AGE_person4 (A=80);

    在 FRAM A[0]=20中。 A[1]=30。 A[2]=50。 A[3]=80。

    如果我们将"A"视为 FRAM 段、我是否可以像动态阵列那样增大其大小?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Albert、

    我开始了解您的要求。 我主要关注编译时间、而您则讨论运行时间和可变长度数组。 考虑到这一点、请 查看 MSP430优化 C/C++编译器用户指南中的第6.1.4节"部分"和第6.1.6节"动态内存分配"。 ".sysmem "部分为动态内存分配保留空间。

    此致、

    James

    MSP 客户应用

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

    尊敬的 James:  

    再次感谢。 我认为您发送给我的内容仅针对 RAM 上的变量、不是吗?

    .sysmem RAM

    我需要的东西与变量不同、但与 FRAM 分区类似。 与静态定义我将用于 FRAM 变量的字节数不同、该数字应取决于写入程序时要存储的信息量、即在编译系统时将保留正确的字节数。 明白了吗?

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

    [引用用户="Albert DelaO15">再次感谢您。 我认为您发送给我的内容仅针对 RAM 上的变量、不是吗?

    是的、但请记住、FRAM 可用作 SRAM。 在 MSP430 FRAM 技术–操作方法和最佳实践 应用手册的表1中、您可以看到用于动态内存分配的".sysmem"段可以位于 FRAM 中。

    [引用 user="Albert DelaO15">我不希望变量与 FRAM 分区类似。 与静态定义我将用于 FRAM 变量的字节数不同、该数字应取决于写入程序时要存储的信息量、即在编译系统时将保留正确的字节数。 有道理吗?[/引述]

    对于静态存储器分配、使用栈。 对于动态内存分配、使用堆。 如果您的数组大小固定、编译器可以在栈上分配此确切大小。 由于数组大小可能会发生变化、编译器希望将其放置在堆上。 此外、正如我在上面提到的、在构建时间之后、无法更改存储器部分的大小。

     对以下主题中的分配和动态大小有一些好的建议。

    此致、

    James

    MSP 客户应用