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.

[参考译文] TMS570LS0714:如何了解 cmd 文件并使用 CAN_Bootloader 处理应用中断

Guru**** 2465890 points
Other Parts Discussed in Thread: TMS570LS0714

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/661938/tms570ls0714-how-to-understand-the-cmd-file-and-handle-application-interrupt-with-can_bootloader

器件型号:TMS570LS0714

大家好、

我的客户正在 TMS570LS0714平台上开发 CAN_bootloader、他们尝试将应用矢量表重新映射到0x20000、并按照此链接中的说明进行操作:

但他们对如何 理解 cmd 配置以及如何使用引导加载程序处理应用程序中断有一些疑问。

1.为什么引导加载程序中的中断矢量表 是"应用程序起始地址- 0x08""-0x08"代表什么?  

2. 为什么 SVC、中止(预取)、中止(数据)的地址与“应用程序起始地址- 0x08”相同 

在其应用 sys_intvecs.asm 中、代码如下所示、与 引导加载程序中的中断矢量表相比有何差异?

.sect ".intvecs"
ARM

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

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

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

resetEntry
b _c_int00
undefEntry
b undefEntry
svcEntry
b svcEntry
预取 Entry
B prefetchEntry
b _dabort
b 相位中断
LDR PC、[PC、#-0x1b0]
LDR PC、[PC、#-0x1b0]


;------------------------------------------------------------------

4.  说:“注意代码“switch (getResetSource()....” hL_sys_startup.c 文件中。

当代码从引导加载程序跳转到应用程序时、在引导加载程序中清除复位源、不会执行中断矢量初始化和其他函数、因此无法进入应用程序中断。

如果未修改此位置,则会遇到此问题。"

因此、客户希望了解如何修改文件以避免此问题。  

5. 在重新映射中断矢量表并在应用程序代码中运行 FIQ 和 IRQ 中断时,是否需要修改和注意任何内容?

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

    我将向我们的引导加载程序专家提出您的问题。 他很快就会回来。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    尊敬的 David:

    Cortex-R4预取操作会使 PC 在当前指令之前提前2个字(0x08字节)、因此我们需要减8来获得正确的地址。
    2.当 MCU 有 UNDEF INT 时、它将在0x04 (PC=0x04 + 0x08)执行指令、但 ISR 在0x20000 + 0x04 (应用中)、所以代码需要跳转到0x20000 + 0x04。 偏移量为(0x20000+0x04 -PC)= 0x20000-0x08
    将使用引导加载程序中定义的 undef、prefech、daboart 和 SVC 的 ISR。 如果要使用应用程序映像中定义的 ISR、则需要使用公式:(应用程序起始地址- 0x08)作为偏移量。
    4.您需要修改代码以在引导加载程序中不清除 SYSESR (我稍后将为您提供一个示例)
    5.未对 FIQ 和 IRQ 进行修改
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 QJ、
    感谢您的回答和解释。
    该示例如何? 谢谢。

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

    尊敬的 David:

    启动时、代码读取系统寄存器 SYSESR 以检查复位源。 如果发生新的复位,则不会自动清除之前的复位源状态位,而 getResetSource()函数会清除在读取该寄存器后设置的标志。 如果要为应用保留这些标志、则需要注释掉用于清除标志的语句:

    SYS_EXception = 0x0000FFFFU;

    SYS_EXception =(UINT32) EXT_RESET;

    SYS_EXception =(UINT32) CPU1_RESET;

    SYS_EXception =(UINT32) CPU0_RESET;

    SYS_EXception =(uint32) sw_reset;

    (笑声)