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-SRAM:将 SCI 中断模式更改为 FIQ、并将 FIQ 和 EP 矢量表复制到 SRAM。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1659800/tms570lc4357-ep-change-the-sci-interrupt-mode-to-fiq-and-copy-the-fiq-and-irq-vector-tables-to-sram

器件型号: TMS570LC4357-TMS570LC4357 EP

尊敬的 TI 团队:

我实现了串行端口中断驱动的接收并从该串行端口重新发送数据。 当应用程序位于地址 0 并且串行端口中断处于 IRQ 或 FIQ 模式时、一切正常工作。 但是、无论串行端口中断模式如何、当应用程序位于扇区 10 时、调用_enable_interrupt__() 函数都会导致程序崩溃、因为串行端口不传输 0xAA55。

这是因为 FIQ 固定在地址 0x0000001C、当调用_enable_interrupt__() 函数时、程序会跳回地址 0x0000001C、该地址没有内容、从而导致异常?

image.png

image.png

如果我的上述假设正确、会将 FIQ 和 IRQ 重定向到应用内的 SRAM 来解决此问题吗?

实际上、我已经按照 spna263 文档中的说明尝试了执行此操作、但它不起作用。

我会附上代码。 您能看一下问题出在哪里吗? 谢谢你。

TMS_09_GNSS_SCI_FIQ_TEST.rar 

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

    嗨、Shuo、

    我将验证您的代码、

    在平均时间、您可以验证下面的线程一次、我在这里解释并分享了在另一家银行(例如银行–7)执行代码的示例:

    (+) TMS570LS1227:对 Dataload 软件使用 TMS570LS1227 闪存 BANK7 — 基于 Arm 的微控制器论坛 — 基于 Arm 的微控制器 — TI E2E 支持论坛

    --
    此致、
    Jagadish。

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

    尊敬的 gundavarapu:

    我想补充一些我最近发现的信息。

    1. 跳转到地址 0 的程序

    resetEntry
            bl   _mpuInit_
            mov r0, #0x0000       ; low 16-bit
    		movt r0, #0x0008       ; High 16-bit
            bx	r0
    undefEntry
            b   undefEntry
    svcEntry
            b   svcEntry
    prefetchEntry
            b   prefetchEntry
    dataEntry
            b   dataEntry

    2. 应用程序位于扇区  0. 应用验证串行端口中断是 IRQ 的情况

    2.1 调用函数_coreEnableIrqVicOffset_();和_enable_IRQ_INTERRUPT_();

    此时串行端口正常工作、但调试表明程序直到`irqEntry`点时不会执行。

    2.2 仅调用_enable_irq_interrupt_();函数;不要调用_coreEnableIrqVicOffset_();

    此时串行端口正常工作、调试表明程序经常执行到`irqEntry`点。

    3. 应用程序位于扇区  0. 应用验证串行端口中断是 FIQ 的情况

    由于_EnablecoreFiqVicOffset_();函数缺失、因此仅调用_enable_interrupt__();函数。 此时、串行端口正常工作、但调试表明程序经常执行到 FiqEntry 点。

    4. 该应用程序位于扇区 10。  应用程序验证串行端口中断是否为 IRQ 的情况

    4.1 调用函数_coreEnableIrqVicOffset_();和_enable_IRQ_INTERRUPT_();

    此时、串行端口工作正常。

    4.2Do不调用函数_coreEnableIrqVicOffset_();只调用函数_enable_IRQ_INTERRUPT_()

    此时、串行端口无法正常工作。

    5. 该应用程序位于扇区 10。  应用程序验证串行端口中断是否为 FIQ 的情况

    此时、只需调用_enable_interrupt__();函数就会导致程序崩溃。

    6、 结论

    6.1 配置为 IRQ 的串行端口在扇区 10 中正常工作、因为当发生中断时、程序在调用_coreEnableIrqVicOffset_();函数时不会跳转到 0x00000018。 我想问这个功能的目的是什么。

    6.2 串行端口设置为 FIQ 的中断模式在扇区 10 中无法正常工作、因为当启用 FIQ 中断时、程序会跳转到地址 0x0000001C、该地址为空、从而导致异常。

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

    下面介绍了当我将矢量表加载到 SRAM 时的测试过程和观察到的现象。

    1.定义 sect

    2.链接文件

    3.复制

    4.调试问题

    发生中断时、它仍跳转到 0x0000001C。 我缺少什么吗?

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

    嗨、Shuo、

    对延迟的回复表示歉意!

    我了解问题的根本原因!

    以下是说明:

    • TMS570 Hercules 器件上的异常矢量表 固定在地址 0x00000000 处
    • 与 Cortex-M3/M4(具有用于重定位的 vtable 寄存器)不同、Cortex-R4/R5 不提供基于硬件的矢量表重定位

    因此、当链接器 cmd 文件如下时:

    您可以看到地址 0x00000000 处没有正确的矢量表、但如果控制器复位、内核将始终期望矢量表位于 0x00000000。 这就是它崩溃的原因。

    您可以使用以下方法来避免此问题:

    如上所示、只需尝试在闪存的开头保留矢量表、并且可以将剩余代码保留在任何不重要的位置。 因此、只有矢量表(本例中的 0x40 大小应位于闪存的起始位置)。 现在您可以在右闪存开始时看到有效的跳转指令、因此每当发生热复位或 POR 复位时、内核都会正确跳转到 init 函数、并正确执行而不会发生任何崩溃。

    我在完成上述修改后进行了测试、工作正常、没有任何问题;以下是相同的代码供您参考:

    e2e.ti.com/.../TMS_5F00_09_5F00_GNSS_5F00_SCI_5F00_FIQ_5F00_TEST.zip

    以下是执行上述建议修改后的测试结果:

    --
    此致、
    Jagadish。

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

    嗨、gundavarapu

    我明白您的意思。

    实际上、我将加载器放置在地址 0 并配置了 fiqEntry、即使应用的矢量在 0x00080000 定义、程序仍然可以正常运行。

    加载程序如下所示:

    但是、我计划在地址 0 处仅实现基本跳转功能、如下所示:

    加载程序存储在 OTP 中、应用程序存储在另一个扇区中。 我希望 OTP 程序和应用程序共享矢量表。 如何实现这一点? 这必须在不更改地址 0 处的程序的情况下完成。

    我引用的帖子应该已经实施,但我认为我可能错过了一些东西。

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

    嗨、Shuo、

    加载程序存储在 OTP 中、应用程序存储在另一扇区中。 我希望 OTP 程序和应用程序共享矢量表。 如何实现这一点? [/报价]

    根据我的理解、您无需单独执行任何操作即可共享它们将共享的矢量表。

    例如、如果引导加载程序或应用程序上发生任何 DATA_ABORT、则代码将跳转到异常表的以下位置:

    同样适用于其他例外条目。 因此、执行测试只需将异常矢量表保留为 0x0、如果您有任何其他问题、请告诉我。

    --
    此致、
    Jagadish。