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.

[参考译文] RTOS/TMS320F2.8069万M:从RAM运行的代码的性能评估与从闪存复制到RAM的代码的性能评估

Guru**** 2558250 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/633836/rtos-tms320f28069m-performance-evaluation-of-code-running-from-ram-vs-code-copied-from-flash-to-ram

部件号:TMS320F2.8069万M

工具/软件:TI-RTOS

尊敬的T.I.论坛关注者:

  最近,我一直在努力将在RAM上运行的代码转移到在F2.8069万M上运行闪存的独立应用程序,更好的说,我有一个应用程序在RAM上运行完全正常,然后为了刷新它,我使用了-- ramfunc属性,用于在操作开始时将整个应用程序从闪存复制到RAM。 在你们的帮助下 ,我取得了成功,现在我有一个从闪存运行的代码,但我现在面临的问题是,我的代码在闪存后的性能与RAM不相同,而RAM在我的应用程序中非常关键, 我的意思是,RAM上的应用程序与100 % 响应一致,但闪存中的应用程序(开始时复制到RAM)与几乎一致的85 % 一起工作。 我在main()的开头使用了initFlash()函数,它提高了很多性能,但性能仍然不相同。

我现在想知道这一问题的原因是什么,我知道闪存有一些等待时间,它的速度不像RAM那样快,但我一开始就在处理RAM中的整个应用程序,那么还有什么可能是问题的原因呢?

为了帮助您解决问题,我附上了使用链接程序命令文件生成的.map文件以及链接程序命令文件本身。  

提前感谢

米拉德

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

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我建议您改为附加.zip文件,因为并非每个人都可以打开.rar文件

    我假设您的软件体系结构基本上是后台代码和中断。 并且您希望您的中断尽可能快地执行。 还需要放置从中断调用的所有函数。 这包括C运行时支持库中包含的数学函数。

    我发现,如果打开编译器选项“将每个函数放在单独的子部分”(在项目首选项/构建/编译器/高级选项/运行时模型选项下),会更容易。 然后,您可以轻松查看每个功能的位置
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢Mitja的回复,我尝试了您的方法,但首先我收到了如下警告:

    另外,我在生成的.map文件中看不到任何区别。因此,我在哪里可以看到:“您还需要放置从中断调用的所有函数。 这包括C运行时支持库中包含的数学函数。"?

    提前感谢

    米拉德

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

    我不知道为什么你会得到这一警告。

    以下是我的.map文件的摘录:

    文本     0.01万   0001000万   0000.1073万     
                     0.01万00   000001510万00151    F2806X_ADC.OBJ0.0151万 F2806X_ADC.OBJ (2806 (.text:_AdcConversion)
                     0.108万e   0.0002万b    F2806X_ADC.OBJ (.text:_InitAdc)
                     0.0108万39   000000293.9万00029    F2806x_sysctrl.obj0.0029万 F2806x_sysctrl.obj (2806 (.text:_InitSysCtrl)
                     0.0109万d3   00000021300000021    main.obj (.text:_main)
                     0.001万a8e   0.0001万e    rts2800_fpu32.lib:memcpy.obj (.text)
                     0.001万b35   000000193.5万00019    rts2800_fpu32.lib0.0019万 rts2800_fpu32.lib:2800:args_main.obj (.text)
                     0.001万b4e   0.0019万                      :exit.obj (.text)
                     0.011万27   000000092.7万00009    rts2800_fpu32.lib0.0009万 rts2800_fpu32.lib:2800:_lock.obj (.text)
                     0.011万30   000000083万00008    F2806x_CodeStartBranch.obj0.0008万 F2806x_CodeStartBranch.obj (2806 (.text)
                     0.011万38   000000083.8万00008    F2806x_sysctrl.obj0.0008万 F2806x_sysctrl.obj (2806 (.text:_DisableDog)
                     0.011万70   000000037万00003    F2806X_DBGIER0.0003万 F2806X_DBGIER.2806.obj (.text)

    ramfuncs  0.011万   0001107.4万   0000.0648万     
                     0.011万74   000000197.4万00019    rts2800_fpu32_fast0.0019万 rts2800_fpu32_fast补充2800补充.lib:DIF32.OBJ (.text)
                     0.1108万d   0.0034万                                      :SIN_F32.OBJ (.TEXT)
                     0.011万c1   0000002a10000002a    rts2800_fpu32.lib:l_div.obj (.text)
                     0.0116万b8   00000004800000004    F2806x_usDelay.obj (ramfuncs)

    如您所见,我将浮点正弦和除法函数重新定位到ramfuncs部分。

    这是.cmd的摘录,它执行以下操作:

       .text:>       P_FD,          PAGE = 0,ALIGN (4)

       ramfuncs:      {
                           rts2800_fpu32_fast_supply.lib<atan2_F32.obj>(.text)
                           rts2800_fpu32_fast_supply.lib<div_F32.obj>(.text)
                           rts2800_fpu32_fast_supply.lib<cos_F32.obj>(.text)
                           rts2800_fpu32_fast_supply.lib<sin_F32.obj>(.text)
                           rts2800_fpu32_fast补充.lib<sqrt_F32.obj>(.text)
                           rts2800_fpu32.lib<l_div.obj>(.text)
                           *(ramfuns)
                           *(.ti.ramfunc)
                           *(IQmath)
                       }
                       负载= P_FF,
                       Run = P_L78,
                       load_start(_RamfuncsLoadStart),
                       load_size (_RamfuncsLoadSize),
                       load_end (_RamfuncsLoadEnd),
                       run_start(_RamfuncsRunStart),
                       Run_Size (_RamfuncsRunSize),
                       Run_End(_RamfuncsRunEnd),
                       页面= 0,对齐(4)

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

    感谢 Mitja的提示,实际上我用自己的方式解决了我的问题,正如您之前提到的,我意识到“rts2800_fpu32.lib: fs_div.obj (.text)"仍保留在闪存中,因此我使用以下技术将其移至RAM,所有问题都消失了,现在我可以说,闪存和RAM之间的性能似乎非常接近。 (我将这些步骤留给其他人,我是100 % ,我确信他们迟早会遇到相同的问题)

    因此,首先修改CMD文件的方式如下:

    然后,在.map文件中的以下内容中,您可以看到不同之处:

    在 ramfuncs部分添加"rts2800_fpu32.lib<fs_div.obj>(.text)"之前:  

    之后:

    因此,您可以看到,在修改.cmd文件后,从.text部分(从Flash运行)中的特定库被移动到ramfuns (将被复制到RAM)。 我还附上了.cmd文件,供那些想要查看并可能需要使用内部想法的人使用。

    再次感谢。

    e2e.ti.com/.../CMD.txt

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    很高兴您能够解决问题,感谢您发布详细的解决方案。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我真的建议不要使用--ramfunc。 使用它可以将链接程序设置从.cmd文件和.c文件中移动,如果有makefile或CCS项目设置,则应该将其移动到makefile中。

    唯一的用途是在构建库时