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.

[参考译文] CCS/LAUNCHXL2-TMS57012:为引导加载程序测试分配闪存后、我无法在应用程序代码中使用中断

Guru**** 2589280 points
Other Parts Discussed in Thread: TMS570LS1227, TMS570LS1224, HALCOGEN

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/780280/ccs-launchxl2-tms57012-after-distributing-flash-for-bootloader-test-i-am-not-able-to-use-interrupt-in-application-code

器件型号:LAUNCHXL2-TMS57012
主题中讨论的其他器件:TMS570LS1227TMS570LS1224HALCOGEN

工具/软件:Code Composer Studio

您好!

我目前正在为 TMS570LS1224开发基于 CAN 的引导加载程序。 是的、有一 个基于 CAN 的示例、但它是针对 TMS570LS1227 MCU 而设计的。 因此、我更喜欢  通过引用该示例自己开发一个。

现在、我使用了两个不同的项目、 通过   在 链接器 cmd 文件(sys_link.cmd)和中断矢量文件(sys_intvecs.asm)中进行更改、我能够在闪存存储器中放置这两个具有不同位置的代码。 在调试这些项目后、我能够  正确地从第一个测试引导加载程序代码跳转到另一个测试应用程序代码。  

接下来我要做 的是在应用代码中使用基于 RTI 的中断并重新调试代码、并测试引导加载程序代码是否正确跳转到未发生的应用代码。

问题是引导加载程序运行正常、但此后不会跳转到应用程序代码。

我已经附上了这两个项目、请查看。

我尝试更改引导加载程序 CAN 示例中给定的引导加载程序项目参数的中断矢量文件(sys_intvecs.asm)。

从以下 位置完成的更改:

