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.

[参考译文] TMS320F28379D:从闪存而不是从 RAM 运行时 ISR 溢出

Guru**** 2553450 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1325725/tms320f28379d-isr-overruns-when-ran-from-flash-instead-of-ram

器件型号:TMS320F28379D

您好!

我有一个在 ADC ISR 内部运行的代码(每20us 中断一次)。 从 RAM 运行时、闪存没有出现任何问题、而从闪存运行时会出现 ISR 溢出(ISR 内部的代码似乎花费了20us 以上)

我在 InitFlash ()函数中(在 SysCtrl.c 文件中)检查了等待状态配置。 对于200MHz 的 CPU 频率、即我们的工作 CPU 频率、将 RWAIT 位设置为0x3。 数据表还指出、200MHz 时钟的最小等待状态需要为0x3。

是否 可以对配置进行任何其他更改以使其不会导致 ISR 溢出?

谢谢。

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

    您好!

    由于美国度假、请预计2月20日前回复。

    谢谢。此致、

    辛奇塔

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

    Sanjay,

    您能否为 RAM 和闪存用例共享链接器(.cmd)文件?  我认为这将有助于缩小任何潜在问题的范围。

    此致!
    马修

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

    e2e.ti.com/.../RAM-linker.txt

    e2e.ti.com/.../Flash-linker.txt

    Matthew 和

    我已经附加了 RAM 和闪存链接器文件、我尝试使用这些文件运行代码。

    从闪存运行时、我的代码中有以下代码行:

    在声明中:

    extern unsigned int RamfuncsLoadStart;
    extern unsigned int RamfuncsLoadEnd;
    extern unsigned int RamfuncsRunStart;
    extern void InitFlash(void);

    而在 void main()中,在调用 InitSysCtrl()后,我得到以下命令:

    memcpy(&RamfuncsRunStart,&RamfuncsLoadStart,&RamfuncsLoadEnd-&RamfuncsLoadStart);
    InitFlash();

    (我无法上传.cmd 文件、因此我将它们复制到记事本上、很抱歉回复混乱!)

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

    Sanjay,

    您能否查看定义 InitFlash ()函数的文件(对我来说、这在 F2837xD_SYSCTRL.c 中)、并确保在顶部附近看到以下命令行

    #ifndef __cplusplus
        #ifdef __TI_COMPILER_VERSION__
            #if __TI_COMPILER_VERSION__ >= 15009000
                #pragma CODE_SECTION(InitFlash, ".TI.ramfunc");
                #pragma CODE_SECTION(FlashOff, ".TI.ramfunc");
            #else
                #pragma CODE_SECTION(InitFlash, "ramfuncs");
                #pragma CODE_SECTION(FlashOff, "ramfuncs");
            #endif
        #endif
    #endif

    这就是告诉链接器 InitFlashI()被放置在您所做的 RAM 段中的信息。

    由于我们也在处理 ADC ISR 时序、您还需要将 ADC_ISR 函数添加到上述 CODE_SECTION pragma 中、这样这些 pragma 也会加载到闪存中、但会从 RAM 运行。

    让我们看看上面的选项是否有帮助、我们可以从那里开始、

    此致!

    马修

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

    Matthew 和

    是的、sysctrl.c 文件中包含几行是您共享的。

    关于将 ADC_ISR 函数添加到 CODE_SECTION pragma 中、

    应该这样做吗?

    #pragma CODE_SECTION(adc_isr, ".TI.ramfunc");

    谢谢。

    桑贾伊

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

    是的、应该只有函数名称。   

    您是否也可以发送(或 C/P)为每个构建生成的.map 文件的内容?  它将与.out 文件位于同一目录或一个 dir up。  它只是一个显示所有内存分配位置的纯文本文件。

    此致!

    马修

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

    /cfs-file/__key/communityserver-discussions-components-files/171/modifiedlinker.txt

    /cfs-file/__key/communityserver-discussions-components-files/171/5584.MAP-file.txt

    Matthew 和

    我将 ADC_ISR 函数添加到 CODE_SECTION pragma 中。 最初我收到一个错误、但我能够通过将 RAMLS0设置为整个代码适用的一个连续存储器来解决这个问题、而且构建它没有任何问题。

    我附上了用于此构建的.map 文件、以及我使用的修改后的闪存连接器文件。

    此外、我在开始时设置一个 GPIO、并在 ADC_ISR 函数结束时将其清除、以查看需要多长时间、与之前退出 ISR 的情况相比、该时间在20us 以内。 感谢您的帮助!

    有没有其他方法可以进一步优化这一点?

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

    Sanjay,

    我还没有看过文件,但一些想法减少时间:

    1)优化级别;右键单击.pjt ,然后选择底部的"属性"。  此时将出现一个新对话框、请转至 Buiild->C2000 Compiler -> Optimization。  我们通常建议 OPT 级别2/全局优化。  您可以尝试不同的滑块选项以实现速度/大小之间的折衷、但我们通常从2开始(这应该是默认设置)。  更改并应用后、您需要重新构建项目以实现改进。

    1a)您还会注意到浮点模式下拉列表。  如果 ISR (或只是代码)中有浮点运算、则可以将此设置为"relaxed"、它将使用一些优化的硬件/软件例程来提高速度。  区别在于、"宽松"模式没有严格遵守浮点运算的 ANSI C 要求。  您可以在 https://www.ti.com/lit/spry288上阅读有关此内容的更多信息、 

    2)代码调试检查。  默认情况下、如果传递了一些无效选项、则会在驱动程序中检查是否有正确的参数和错误处理程序。  如果代码运行正常、可以删除这些内容(通常在发布之前完成)。  在我们打开的同一个对话窗口中、转至仍在 C2000编译器下的"Predefined symbols"。  从此列表中删除调试预定义、然后重新编译。  您应该注意到这里也有一些改进。

    让我们来看一下映射、有时程序执行和数据存储之间存在内存冲突、这也会减慢工作速度。

    此致!

    马修

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

    Matthew 和

    谢谢您的建议。 我已经将它们纳入了我的代码中。 您是否发现地图有任何问题?

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

    Sanjay,

    我相信事情现在看起来不错、似乎没有任何存储器冲突会因仲裁而使事情缓慢进行。  最后一点、我看到 RAMGS0和 RAMGS1被定义两次、

    SHARERAMGS0:> RAMGS0、PAGE = 1
    SHARERAMGS1 :> RAMGS1 ,页面= 1
    ramgs0:> RAMGS0,页面= 1
    ramgs1:> RAMGS1、page = 1

    你可以检查主代码、看看它们是否被引用用于运行时使用(如缓冲区)、只是想确保我们没有使用两次具有不同名称的代码。  我想这会出现在地图上,我在第一次通过时没有看到这些范围内的任何东西,但我想我会提到它。

    此致!

    马修

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

    Matthew 和

    感谢所有的帮助!