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/TMS320F2.8377万S:节省RAM

Guru**** 2485865 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/618228/ccs-tms320f28377s-ram-saving

部件号:TMS320F2.8377万S

工具/软件:Code Composer Studio

您好,

客户正在使用F2.8377万S进行其应用。 编译后RAM的大小似乎不够。

在地图中,我们找到"0008b764   00000ec5400000ec5    interrupT.obj (ramfuns: retain)"和"0008cbee   0.0451万    interrupT.obj (ramfuncs)"。 interrupT.obj被保存两次。 有什么不同? 是否有保存ramfuns:Retain的方法?

另一个关于洞的问题。 是否有任何方法可以通过某种方式将这些孔用于应用或参数?

这是地图的一部分。

ramfuns  0.00088008亿      00005ce1    run ADDR =0000b000
                 8.8008万   000027da    PWM_Output.obj (ramfuncs)
                 0008a7e2   00000f82200000f82    control.obj (ramfuns)
                 0008b764   00000ec5400000ec5    interrupT.obj (ramfuncs:Retain)
                 0008c629   000005c56.29亿c5    ADCSample.obj (ramfuncs)
                 0008cbee   0.0451万    interrupT.obj (ramfuncs)
                 0008d03f   0.0001万ee    CAN_DRIVER.OBJ (ramfuncs)
                 0008d22d   0.0178万    SCI.obj (ramfuncs)
                 0008d3a5   0000011b50000011b    CAN_comm.obj (ramfuncs)
                 0008d4c0   00000106000000106    W25Q64_Flash.obj (ramfuncs)
                 0008d5c6   000000c4600万c4    BusProtTask.obj (ramfuncs)
                 0008d68a   0万c1    os_lib_2.8335万.lib:os_cpu_a.obj (ramfuncs)
                 0008d74b   0.0004万a    F2837xS_sysctrl.obj (ramfuncs)
                 0008d795   0000000479.5万00004    F2837xS_usDelay.obj0.0004万 F2837xS_usDelay.obj (2837 (ramfuncs)
                 0008d799   0000000179.9万00001    --0.0001万 --孔--[填充=0 ]
                 0008d79a   0.0259万    F021_API_F2837xD_FPU32.lib:FlashStateMachine.obj (.text:__Fapi_setupFlashStateMachine)
                 0008d9f3   0000019d30000019d                               :Program.obj (.text:_Fapi_issueProgrammingCommand)
                 0008db90   000000349万00034                               :0.0034万:Init.obj (.text:_Fapi_initializeAPI)
                 0008dbc4   0000002e40000002e                               :Utilities.obj (.text:_Fapi_calculateFletcherChecksum)
                 0008dbf2   0000002d20000002d                               :FlashStateMachine.obj (.text:__Fapi_issueFsmCommand)
                 0008dc1f   0.0002万c                               :Utilities.obj (.text:__Fapi_disedUnsignedLong)
                 0008dc4b   0.0025万                               :FlashStateMachine.obj (.text:_Fapi_setActiveFlashBank)
                 0008dc70   000000227万00022                               :0.0022万:FlashStateMachine.obj (.text:__Fapi_setupSectorsForWrite)
                 0008dc92   000000209.2万00020                               :0.002万:Async.obj (.text:_Fapi_issue3cCommandWithAddress)
                 0008dcb2   0000000d20000000d                               :Utilities.obj (.text:__Fapi_scaleCycleValues)
                 0008dcbf   0.0006万                               :FlashStateMachine.obj (.text:_Fapi_getFsmStatus)
                 0008dcc5   00000003500000003    --孔--[填充=0 ]
                 0008dcc8   0000000c80000000c                               :Init.obj (.ebss)[fill =0
                 0008dcd4   0000000b40000000b                               :Utilities.obj (.text:__Fapi_calculateOtpChecksum)
                 0008dcdf   0万a                               :FlashStateMachine.obj (.text:_Fapi_checkFsmForReady)

非常感谢。

Br,Jordan

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

    [引用user="Jordan Zhou攠]在地图中,我们找到"0008b764   00000ec5400000ec5    interrupT.obj (ramfuns:Retain)"和"0008cbee   0.0451万    interrupT.obj (ramfuncs)"。 interrupT.obj被保存两次。 有何不同?[/QUOT]

    这是一个使用一个对象文件中的两个输入部分的输出部分的情况。  这不是典型的情况。  但这没有什么问题。  要更好地理解这一点,请从 链接器命令文件入门一文中了解斜体术语

    Jordan ZHOY 说:
    是否有办法保存ramfuns:Retain?[/QUOT]

    我确信您需要此输入部分来正确执行系统。  所以,不

    Jordan Zhou 说:
    另一个关于洞的问题。

    我不知道为什么你有任何洞。  我对这个更好奇...

    [报价用户="Jordan Zhou "]          0008dcc8   0000000c80000000c                               :Init.obj (.ebss)[填充=0]

    一个文件中的.ebss部分是如何在ramfuncs输出部分结束的?  

    这里还有很多事情要做。  我不知道要了解它需要看什么。  但我认为从链接程序命令文件开始是有意义的。  请将链接器命令文件附加到下一篇文章中。  注意论坛只接受少数类型的文件作为附件。  因此,请将文件扩展名".txt"添加到该文件。  因此,您最终将发布一个名称类似2.8377万S_flash_lnk.cmd.txt的文件。

    谢谢,此致,

    -George

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

    George,

    关于问题“从地图中,我们找到“0008b764   00000ec5400000ec5    interrupT.obj (ramfuns:Retain)”和“0008cbee   0.0451万    interrupT.obj (ramfuncs)”。 interrupT.obj被保存两次",下面是cmd和代码结构。 孔问题在另一个项目中。

    在代码结构中,有 一个projecta,它包含 若干 个*.c文件,如A.c,B.c,C.C和D.C. 在每个*.c文件中,有几个函数。 有些在闪存中执行,有些 则复制 到RAM并在RAM中执行。 这些RAM函数由三个函数调用:中断,FUNCCB1和FCCC1。 这三个功能也在RAM中执行。

    所有RAM函数都定义为 "#pragma data_section(xxx, xxx)"。

    请告诉我是否有任何方法可以节省RAM。

    非常感谢。

    br,Jordane2e.ti.com/.../1663.cmd.txt  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    首先,通过查看程序的数据,您更有可能成功地保存RAM。 尤其要查找可以声明为"const"的全局变量或静态变量。

    可以通过在运行时覆盖某些函数来节省RAM空间;通过覆盖,您可以根据需要将函数从闪存复制到RAM。 缺点是,如果多次调用不同的叠加函数,则可以重复将其复制到RAM中,这可能比仅将其从闪存中运行慢。 这在很大程度上取决于您的计划结构。 此外,作为中断处理的一部分调用的任何函数都可能不是覆盖函数,因为在执行其他一些覆盖函数时可能会发生中断。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我想对链接程序命令文件中看到的内容进行评论...

    组
    {
    ramfuncs
    
    {-l F021_API_F2837xD_FPU32.lib}
    //Cla1Prog
    
    } 

    第5行中的代码使该库中的所有输入部分都位于ramfuncs输出部分中。  我怀疑你是否打算这样做。

    谢谢,此致,

    -George

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在客户的代码中,有一个只执行一次的Flash API库。 之后,可以将其移出RAM。 如何将其移出? 或者如何进行覆盖?
    非常感谢。
    Br,Jordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    George,
    我不理解。
    "从地图中,我们找到"0008b764 00000ec5400000ec5 interrupT.obj (ramfuns:Retain)"和"0008cbee 0.0451万. interrupT.obj (ramfuns)"。 interrupT.obj被保存两次"。 在中断内部,没有任何函数与"{-l F021_API_F2837xD_FPU32.lib}"相关。 它不是在那里被叫的。

    "这是一个使用一个对象文件中的两个输入部分的输出部分的情况",您能帮我识别两个输入部分吗?

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

    在客户的代码中,有一个只执行一次的Flash API库。 之后,可以将其移出RAM。 如何将其移出? 或者如何进行覆盖? [/引述]

    请参阅应用手册 “高级链接器技术”,以方便,高效地使用内存。  注意它如何使用联合,复制表和RTS函数COPY_In来实现覆盖。  它具有C6000系统的示例代码,因此您不能直接使用它。  但您可以根据C2000系统进行调整。

    谢谢,此致,

    -George

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

    Jordan ZHOY 说:
    "这是一个使用一个目标文件中的两个输入部分的输出部分的情况",您能帮我识别两个输入部分吗?[/QUOT]

    为了准确识别它们,我需要您的源代码。  我不会这样做,而是给你们举一个例子。  请考虑将这个有争议的C程序放在一个源文件中。

    /* file.c */
    
    int simple_function();
    
    #ifdef separate_sections
    #pragma code_section (main,".text:mmm")
    #endif
    int main()
    {
    返回simple_function();
    }
    
    
    #ifdef separate_sections
    #pragma code_section (simple_function,".text:sss")
    #endif
    int simple_function()
    {
    返回10;}
    

    假设我在定义预处理程序符号separate_sections的情况下生成该文件。  这意味着#pragma code_section行被忽略。  在映射文件中,对于输出部分.text,我看到来自此源文件的所有代码都有一个条目...

    0.0001万20 000000052万00005</s>0.0005万 file.obj (.text) 

    现在重新生成,但定义单独的书帖。  现在,#pragma code_sections行使每个函数都进入显示了名称的不同输入部分。  现在我在地图文件中看到了这个...

    0.0001万20 000000032万00003</s>0.0003万 file.obj (.text:mmm)
    0.0001万23 000000022.3万00002</s>0.0002万 rts2800_ml.lib:pre_init.obj (.text)
    0.0001万25 000000022.5万00002</s>0.0002万 file.obj (.text:sss) 

    这是一个文件的两个输入部分出现在一个输出部分的情况。  在这种特殊情况下,它们甚至在内存中分离,其中有一个来自RTS库的函数在它们之间。

    您的情况可能相似。

    谢谢,此致,

    -George

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

    George,

    关于这个洞,这里是客户提供的信息。

    在此附上了地图和命令。

    您是否会查看并向我们提供一些建议?

    非常感谢。

    Br,Jordan

    e2e.ti.com/.../CMD_5F00_Map.rar

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    像.ebss对象之间这样的孔通常是由以下两个因素之一引起的:1)对齐,或2)阻塞。 我怀疑是阻塞。 为了生成高效的DP相对寻址模式,编译器将强制链接器分配大于0x40的.ebss对象,以便它们从0x40字对齐的地址开始。 请参阅此博客文章,了解减少浪费空间的技术:
    e2e.ti.com/.../data-blocking-in-the-c2000-mcu-compiler-explained