b _c_int00
UndefEntry
b 未定义尝试
svcEntry
b svcEntry
PrefetchEntry
B prefetchEntry
b _dabort
b 相位中断
LDR PC、[PC、#-0x1b0]
LDR PC、[PC、#-0x1b0]

更改为

b _c_int00;0x00
b #0x1FFF8;0x04
b #0x1FFF8;0x08、软件中断
b #0x1FFF8;0x0C、中止(预取)
b #0x1FFF8;0x10、中止(数据)
保留尝试
b reservedEntry;0x14
LDR PC、[PC、#-0x1b0];0x18
LDR PC、[PC、#-0x1b0];0x1C

其中、0x1FFF8 =跳转地址(即0x20000)- 0x08

这会导致代码进入某种错误循环、其中 launchpad 上的 ERR LED 会开启全时、程序不可调试。

我认为中断矢量文件 (sys_intvecs.asm)中可能会有一些不同的更改。 但我无法获取任何与中断矢量文件相关的文档。

我尝试阅读以下参考手册和文档:

 1、spnu118u

2.链接器 cmd 文件入门。

 spnu515c

请帮助我解决问题、并提供参考文档、以帮助我编辑中断矢量文件 (sys_intvecs.asm)。

e2e.ti.com/.../8883.Projects.zip

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

    请更改应用项目的 cmd 文件中的内存映射。 我刚刚检查了代码、您的引导加载程序和应用程序使用相同的 cmd 文件和相同的中断矢量表:

    1.在引导加载程序和应用程序的 cmd 文件中定义的存储器映射:
    存储器

    引导程序(X):origin=0x00000000 length=0x00000020
    FLASH0 (RX):origin=0x00000020 length=0x0013FFE0
    堆栈(RW):origin=0x08000000 length=0x00001500
    RAM (RW):origin=0x08001500 length=0x0002EB00

    /*用户代码开始(2)*/
    /*用户代码结束*/


    请更改引导程序的起始地址和应用程序的 FLASH0 (从示例中的0x20000开始)

    2.中断向量表。 两个项目使用相同的设置:

    ; resetEntry
    b _c_int00
    UndefEntry
    b 未定义尝试
    svcEntry
    b svcEntry
    PrefetchEntry
    B prefetchEntry
    b _dabort
    b 相位中断
    LDR PC、[PC、#-0x1b0]
    LDR PC、[PC、#-0x1b0]

    如果您在引导加载程序代码中注释掉跳转指令、您是否会遇到任何错误?
    如果您将应用程序代码编程到 sector0的开头(使用默认 cmd 文件)、是否存在任何错误?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    抱歉、"Application Int"项目通过 Halcogen 生成代码、并更改了在链接器文件和中断矢量表中所做的更改、其中替换为 Halcogen 生成的代码。
    您可以清楚地看到、两个项目的中断矢量表不使用相同的设置。 差异是
    在应用程序项目中:
    resetEntry
    b _c_int00
    UndefEntry
    b 未定义尝试
    svcEntry
    b svcEntry
    PrefetchEntry
    B prefetchEntry
    b _dabort
    b 相位中断
    LDR PC、[PC、#-0x1b0]
    LDR PC、[PC、#-0x1b0]

    在引导加载程序项目中:
    ; resetEntry
    b _c_int00
    UndefEntry
    b 未定义尝试
    svcEntry
    b svcEntry
    PrefetchEntry
    B prefetchEntry
    b _dabort
    b 相位中断
    LDR PC、[PC、#-0x1b0]
    LDR PC、[PC、#-0x1b0]

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

    我已使基于中断的应用程序代码正常运行。 此外、该程序正在正确地从引导加载程序跳转到基于中断的应用程序。

    根据您的建议、通过更改应用程序链接器文件来解决此问题。

    我已附上编辑过的项目、请查看。

    我还有另一个问题、如下所示、

     我将用于引导加载程序的中断矢量文件为:

    ; resetEntry
       b _c_int00
        UndefEntry
        b 未定义尝试
    svcEntry
        b svcEntry
    PrefetchEntry
        B prefetchEntry
        b _dabort
        b 相位中断
        LDR PC、[PC、#-0x1b0]
        LDR PC、[PC、#-0x1b0]

    基于 CAN 的引导加载程序示例使用:[还附加了基于 CAN 的示例。]

        b _c_int00;0x00
        b #0x1FFF8;0x04
        b #0x1FFF8;0x08、软件中断
        b #0x1FFF8;0x0C、中止(预取)
        b #0x1FFF8;0x10、中止(数据)
    保留尝试
        b reservedEntry;0x14
        LDR PC、[PC、#-0x1b0];0x18
        LDR PC、[PC、#-0x1b0];0x1C

    有什么区别? 我如何理解每条线在做什么?

    此外、您还没有提供任何可帮助我编辑中断矢量文件 (sys_intvecs.asm)的参考文档。

    请向我提供相同的信息。

    e2e.ti.com/.../2781.Edited-Projects.rar

    e2e.ti.com/.../6403.SafetyMCU_5F00_Bootloader.zip

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

    中断矢量表中有8个条目。 每个条目指向相应的中断服务例程:例如、地址0x08处的条目指向在引导加载程序和您的应用程序中定义的 SW 中断处理程序。

    当一个 SW 中断发生时、CPU 将读取0x08上的处理程序地址、然后跳转到指向应用中的 SW 中断处理程序的0x20008。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    哪一行表示正在发生"跳转至0x20008、该跳转至应用程序中的 SW 中断处理程序"。
    那么、#0x1FFF8代表什么以及为什么它必须是[(应用程序起始地址)- 0x08]。
    svcEntry、prefetchEntry、phantomInterrupt、_dabort 表示什么,reservedEntry 表示什么。
    它们是与文件相关的许多此类问题。

    因此、请向我提供一些与中断服务例程文件相关的文档、其中将包含所有详细信息。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这是引导加载程序的异常向量:
    b _c_int00;0x00
    b #0x1FFF8;0x04
    b #0x1FFF8;0x08、软件中断
    b #0x1FFF8;0x0C、中止(预取)
    b #0x1FFF8;0x10、中止(数据)
    保留尝试
    b reservedEntry;0x14
    LDR PC、[PC、#-0x1b0];0x18
    LDR PC、[PC、#-0x1b0];0x1C

    在 CPU 接收到 SW 中断后、CPU 分支到0x08。 ARM 使用流水线来提高指令流向处理器的速度。 PC 指向正在获取的指令、而不是指向正在执行的指令。 对于 ARM Cortex-R 器件、程序计数器(PC)始终将两条指令指针指向当前已执行指令以外的位置。 在本例中、PC 等于0x08+0x08。

    b #0x1FFF8

    分支指令(b 或 BL)的偏移量是通过计算分支指令和目标地址减8 (以允许流水线)之间的差值计算得出的。
    偏移量= 0x2008-0x08-0x08=0x1FFF8

    这就是为什么我说要在应用中执行软件 ISR 需要跳转到0x2008的原因。

    ARM Cortex-R 支持7种例外情况:
    1.复位 矢量基址的偏移量为:0x00
    2.未定义的指令 矢量基址的偏移量为:0x04
    3.软件中断 矢量基址的偏移量为:0x08
    4.预取中止 矢量基址的偏移量为:0x0C
    5.数据中止 矢量基址的偏移量为:0x10
    6. IRQ 矢量基址的偏移量为:0x18
    七、FIQ 相对于矢量基址的偏移为:0xIC

    有关详细信息、请参阅 ARM Cortex-R4 TRM 的第3章:
    infocenter.arm.com/.../DDI0363G_cortex_r4_r1p4_trm.pdf