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:具有引导加载程序异常处理程序问题的 TMS570

Guru**** 2393325 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1409962/tms570lc4357-tms570-with-bootloader-exception-handler-question

器件型号:TMS570LC4357

工具与软件:

大家好、团队:

  

使用以太网引导加载程序时、应用程序的起始地址(LED_Blinky_RM57_AT_0x20020)设置为0x20020。 0x20020处的是 ARM 中断向量。 根据我的理解、当应用程序(LED_Blinky_RM57_AT_0x20020)正在运行时、如果发生异常、ARM 处理器默认应在起始位置0x0处执行中断矢量(这应该是引导加载程序中的代码)。 我的问题是:

  1. TMS570是否能够设定 CPU 寄存器来确保 ARM 能够在发生异常时在0x20020上执行?
  2. 如果无法将 ARM 异常设置为在0x20020的中断向量处执行、那么这些异常(如 undefEntry、svcEntry、prefetchEntry 和 DataEntry)在应用程序中是如何处理的?

这是 LED_Blinky_RM57_AT_0x20020:(HL_sys_link.cmd)中 HL_sys_link.cmd 内容的一部分

小程序

/*用户代码 begin (2)*/
/*用户代码结束*/
VECTORS (X): origin=0x00020020 length=0x00000020.
FLASH0 (RX):origin=0x00020040 length=(0x001FFFE0-0x20040)
FLASH1 (RX):origin=0x00200000 length=0x00200000
堆栈(RW):origin=0x08050000 length=0x00001500
RAM (RW):origin=0x08051500 length=(0x00080000-0x51500)

/*用户代码 begin (3)*/
/*用户代码结束*/
}

  

这是 LED_Blinky_RM57_AT_0x20020:中 HL_sys_intvecs.asm 的内容的一部分

.sect ".intvecs"
.arm

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

.ref _c_int00
.ref phantomInterrupt
.def resetEntry

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

resetEntry
b _c_int00
UndefEntry (取消定义启用)
B 未定义入口
svcEntry
b svcEntry
预取入口
B 预取入口
DataEntry
b 数据入口
B 远程中断
LDR PC、[PC、#-0x1b0]
LDR PC、[PC、#-0x1b0]

真诚地感谢您  

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

    尊敬的 Qing Yu:

    如果无法在0x20020的中断向量处设置要执行的 ARM 异常、那么如何在应用程序中处理诸如 undefEntry、svcEntry、prefetchEntry 和 DataEntry 之类的异常?

    不、它们不由应用程序处理。

    如果您希望您可以删除它们、但我建议您保留与"resetEntry"相关的例外。

    这是因为、

    如果您验证应用程序代码、在0x20040的闪存(矢量之后)开头位置由" muxInit"函数而不是"_c_int00"函数组成。

    我的意思是、如果您尝试直接调用"0x20040"地址、而不使用异常矢量表、则会调用"MuxInit"、我的意思是此函数不应该是起点、因为此函数不会调用应用的 main 函数、因此如果我们直接调用此函数、我们的代码将无法正常运行。

    此问题的解决方法有两种:

    1.我们至少应保留应用程序的复位矢量:

    这是最简单的方法、如果将来在"_c_int00"之前的函数中添加任何其他代码、也不会影响应用程序跳转。

    2.我们可以直接 从引导加载程序中调用_c_int00的地址、并可以删除应用程序中的矢量表、例如本例中的矢量表为0x23B28

    但我想如果我们这样做、那么、如果向"_c_int00"之前的任何函数添加的任何代码会更改此函数的起始地址、因此必须小心、并且需要验证"_c_int00"的地址、应该会在引导加载程序中使用相同的地址。

    ——

    谢谢、此致、
    Jagadish。