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:将.sysmem/.bss 移至 FRAM 存储器

Guru**** 2589275 points
Other Parts Discussed in Thread: MSP430FR5994

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/628410/ccs-msp430fr5994-moving-sysmem-bss-to-fram-memory

器件型号:MSP430FR5994

工具/软件:Code Composer Studio

您好!

我正在尝试实现在 MATLAB 中编写的算法、以便在 MSP430上工作。 我使用 MATLAB Coder 来生成 C 代码。 问题是、这些 MATLAB 函数的变量占用 uC 上的大量空间。 在编码器的设置中、我可以在可变大小数组的静态或动态分配之间进行选择。 因此、存储器的.sysmem 或.bss 部分会变得非常大。 这为 MSP430上的存储器留下了两个选项:

1.将堆(.sysmem)移动到 FRAM2

2.将.bss (可能还有.data)移动到 FRAM2

对于选项1、我尝试对.cmd 文件进行不同的修改、但这些修改不起作用。 我认为我对该文件的理解不是很好,不能以正确的方式修改它。

对于选项2、我只在.cmd 文件中放置 FRAM2而不是 RAM、但会出现错误:


#17003-D 从函数"active_recognition "到符号"active_no_empty"的重定位溢出;18位重定位地址0x25a73太大、无法在16位字段中进行编码(类型='R_MSP430X_ABS16'(15)

.bss       :{}> FRAM2                 /*全局和静态变量             */
.data      :{}>RAM                 /*全局和静态变量             */
.TI.noinit :{}>RAM                 /* for #pragma noinit               */
.stack     :{}> RAM (高)          /*软件系统堆栈            */

我 还将数据模型从限制更改为大型、但这不起任何作用。

是否有人可以为其中一个选项或两个选项提供工作代码? 我也不知道其中哪一个更好地实现它。

谢谢、

Andrea

 

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

    不要混乱命令链接器文件。 使用 PERSISTENT pragma 将变量移动到 FRAM 存储器中: www.ti.com/.../slaa628.pdf

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

    感谢您的快速回答、但这对我来说非常不切实际。 编码器生成每个函数都有许多变量、我必须手动将每个变量移动到 FRAM。 此外、每次我在 MATLAB 中更改某些内容并生成新代码时、文件将被覆盖、变量名称可能会被更改、因此我必须再次执行所有操作。

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

    将.sysmem 从 READ_WRITE_MEMORY 组内部重新定位到.text:_ISR 声明下方、并将其分配到 FRAM2:

    .text:_ISR :{}> FRAM /*代码 ISR *
    sysmem:{}> FRAM2 /*动态内存分配区域*/

    将全局和静态变量移动到大内存区域(>0xFFFF)可能会出现问题,您可以尝试将它们移动到 FRAM,并指定代码和常量数据只放置在 FRAM2中。

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

    尊敬的 Andrea:

    另一个建议是超越 MATLAB Coder、使用 Embedded Coder。 Embedded Coder 使您可以完全控制生成的代码、并允许生成优化的代码。 嵌入式代码中产生的代码与手动代码一样高效。

    此外、您还可以从以下选项中为生成的代码选择主要目标:(可能需要登录 DOC 链接)

    在您的情况下、您可能希望了解 ROM/RAM 效率选项。

    HTH、

    -Brian

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

    您好 Brian、

    我的计算机上已经安装了 Embedded Coder、但它仅向 Matlab Coder 设置添加了更多选项。 我想为了获得完整的配置可能性(使用效率选项)、您需要从 Matlab Simulink 生成代码、我没有这样做(我只获得了一个脚本、其中包含在标准 Matlab 编辑器中编写的一些算法)。 我也找不到适用于 MSP430FR5994或类似器件的支持包。 如果您有更多有关从 Matlab 为 MSP430x 生成合适代码的信息、请告诉我。

    您好!

    Andrea

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

    您好、Ryan、

    将.sysmem 移动到 FRAM2会导致程序卡在 malloc 函数的循环内:

    /*------------------ *
       /*找到第一个足够大的块以容纳请求的分配   */
       /*------------------ *
       while (current!= limit &&-curry->packet_size < allocsize)
       {
       上一个=当前;
       Current = Current->NEW_FREE;
       }

    当我使用调试器时、程序的行为非常奇怪、while 循环的第二个条件为 false、但不会退出循环。 我尝试分配的数组可能太大、因此我返回尝试将.bss 移动到 FRAM2。

    我已经尝试过内存分配方面的其他几个不同的方面,这些都导致了更复杂的错误。 因此、最终都归结为我在原始帖子中描述的错误:

    [引用用户="Andrea Dorn"]


    #17003-D 从函数"active_recognition "到符号"active_no_empty"的重定位溢出;18位重定位地址0x25a73太大、无法在16位字段中进行编码(类型='R_MSP430X_ABS16'(15)

    .bss       :{}> FRAM2                 /*全局和静态变量             */
    .data      :{}>RAM                 /*全局和静态变量             */
    .TI.noinit :{}>RAM                 /* for #pragma noinit               */
    .stack     :{}> RAM (高)          /*软件系统堆栈            */

    我 还将数据模型从限制更改为大型、但这不起任何作用。

    [/报价]

    这是因为我将.bss 放置在从地址0x10000开始的 FRAM2中。 我可以通过某种方式更改设置来克服此错误吗? 我找到了类似的文章 https://e2e.ti.com/support/microcontrollers/msp430/f/166/t/313159

    在这里,在 GNU Linker->Miscellaneous options 中设置一个标志可以解决这个问题。 但我在我的项目设置中找不到"其他标志"部分;我正在使用 MSP430链接器。

    在这里、我的属性窗口:

    我认为这对我来说是目前最简单的方法、可以找到一种将存储器的上部用于我的变量和数据的方法。 如果这是可能的、就是这样。

    您好!

    Andrea

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

    您是否尝试将 Project Properties -> CCS Build -> MSP430 Compiler -> Processor Options 中的-data_model 选项从"restricted"更改为"large?

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

    [引用用户="Ryan Brown1"]

    您是否尝试将 Project Properties -> CCS Build -> MSP430 Compiler -> Processor Options 中的-data_model 选项从"restricted"更改为"large?

    [/报价]

    是的、但仍会出现与高位地址相关的错误(实际上、它们只是标记为警告)。

    Andrea