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.

[参考译文] TMS320F28384S:将连接管理器(CM) RTS 库函数复制到 RAM

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1292789/tms320f28384s-copy-connectivity-manager-cm-rts-library-functions-to-ram

器件型号:TMS320F28384S
主题中讨论的其他器件:C2000WARE

大家好、我将在 Cortex 内核(CM)上开发一个应用。

我需要复制到.TI.ramfuncs、以下 RTS 库函数__aeabi_Dsub ()、__aeabi_dadd ()、__aeabi_d2uiz ()、__aeabi_f2d ()、__aeabi_ui2d ()。

我需要找到 rtsv7M4_T_le_v4SPD16_eabi.lib 的目标文件、其中定义了上述函数、以便将相应的.text 输入段从闪存复制到 RAM。

由于存储器空间的原因、我无法复制整个 RTS 库。

谢谢!
卡洛

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

    您好、Carlo。

    您能否看一下以下示例、并告诉我这是否有助于回答您的问题?

    C2000Ware_5_00_00_00\driverlib\f2838x\examples\C28x\flash\flash_ex3_flash_to_ram

    此致、

    阿米尔·奥马尔

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

    您好、Omer:
    这个示例非常简单、对我没有帮助。

    无论如何、我找到了我正在寻找的 RTS 库对象模块、更好地分析了.map 文件。

    很幸运、我还没有解决我的问题。
    在擦除/写入操作期间、出现硬故障异常、可能是因为正在运行的系统节拍调用的某些其他函数仍在闪存中。

    如何调查此问题?
    我怎样才能知道硬故障的原因?

    谢谢!
    卡洛

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此示例非常简单,对我没有帮助。

    很抱歉、如果我不能正确理解您的问题、我想您在寻找一个示例、展示如何将函数加载到闪存中、然后从 RAM 运行。

    在擦除/写入操作期间、出现硬故障异常、可能是因为正在运行的系统节拍调用的某些其他函数仍在闪存中。

    如何调查此问题?
    我怎样才能知道硬故障的原因?

    [/报价]

    是否有可能让您逐步执行代码以确定硬故障发生在何处/发生在什么确切指令上? 您能否显示该消息的屏幕截图、以及"Disassembly"针对该故障显示程序运行的代码?

    如果问题是您所说的、并且正在被擦除的函数被从其他位置调用、那么解决方案就是将该函数从您正在擦除的特定闪存组中移出。

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

    您好、Omer:
    在闪存擦除/写入操作期间、在 RAM 中运行的系统节拍执行以下宏时、问题出现。

     

     

    您可以看到所有__aeabi_xxx()双精度函数都是从 RAM 运行的。

    那么、可能是在闪存擦除/写入操作期间发生了崩溃、因为有一些从_aeabi_xxx ()函数调用的其他嵌套函数仍然在闪存中运行?

    我试着寻找一个替代的解决方案、通过把 F 后缀添加到宏所使用的浮点常量内、把它们转换成单精度值。

    在这种情况下,宏分解以这种方式变化,并且__aeabi_xxx()双精度函数不再存在:

     

     

     

    无论如何、在本例中、我有另一种问题。
    现在、宏命令被执行时、硬故障就会生成、不仅仅是在闪存擦除/写入操作期间。
    尤其是执行 vmov 指令时崩溃特定错误。

    太糟糕了...

    谢谢!
    卡洛

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    所以,可能是我在闪存擦除/写入操作期间发生崩溃,因为还有一些其他嵌套函数(从__aeabi_xxx()调用)仍在闪存中运行?

    正确、如果有任何函数被调用到正在进行编程/擦除的闪存组中、那么您将遇到问题。 您始终可以在"Memory Browser"和"Disassembly"视图(输入适当的存储器位置)中查看闪存组的内容。

    我试着寻找一个替代的解决方案、通过把 F 后缀添加到宏所使用的浮点常量内、把它们转换成单精度值。

    在这种情况下,宏分解以这种方式发生变化,并且__aeabi_xxx()双精度函数不再存在。

    [/报价]

    您在工程属性中设置了什么 FPU 配置? 虽然我相信启用了双精度后仍然可以使用单精度、但必须使用相同的 FPU 配置编译添加的所有库。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您在项目属性中设置了什么 FPU 配置? 虽然我相信启用双精度后仍然可以使用单精度、但所有添加的库都必须使用相同的 FPU 配置进行编译。

    我使用以下配置:

    关于该库、我在中使用 libc.a 来自动包含适当的运行时库、在本例中为 rtsv7M4_T_le_v4SPD16_eabi.lib。

    谢谢!
    卡洛

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

    我不太熟悉这个 FPU 选项、因为它看起来是 CM 所独有的。 如果您已经确认在闪存库被编程/擦除时没有调用任何函数、请告诉我、因为这可能需要咨询另一位专家。

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

    您好、Omer:

    除了分析.map 文件以确保已将所有函数复制到 RAM 之外、我没有其他方法。
    我唯一确定的是、如果我在闪存/擦除操作期间禁用中断、就不会出现硬件故障。
    唯一启用的中断为系统节拍。
    因此、我猜周期调用堆栈中有一些东西会访问闪存存储体。
    在反汇编过程中、我找不到 仍在闪存中的函数。

    我真的不知道如何摆脱这个麻烦...

    谢谢!
    卡洛

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我没有其他方法来分析.map 文件,以确保我已将所有函数复制到 RAM。

    您是通过调试得到故障的、对吗? 您可以通过转到 View > Disassembly ("视图">"反汇编")打开"Disassembly"视图(之前已向我显示了该视图的屏幕截图)。 如果您不确定函数的地址、可以将其输入到"Expressions"窗口中。 您是否还能向我展示您在遇到硬故障时看到的实际消息? 我不确定您之前附上的屏幕截图中是否显示了该内容。

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

    您好、Omer:
    我不知道你打算用真实的信息做什么。

    这是发生硬故障时处理器的状态:

     

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是发生硬故障时处理器的状态

    谢谢、有关所命中 ISR 的屏幕截图非常有用。 您可以看看返回程序计数器(RPC)吗? 这应该会显示程序最初执行的位置、从而可能显示导致故障的正在使用的函数/指令。

    唯一可以确定的是,如果我在闪存/擦除操作期间禁用中断,我就不会出现硬件故障。
    唯一启用的中断为系统节拍。
    因此我想周期调用堆栈中有一些东西可以访问闪存存储体

    基于此、我同意在被编程/擦除的闪存组中使用具有系统节拍的东西(该功能或它使用的任何功能/代码)。 如果在没有中断的情况下程序运行良好、那么其中一个中断可能包含正在使用该闪存组中的代码。

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

    您好、Omer:
    我找不到 RPC 寄存器、但返回地址应由链接寄存器(LR)指示。

    模式0xFFFFFFF 表示它是异常处理程序的返回值、而最后1表示它是处理程序模式(而不是线程模式)的返回值。 似乎 faultISR()是从另一个异常(SysTick?)调用的。

    此外,分析调用 faultISR()时的调用堆栈, PC 加载了0xFFFFFFF0 ,这再次提示从另一个异常中调用 faultISR()。

    最后、通过分析 CFSR (可配置故障状态寄存器)、我可以看到:
    -位 PRECISERR 和 BFARVALID A 置位,表示错误地址存储在 BFAR (总线故障地址寄存器)中
    -位 STKERR 被置位、表明在异常入口处发生了衍生总线故障。

    BFAR 寄存器中存储的地址是0x1FFFBFF8、比堆栈基址低8个字节。

    可能是 某件事已经出错了,而没有出现 SysTick 异常吗?
    我不知道、 我对 Cortex 架构的了解仍然非常有限。

    谢谢!
    卡洛

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

    您好、Carlo。

    感谢您的跟进、但您发现问题的位置是否正确? 提到问题的地址是故障的位置。

    对于原因、看起来可能有人试图访问的范围比总线可以处理的范围大(或小)。

    此致、

    文斯

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

    您好 Vince、
    是的、看起来是这样的。

    错误行为的原因 仍然未知、无论如何、我似乎可以通过在擦除/写入操作期间禁用中断来解决该问题。

    因此、即使该问题未得到解决、也可以将其视为已解决。

    感谢 Omer 和 Vince 的支持。

    此致、
    卡洛