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.

[参考译文] TMS570LC4357:PC 相对读取时的数据中止

Guru**** 2478765 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/986383/tms570lc4357-data-abort-on-pc-relative-read

器件型号:TMS570LC4357

我们已经看到数据中止发生。

当 CPU 从内存读取指针时、似乎总是会发生。

LD Rn、[PC、#IMM]

LD Rn、[Rn]

(笑声)

IMM: DC32地址

当第一条指令执行时、数据中止在访问"IMM"变量时发生

在一种情况下、这是在子例程中。
此代码被多次调用。

在两个位置、它会生成数据中止、但仅在以全速运行时才会生成数据中止。
如果我单步执行代码、则不会发生数据中止。

在其他地方、我没有看到该错误。

我们使用参数覆盖模块、并将前64KB 重新映射到 SRAM 以允许闪存编程(这是一个引导加载程序)

显示此问题的第一个子例程、在 POM 被启用后也许运行20条指令。

第二个子例程在 POM 被禁用后可能会运行20秒。

===

我在另一个地方看到了这个问题。

这是在对 F021库的调用返回后进行的。

然后、我将通过指针检查状态、代码具有相同的模式。

在这种情况下、全速执行和单步执行都将导致数据中止。

在这种情况下、POM 被启用、CPU 应该在前64KB 内执行、但是 POM 将这个映射到内部 SRAM。

我找到了一个权变措施、即创建一个我跳转到的__ramfunc 子例程。 那么我不会得到中止。

===

我们发现问题的第三个地方根本不使用 POM。

引导加载程序启动应用程序时、会将参数传递给应用程序
指示上电复位。 然后、应用程序将 S/W 复位置为有效、该复位将被置为有效
将 CPU 返回到引导加载程序、该加载程序不会执行完全初始化。
在调用应用程序之前、只初始化堆栈和通用寄存器
同样、现在将 S/W 复位作为参数传递、应用程序开始实际执行。

应用程序从未接触 POM。

数据中止现在发生在 SVC 中。 此服务将 CPU 设置为系统模式。 PSR.M[4:;0}= 0x1F。

这必然会执行很多次、但在1小时后会发生数据中止。

我们非常感谢您对这一个问题的看法!

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

    您好、Ulf、

    刚刚看到您的帖子、我明天会检查它。 对延迟回复表示歉意。

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

    您好 Ulf、

    POM 模块被设计用于开发期间、您可以将其视为一个调试模块。

    对于 SVC 异常、您是否从您的应用程序调用了 SVC? 引导加载程序如何将参数传递到应用程序映像?   

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

    引导加载程序启动并检查复位原因。
    如果 power_ON_RESET、它将运行初始化。
    它检查一个引脚(GPB_BM)、如果这个引脚未被置为有效、引导加载程序会尝试启动一个应用。
    将检查应用程序标头、如果魔术词正常且 CRC 检查成功
    应用程序入口点从报头读取:
      /*检查标题*/
       vectors=app->vectors;
       application=vectors->reset_handler;
       (*应用)(POWER_ON_RESET);

    应用程序会检查参数、如果 POWER_ON_RESET、则会发出 SW_RESET。
    引导加载程序会检查复位原因、因为它是 SW_RESET、所以会在不初始化芯片的情况下调用应用程序。
       (*应用)(SW_RESET);

    应用程序现在将以最低初始化运行、这意味着自检将完成。

    请注意、此处从未初始化 POM。
    如果 GPB_BM 引脚被置为有效、引导加载程序会将自身复制到 SRAM、
    启用 POM 并运行引导加载程序 CLI。
    当准备好启动应用程序时、将退出引导加载程序 CLI、并禁用 POM。

    ===

    应用程序执行 SVC 来访问操作系统功能。 在这种情况下、SVC 会将模式设置为系统模式。
    实现此功能的方式是在引导加载程序中实现 SVC 处理程序。
    引导加载程序会检查应用程序头位置中的一个神奇字。
    如果魔术字检查成功、引导加载程序会假定存在有效的应用程序。
    在标头后面是一个异常表(H/W 不使用、H/W 使用引导加载程序异常表)
    应用程序异常表有8个条目、SVC 条目被载入程序计数器。
    之后、CPU 在应用 SVC 处理程序中执行。

    Cortex-R5支持将异常矢量表重映射到另一个位置、
    但 TI 选择在那里放置外设、因此这是无用的。
    这个位置的地址是芯片设计的一个参数、所以有可能将它放置在别处。
    如果进行过修订、则最好进行修复。

    无论如何、正常路径中的任何位置都不会启用 POM。

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

    感谢 Ulf 的详细描述。 正确的做法是、Hercules 器件不支持将异常向量重新定位到其他位置。 引导加载程序和应用程序都使用位于开始闪存的异常向量。  

    如果引导加载程序不使用 SVC、您可以修改应用程序的 SVC 分支地址。  

    如果引导加载程序和应用程序都使用 SVC、引导加载程序异常向量需要跳转到引导加载程序中 SVC 执行器的地址(而不是函数名称)、则 SVC 执行器将决定跳转位置(引导加载程序或应用程序)。 老实说、我以前没有尝试过这种方法。