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.

[参考译文] TMS320F28069:从闪存运行时、从引导加载程序跳转至应用程序

Guru**** 2579115 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/978557/tms320f28069-jump-to-application-from-bootloader-when-running-from-flash

器件型号:TMS320F28069

大家好、

我缓慢地将一个定制 CAN 引导加载程序连接在一起、并一直处于以下设置状态:

1) 1)我将 GPIO 示例编程到闪存扇区 c 中、可以看到它在调试期间或重新启动后工作正常
2) 2)然后、我修改了 f28069_CAN_FLASH_kernel、使 LED 有一点闪烁、然后返回硬编码的入口点。 (我使用了 GPIO 示例映射中的_c_int00存储器位置)
3) 3)我修改 f28069_CAN_FLASH_kernel 的目标配置以不擦除闪存扇区。
4) 4)我使用 RAM 链接器文件刷写 f28069_CAN_FLASH_kernel、一切看起来都正常、引导加载程序闪烁、然后 GPIO 示例闪烁


当我尝试将 f28069_CAN_FLASH_kernel 移动到闪存 A 中、执行与将 GPIO 示例移动到闪存完全相同的步骤、即使用其他.cmd 文件并调用 initFlash 并执行一些 ramfuncs 操作时、就会出现问题。   

我观察到的是引导加载程序指示灯将按预期闪烁、但似乎只是挂起、当我能够看到正在执行什么指令时、它看起来就像卡在引导 ROM 中的某个位置。   

是否有关于进一步调试想法的提示?

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

    [引用用户="Robert Fleury">]我观察到引导加载程序指示灯将按预期闪烁、但似乎挂起了、我能够看到正在执行什么指令的时间、它看起来像卡在引导 ROM 中的某个位置。   [/报价]

    Robert、

    有几个想法需要考虑:

    • 看门狗已启动并将器件复位。  如果发生这种情况、器件应该已经经历了相同的引导序列、并且 LED 将再次闪烁、因此可能不是这样。  您可以使用示波器监视 RESET 引脚、以查看器件是否复位。  
    • 闪存内核、闪存内核使用的常量、或者闪存 API 回调函数、未被复制并且不能从 RAM 中获得。  如果 API 尝试修改闪存、则闪存中的任何内容将不再可供 CPU 用于运行 API。  这可能会导致一个 ITRAP。   如果您可以确定引导 ROM 中的哪个位置被卡住、以及它是否与 ITRAP 相对应。  您还可以尝试使用自己的 ITRAP 处理程序初始化 PIE 矢量表-可能在那里切换不同的 IO 或以不同的速率切换。  
    • 确保所有已初始化的段都从闪存中启动(然后从 RAM 运行)。 检查.map 文件中是否有直接加载到 RAM 中的已初始化段。  尝试在连接了调试器的情况下运行内核、以调试出错的地方。  关键是确保 CCS 不会将任何在下电上电后不会出现的内容加载到 RAM 中。  这可以通过下电上电并在重新连接后仅加载项目符号来实现。  

    此致

    Lori

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

    以下是我的最新更新:

    我有几乎相同的设置:(刷写(使用 JTAG)扇区 C 闪存上的闪烁光闪存应用并正确加载它、然后将(使用 JTAG)引导加载程序应用刷写到扇区 A、而不擦除其他闪存段)。

    调试时一切都正常、但当我切换启动模式时、会在 launchpad 上切换并重新连接电源、引导加载程序会指示灯闪烁、但随后会挂起。

    以下是我的观察结果、我需要帮助。

     如果我要排队"

           ((void (*)(void)) 0x3ec6c0)();

     在引导加载程序中的主函数结束时、所有内容都在复位后正常工作!   

    闪存应用程序的原始代码会将相同的地址返回到 ExitBoot 例程的其余部分。


    然后、我修改了退出引导例程、将所有内容都剪切掉、尝试使其尽可能类似于上述直接函数调用、如下所示:


    ExitBoot (_ExitBoot):
    按 ACC

    弹出 RPC

    LRETR



    复位后、它仍然不起作用、但在 JTAG 调试模式下工作。


    我怀疑在复位时没有调用 ExitBoot 例程、但我找不到正确的原因。  所有函数的地址都在闪存中。  我单步执行汇编代码、并确保所有指令地址都在闪存中。

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

    作为 InitBoot/ExitBoot 未被调用的进一步证据、我在 asm 函数中对 main 进行了多次调用、并且我不会看到它们在复位时执行、仅在调试中执行。

    这里是否缺少一些关键信息、以使这些 asm 函数在引导时运行?

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

    我在论坛上的某个位置看到-entry_point 链接器选项仅用于调试目的。  是这样吗?   

    如果我删除-entry_point 链接器选项。 我看到程序从未运行 exitboot/InitBoot 函数。

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

    我想这会导致我的下一个问题...

    InitBoot 和 Exitboot 函数的用途是什么?

    只用作已剥离的_c_init00?

    启动新应用程序之前是否需要清理 ExitBoot?  我觉得这些地方的垃圾一般还可以吗?

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

    [引用 user="Robert Fleury">我在论坛上的某个位置阅读到-entry_point 链接器选项仅用于调试目的。  是这样吗?   [/报价]

    是的、这是正确的。  当执行"重新启动"时、调试器将使用此选项强制 C28x 的程序计数器到达该位置。   通常、我们将示例中的-entry_point 指向应用程序的 codestart 符号。   

    "复位"将重置器件、然后从此处开始执行引导过程。  

     工具->调试器选项->自动运行和启动选项下有一些 Code Composer 选项可以更改行为。 如果您出于任何原因想单步执行引导 ROM、请取消选中自动运行选项。   

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

    [引用 user="Robert Fleury"] InitBoot 和 Exitboot 函数的作用是什么?

    源文件中有用于描述函数的注释。  对于 InitBoot、它设置复位后运行 C 代码所需的最小 CPU 运行模式标志。  设置一次后、您不必重新设置它们。  正如您所说的那样、它是一个被剥离的_c_init00

    对于 ExitBoot -想法是将寄存器恢复为其默认设置(C28x 的几个操作模式标志除外)。  在跳转到_c_init00之前、不应该真的需要它。  甚至取消堆栈分配、因为 _c_init00将重新初始化堆栈指针。  

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

    [引用 user="Robert Fleury"]调试时所有操作都正常,但当我切换启动模式时,启动器会在 launchpad 上切换并重新连接电源,启动器指示灯将闪烁,但随后会挂起。

    您提到了将引导模式从调试会话更改为独立会话。  您应该能够在调试期间使用相同的模式。  例如、

    • 设置引导 ROM 退出的断点
    • 重置设备并运行
    • 这将通过 SCI 加载内核、然后在 ROM 跳转到内核之前停止。   

    然后、您可以进入内核并查看缺少的内容。  

    -洛里