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.

[参考译文] MSP432E401Y:无法调试/遍历引导加载程序代码。

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1084664/msp432e401y-unable-to-debug-traverse-through-the-bootloader-code

部件号:MSP432E401Y
《线程: UNIFLASH》中讨论的其他部件

我们使用 UART 启动加载程序代码示例跳转到应用程序,该应用程序闪存为0xC000。 我们可以跳转到0xC000处的应用程序,但问题是我们根本无法调试/演练 BL 代码。 同样需要支持。


代码使用 CCS 进行编译和加载,代码不从 ResetISR 启动。 因此,无法使用断点执行调试操作并遍历代码。 下面是加载 BL 代码后代码的屏幕截图。 选择为"XDS110调试探头"的.CCXML 文件,设备"MSP432E401Y"

注意:使用相同的配置,代码遍历在应用程序代码中完全正常。

但是,当目标配置文件.CCXML 使用“XDS 110 USB 调试器”并将设备设置为“TIVA TM4C129XNCPDT”时。 ->此配置允许程序执行进入重置 ISR。 但是,它会在执行 ProcessorInit 后进入自由运行(即,在 ProcessorInit 执行后无法立即进行步进)

设置/项目的详细信息
控制器:MSP432E401Y (定制板)

CCS 版本:10.4.0.00006

调试器:XDS110

Uniflash:刷新 application.hex 文件

注意:也在启动板上尝试过,问题与上述相同,完全无法浏览代码。

