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:将局部变量分配给FRAM

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/590125/ccs-allocating-local-variables-to-fram

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

工具/软件:Code Composer Studio

我找不到这一点。  

#pragma持久性按预期将全局变量放入FRAM。 这很好,但是如果我有一个本地256字节的阵列,最好能将它存储到FRAM而不是SRAM。 2kB SRAM的1/8就在那里。

据我所说,您只能将全局变量指派给FRAM, period。 这种情况是否有(sane)的解决方法? 显然,对于传统思维来说,使用一组全局变量是双倍加一种不好的,您必须维护某种命名方案等,以将特定的全局数组与特定函数绑定。 这也意味着您分配的内存比实际需要的要多,因为您总是在内存中保留“foo[256]"和“bar[256]",尽管它们可能不是同时需要的。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    WAG,但您是否尝试过"静态"? 这只是创建一个具有auto范围的非堆栈变量。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的,它转到.data,不会被取消分配。 #pragma data_section也仅适用于"文件级"全局变量。

    现在您提到了它,至少就隐藏变量而言,我可以将关联的函数拆分为一个单独的源文件。 这仍然无法解决内存从未被取消分配的问题。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [quote user="Olli Mannisto",这仍然无法解决内存从未被取消分配的问题。 TI ARM,MSP430和C2000编译器支持C99 可变长度阵列 功能,该功能允许从堆中分配变量,并允许在超出范围时回收内存。

    由于堆可以放置在FRAM中,这可能对您的情况有所帮助。

    请注意,可变长度数组分配代码似乎不能确保线程安全,因此如果在SYS/BIOS程序中使用,可能会导致故障;请参见 MSP432P401R:当数组大小可变时,程序会出现硬故障。

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

    我为MSP430FR5969创建了附加项目,该项目演示了可变长度阵列可以使用TI MSP430 v.16.2 .LTS编译器进行分配。 输出报告变量长度数组是在FRAM (堆的一部分)中的地址0x51f2处分配的:

    以
    
    字符串格式化的字符串格式化为字符
    串的VLA格式化为长度为40的VLA
    格式化为长度为50 (0x51f2)的VLA
    格式化为长度为60 (0x51f2)的字符串格
    式化为长度为70 (0x51f2
    字符串)的VLA格式化的字符串 格式化为长度为80的VLA at 0x51f2
    字符串格式化为长度为90 at 0x51f2的VLA 

    我注意到,对于小型内存设备,运行时库代码的大小开销很大,因为 <CCS_INSTALL_ROOT>\ccsv7\tools\compiler\ti-CGT-MSP430_VLA.1.LTS\lib\src\vla_alloc.cpp中的init_Curr_VLA_Pool()函数分配了一个初始3000字节缓冲区来管理16.9 存储池。 因此,必须将项目中的堆大小设置为4096字节,才能成功创建变量长度数组。

    e2e.ti.com/.../MSP430FR5969_5F00_VLA.zip

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    有趣的想法 malloc还使用堆,因此这是分配可变数量(非全局)数据的两种不同方式。 如果您要朝那个方向前进,您只需增加堆量。 事实上,使用malloc可以使用全局但动态的分配,这很好。

    我没有时间进入SYS/BIOS和/或TIRTOS路由,因为我一直忙于编写固件。 当然,这使得转换要在RTOS上运行的内容变得越来越困难。