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.

[参考译文] CC3220:程序不能放入可用存储器中

Guru**** 2560390 points
Other Parts Discussed in Thread: CC3220S, CC3220SF, CC3200

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

https://e2e.ti.com/support/wireless-connectivity/wi-fi-group/wifi/f/wi-fi-forum/734707/cc3220-program-does-not-fit-into-available-memory

器件型号:CC3220

尊敬的团队:

我在记忆方面遇到困难。 不确定应对这一问题的最佳方法是什么、以及从哪里开始最好、因此我想征求您的建议。

下图是总体情况。 ".text"看起来非常大。 您的程序中通常也会出现这种情况吗?  

谢谢、

David

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

    对 CC3220S 器件的存储器要求太高。 您有以下选项:

    -将您的设计切换到 CC3220SF 器件(推荐方法)
    -优化代码或从代码中删除某些功能

    作为起点、如果代码不需要32kB 的堆、您可以尝试将.data 段移动到 SRAM0中并减小堆的大小。 但我认为这不是一个长期真正的解决方案。 其他选项可以在运行时动态加载部分代码。 示例您如何在 CC3200 SDK 中的示例 DYNAL_lib_loader 中找到它(它适用于第一代 CC32xx、但对于 CC3220则是相同的)。 但真正的解决方案是 CC3220SF。

    例如、我的大型项目的.text 段为350kB。 但这不是问题、因为我使用的是 CC32xxSF。

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

    您好、Jan、

    遗憾的是、我的原型具有 CC3220S、我现在有点卡在它上面。

    我真的希望通过备选案文2可以做到这一点。 我观察到、当我从 ARM 编译器标志集中删除"--define=enable_IOT 信息--define=enable_IOT 错误--define=enable_IOT 警告--define=enable_IOT 调试"时、我会保存几个 KB。 此外、我还删除了许多同时保存的 UART_PRINT 语句。

    我想尝试您关于将.data 段移动到 SRAM0中并减小堆大小的建议。 您能建议在哪里找到执行该操作的命令、或者如果快速、您可以在此处共享命令吗?

    AWS 的证书占用了另一大块内存。 我的代码基于"shadow_sample"示例、在该示例中、证书存储在"certs.h"文件中、这需要大量内存、如下面的屏幕截图所示:

    您是否知道将这些证书移动到外部闪存中是否有充分的理由?  

    感谢您的宝贵建议。

    David

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

    我不熟悉 AWS 示例、因此我只能向您提供有关如何降低 RAM 利用率的常见建议。

    -是的,禁用库中的调试消息将节省少量宝贵的 RAM
    -在编译器中启用优化可减小代码大小
    -段的位置和栈大小可通过项目内的链接器文件(*。cmd 文件)进行配置。 有关堆栈要求的信息可以在 ROV 中为您提供堆栈峰值
    -将证书从 RAM 移动到 sFlash 也可以节省小片或 RAM。 我不确定您可以节省多少空间。 您需要尝试一下。
    -您应该检查代码中是否使用了一些较长的字符串。 将长串移到 sFlash 中可以节省一些内存。
    -您可以尝试优化 RTOS 配置(例如、使用极简的异常处理程序、减少.const 占用空间等)

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

    通过将.data 段移动到 SRAM0中并将堆大小从32KB 降低到24KB、解决了内存问题。

    在下面的符号中、我不确定关键字 HIGH 在括号中意味着什么、我是否还需要为.data 添加它?
    .data :> SRAM0
    堆栈 :> SRAM0 (高电平)

    我使用的 SRAM0小于12KB。 我是否可以将其大小减小到0x300、如下所示?
    存储器

    SRAM0 (Rwx):origin = 0x20000000,length = 0x3000
    SRAM (rwx):origin = 0x20004000,length = 0x00040000 - 0x3000


    CC3220S_LAUNCHXL_TIRTOS.cmd 文件是否是唯一必须进行上述更改的地方?

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

    尊敬的 David:

    -您应该使用不带 HIGH 指令的.data 段。

    -不 减小 ram0的长度不会解决任何问题。 RAM 被分成两个部分的原因– http://dev.ti.com/tirex/content/simplelink_cc32xx_sdk_2_10_00_04/docs/cc3220/CC3220_ROM_services.html (引导加载程序/用户应用–共享 MCU RAM)。

    -... BTW 如果您已设置此 TI-RTOS 配置、您还应检查:

    var m3Hwi = xdc.useModule('ti.sysbios.family.arm.m3.Hwi');
    m3Hwi.excHandlerFunc =空;
    
    var text = xdc.useModule('xdc.runtime.Text');
    text.isLoaded = false; 

    1月

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

    谢谢、设置正确。 您知道.cinit 的用途是什么吗? 从"Memory Allocation"视图中似乎不清楚。

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

    段.cinit 用于初始化的全局变量。 链接器部分的说明、您可以在此处找到 software-dl.ti.com/.../sdto_cgt_Linker-Command-File-Primer.html

    1月