谢谢,
尼基塔

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

    您可以这样做,然后按 ENTER 键。 然后电脑将跳至0xc000

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

    实际上,我已经能够从 Bootloader 跳到完全正常的应用程序,即0xC000。  

    问题是能够逐步转移引导加载程序代码。

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

    很抱歉,我对你的描述有点困惑。

    1.调试时,MCU 是否包含 bootloader 代码和应用程序代码?

    2.要调试应用程序代码。 但是,当设备处于调试模式时,应用程序代码是通过 bootloader 下载的?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="372580" url="~/support/icles/arm-based 微处理器组/基于 ARM 的微控制器/f/arm-based 微控制器-forum/1084664/msp432e401y1-unable to debug-traver-thro-the-bootloader-code/4018480#4018480",我对您的描述有点困惑/不清楚。]

    没有问题。 请查看以下详细信息。 如果需要其他信息,请告诉我。

    [引用 userid="372580" url="~/support/iclers/arm-based-icroms-group/arm-based-icros/f/arm-based-icroms-forum-forum/1084664/msp432e401y-unable-to-debug-roce-the-bootloader-code/4018480#4018480"1]。 调试时,MCU 是否包含 bootloader 代码和应用程序代码?[/quot]

    是的,正确。

    [引用 userid="372580" url="~/support/iclers/arm-based-icroms-group/arm-based-icros/f/arm-based-icroms-forum-forum/1084664/msp432e401y-unable-to-debug-roce-the-bootloader-code/4018480#4018480"2] 2. 您要调试应用程序代码。 但是,当设备处于调试模式时,应用程序代码是通过 bootloader 下载的?[/quot]

    好的,所以我对可用的“BOOT_SERIAL_UART_FLASH”示例代码做了一些修改。  

    BL_startup_cs.s (因为现在我只想直接跳至应用程序@0xC000)

        ;;
        ;; See if an update should be performed.
        ;;
        .ref    CheckForceUpdate
        bl      CheckForceUpdate
        ;cbz     r0, CallApplication
        b		CallApplication

    bl_config.h

    #define APP_START_ADDRESS       0x0000C000

    通过上述两项更改,我编译了 bootloader 代码并将其加载到闪存@0x0000,同时应用程序也将闪存@0xC000。 这一切都很好,就像 BL 一样执行并直接跳到应用程序,我的应用程序继续运行。 当调试器未连接时,此操作将处于空闲运行状态。

    问题是,当我尝试使用调试器加载引导加载程序并尝试逐行逐行执行代码行时,它将在执行 ProcessorInit 后进入空闲运行(即,在 ProcessorInit 执行后无法立即执行)。 如果我暂停执行,我会得到“未定义符号”。

    但逻辑上,BL 启动并跳到应用程序。

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

    我不确定在使用调试器加载引导加载程序时是否擦除应用程序。

    我会建议:

    1.如果要单独调试应用程序,可以更改 CMD 文件,或使用 PC 跳转到应用程序入口。

    2.如果要在加载 bootloader 生成文件时调试应用程序,可以尝试加载应用程序生成文件以查看它是否可以工作。

    我只是尝试一下解决方案1,如果你想尝试解决方案2,你可以尝试一下。

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

    我使用了以太网引导加载程序,我认为这是类似的。 问题是引导加载程序将自身复制到 RAM,并从 RAM 中运行。 源代码认为它位于 RAM 中的执行地址,而不是闪存中的链接地址,因此,您必须使用一些技巧,直到找到调试器知道它所在的 RAM 中运行的代码。

    代码以 BL_STARTUAL_CCS.s (在项目的 CCS 文件夹中)开头。
    该文件包含指向 ResetISR 函数的矢量表。

    ResetISR: .asmfunc
    ;;
    ;; Enable the floating-point unit. This must be done here in case any
    ;; later C functions use floating point. Note that some toolchains will
    ;; use the FPU registers for general workspace even if no explicit floating
    ;; point data types are in use.
    ;;
    movw r0, #0xED88
    movt r0, #0xE000
    ldr r1, [r0]
    orr r1, r1, #0x00F00000
    str r1, [r0]
     
    ;;
    ;; Initialize the processor.
    ;;
    bl ProcessorInit

    如果启动调试器,它应在 ResetISR 处停止。 打开汇编程序调试窗口,您会看到如下内容:

    000032b0:   F64E5088            movw       r0, #0xed88
    000032b4:   F2CE0000            movt       r0, #0xe000
    000032b8:   6801                ldr        r1, [r0]
    000032ba:   F4410170            orr        r1, r1, #0xf00000
    000032be:   6001                str        r1, [r0]
    000032c0:   F7FFFFD8            bl         #0x3274
    000032c4:   F000FBA2            bl         #0x3a0c

    汇编程序中的单步, 进入 ProcessorInit 的5步

    然后,您应该看到如下内容:

    00003274:   2000                movs       r0, #0
    00003276:   2100                movs       r1, #0
    00003278:   F2C20100            movt       r1, #0x2000
    0000327c:   F85F2014            ldr.w      r2, [pc, #-0x14]
    00003280:   F8503B04            ldr        r3, [r0], #4
    00003284:   F8413B04            str        r3, [r1], #4
    00003288:   4291                cmp        r1, r2
    0000328a:   DBF9                blt        #0x3280
    0000328c:   2000                movs       r0, #0
    0000328e:   F85F2020            ldr.w      r2, [pc, #-0x20]
    00003292:   F8410B04            str        r0, [r1], #4
    00003296:   4291                cmp        r1, r2
    00003298:   DBFB                blt        #0x3292
    0000329a:   F64E5008            movw       r0, #0xed08
    0000329e:   F2CE0000            movt       r0, #0xe000
    000032a2:   2100                movs       r1, #0
    000032a4:   F2C20100            movt       r1, #0x2000
    000032a8:   6001                str        r1, [r0]
    000032aa:   F04E5E00            orr        r14, r14, #0x20000000
    000032ae:   4770                bx         r14

    该文件的来源位于同一文件中:

    ProcessorInit: .asmfunc
    ;;
    ;; Copy the code image from flash to SRAM.
    ;;
    movs r0, #0x0000
    movs r1, #0x0000
    movt r1, #0x2000
    ldr r2, bss_start
    copy_loop:
    ldr r3, [r0], #4
    str r3, [r1], #4
    cmp r1, r2
    blt copy_loop
     
    ;;
    ;; Zero fill the .bss section.
    ;;
    movs r0, #0x0000
    ldr r2, bss_end
    zero_loop:
    str r0, [r1], #4
    cmp r1, r2
    blt zero_loop
     
    ;;
    ;; Set the vector table pointer to the beginning of SRAM.
    ;;
    movw r0, #(0xE000ED08 & 0xffff)
    movt r0, #(0xE000ED08 >> 16)
    movs r1, #0x0000
    movt r1, #0x2000
    str r1, [r0]
     
    ;;
    ;; Set the return address to the code just copied into SRAM.
    ;;
    orr lr, lr, #0x20000000
     
    ;;
    ;; Return to the caller.
    ;;
    bx lr
    .endasmfunc

    最后一条线就是魔法发生的地方!

    Orr LR,LR,#0x20000000

    (看起来像 Orr     调试器中的 R14,r14,#0x20000000)

    正在将函数的返回地址修改为呼叫者的等效位置,但在 RAM 副本中,请运行到该行,然后执行单步操作并进入

    BX LR

    现在,我们刚刚接到 ProcessorInit 的电话,但在 RAM 中,源调试器似乎能够应对这一问题。

    我认为 UART 引导加载程序在启动时没有太大的区别-希望这能有所帮助。

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

    Jim,您好,谢谢您的回复。

    [引用 userid="500257" url="~/support/icros/arm-based 微处理器-组/基于 ARM 的微处理器/f/基于 ARM 的微控制器- forum/1084664/msp432e401y-无法调试-遍历引导加载程序代码/4025890#4025890 "]

    最后一条线就是魔法发生的地方!

    Orr LR,LR,#0x20000000

    (看起来像 Orr     调试器中的 R14,r14,#0x20000000)

    正在将函数的返回地址修改为呼叫者的等效位置,但在 RAM 副本中,请运行到该行,然后执行单步操作并进入

    BX LR

    现在,我们刚刚接到 ProcessorInit 的电话,但在 RAM 中,源调试器似乎能够应对这一问题。

    我认为 UART 引导加载程序在启动时没有太大的区别-希望这能有所帮助。

    [/引用]

    感谢您的解释。  我能够像你所建议的那样进入消息来源。