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.

[参考译文] TMS570LS1114:引导加载程序和应用程序之间的 SPNA236异常处理

Guru**** 2398695 points
Other Parts Discussed in Thread: HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/649876/tms570ls1114-spna236-exception-handling-between-bootloader-and-application

器件型号:TMS570LS1114
主题中讨论的其他器件:HALCOGEN

我一直在查看 SPNA236以了解共享异常的方式、因此应用程序中的数据中止将转到应用程序代码 dabort 处理程序而不是引导加载程序。 我使用的是 wiki 上的 TMS570 Hercules MCU 引导加载程序。 是否可以获取有关如何使用此引导加载程序在 SPNA236中实现什么分级显示的示例文件?  

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

    我正在将您的帖子转发给 QJ、QJ 是比我更好的引导加载程序配置资源。 他应该很快回来。 很抱歉耽误您的时间或给您带来不便。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 James、

    要将异常路由到应用程序、应更改引导加载程序中的异常矢量:



    ;------------------------------------------------------------------
    ;中断例程的导入引用

    .ref _c_int00
    .ref _dabort
    .ref phantomInterrupt
    .def resetEntry

    ;------------------------------------------------------------------
    ;中断向量

    resetEntry
    b _c_int00
    UndefEntry
    b 未定义尝试 -->应用程序起始地址0x8;
    svcEntry
    b svcEntry -->应用程序起始地址0x8;
    PrefetchEntry
    B prefetchEntry -->应用程序起始地址0x8;
    b _dabort -->应用程序起始地址0x8;
    b 相位中断
    LDR PC、[PC、#-0x1b0]
    LDR PC、[PC、#-0x1b0]


    例如、如果应用程序起始地址为0x8000 (第三扇区)、则修改后的向量为:
    ;*********
    .sect ".intvecs"


    ;------------------------------------------------------------------
    ;中断例程的导入引用

    .ref _c_int00

    ;------------------------------------------------------------------
    ;中断向量

    b _c_int00 ;0x00
    b #0x7FF8 ;0x04;0x7FF8 = 0x8000-0x8;0x7FF8是应用程序起始地址
    b #0x7FF8 ;0x08、软件中断
    b #0x7FF8 ;0x0C,中止(预取)
    b #0x7FF8 ;0x10、中止(数据)
    保留尝试
    b 保留尝试 ;0x14
    LDR PC、[PC、#-0x1b0] ;0x18
    LDR PC、[PC、#-0x1b0] ;0x1C
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    如果在0x8000之后没有应用程序代码(使用示例)时在引导加载过程中遇到异常、会发生什么情况?

    目前、我的应用程序位于0x8000以外的位置。 b 指令的最长覆盖范围为0x7FFF、因此在我的情况下无法使用您概述的方法。 想法?

    我曾尝试在 SPNA236的 SRAM 方法中获得一些例外表、但还不幸运。 SPNA236中描述的最后一种方法有一个叫做 ramIntvecsCpyTbl 的变量、编译器找不到这个变量、这个变量未在项目中声明、并且我在 SPNA236提供的代码段中找不到任何位置。 已尝试更改从 sys_startup.c 的用户代码2段中删除 extern、该段绑定到 ramIntvecsCpyTbl、但 ramIntvecs 中的 RAM 表不会在 RAMVECTORS 段中结束。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 James、

    如果在引导加载过程中出现"reset、IRQ、FIQ"异常、代码将跳转至引导加载程序中定义的 ISR (c_int00、IRQ_ISR、Fiq_ISR)。 如果其他(dabort、pabort 等)、代码将会由于未定义 ISR 而中止。

    b (分支)指令最多可以达到32M 字节、因此使用 b 0x8000没有问题。

    异常向量的唯一位置是0x00、即主闪存的开始位置。 例如、如果发生任何 IRQ 中断、CPU 将执行0x18 (0x18 LDR PC、[PC、#-0x1b0])上的代码、然后跳转至中断 ISR (地址在[PC、#-0x1b0]中)。
    为什么要将异常矢量表放置在 SRAM 中?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你是对的。 我在反汇编时不够仔细、分支已正确转换、以跳转到基于0x20000的应用。 我在0x4、0x8和0xc 处查看 EA007FFE、出于某种原因、我认为它被限制在0x7FFF;不是直接想到那个。 不管怎样、当我进行更改时、您建议应用程序代码挂起、卡在 dabort 中、它现在将针对该代码转到正确的位置- 0x20010。 它卡在 dabort 或 sys_startup 中的 for (;;)循环中、在尝试调试 ESM 组3时在其中检查错误。

    我认为我需要在 SRAM 中执行 exc vec 表的一个原因是、在尝试启用 Halcogen 的自检时、如果我在应用代码中启用了 Halcogen CPU 自检、应用程序将挂起。 如果我在引导加载程序代码中放入启用了算法的 CPU 自检、则可以正常工作(没有挂起)。 Halcogen 为引导加载程序项目生成了 dabort 代码。 稍后、在体验 SafeTI 诊断库时、运行 L2L3Interconnect 测试会导致 dabort、但在单步执行代码时、它跳转到0x10、单步执行引导加载程序 Halcogen 生成的 dabort 代码、返回应用程序、然后返回到引导加载程序 dabort 代码。 看到它是通过引导加载程序 dabort 代码而不是应用程序 dabort 代码、我认为我可能需要在 SRAM 中实现或执行其他操作、因此当发生 dabort 时、它会转到应用程序代码 dabort 代码。 那么、这里是。

    我尝试从引导加载程序代码中执行所有 Halcogen 启用自检、但应用程序代码仍在 dabort 中挂起。 应用程序代码中的 dabort 代码是来自 SafeTI 诊断库示例的_excpt_vec_abort_data()代码。

    如果您有一些需要了解的事项建议、以了解它为什么会挂起、请告诉我。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    此问题不是由引导加载程序引起的、异常向量采用引导加载程序。 这是由应用本身引起的。 您需要通过对应用程序进行编程0x00并独立执行来对其进行调试。