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/TMS320C6418:C6418第二个引导加载程序_c_int00

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/748278/ccs-tms320c6418-c6418-second-bootloader-_c_int00

器件型号:TMS320C6418

工具/软件:Code Composer Studio

您好!

我为 定制板开发了第二个引导加载程序。 目标 C6418、CCS5.2和应用程序是非 BIOS 应用程序。  它没有充分发挥作用。 我将二进制文件存储到闪存中、CS1、8位。 我看到  在引导时正确复制了第一个1k 映像 、然后我能够确认 boot.asm 例程正确地将应用程序映像从外部闪存复制到片上 RAM 中 (为了进行调试、我在 boot.asm 代码的末尾添加了一个无限循环、并使用调试器加载了符号、最后通过存储器查看器、我能够在 ram 0x400处看到正确复制的应用程序映像字节)。 问题似乎 出在_c_int00调用上、事实上、一旦.asm 例程结束且 c_int00被调用、就不 会发生其他情况。  我不理解 的是、如果我执行以下操作、我会看到该应用程序正常工作:

1) 1)将目标与仿真器连接;
2) 2) 使用 code composer 菜单 Run->ResetCpu 重置 CPU

3) 3)让应用程序运行(F8)

为什么如果我连接了仿真器、并且只需执行 CPU 复位命令、然后执行运行命令、我会看到应用程序从闪存正确加载并执行、但如果我打开电路板(没有仿真器) 、它不起作用? 它是否与链接器配置有关? 我已确保 在电路板启动时未显示硬件错误。 我甚至向 boot.asm 例程添加了一个长延迟(30秒)、以确保与启动群集相关的内容会影响引导加载程序。

我看到我的目标(C6418)的_c_int00 由 rst6400.lib 管理、 查看映射文件、我看到它位于地址0x1864。 我在"常规"项目属性上的"运行时支持库"中的项目属性上链接了 rts6400库。

我使用了以下命令:

MyApp.out

-b.

--图像

--map MyApp.map

--entrypoint _c_int00

--零

ROM

 ROM1:org = 0x000000000、len = 0x001C00、romwidth=8、memwidth=8
 
 文件={MyApp.bin}

您对如何理解这一点有什么建议吗?

"加载符号"实际上是调试启动时发生的情况的最佳方法吗?

由于我看到它在一个中工作、我将目标与仿真器(加载符号)连接、因此与 典型的引导序列相比、这个设置有何差异?

谢谢你

此致

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

    听起来闪存中缺少一些东西、需要这些东西。 当您通过仿真器进行连接时、CCS 可能会为您将其加载到 RAM 中。

    您能否提供有关您的应用的更多详细信息? 启动代码中会发生什么情况? 尝试弄清楚某些时钟是否未初始化。

    此外、您能否确保在 CCS Build > Linker 下添加了 rst6400.lib?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    此外、您可以尝试在 c_int00设置硬件断点、并单步执行代码以查看问题的位置。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sahin、感谢您的支持。
    如何在 c_int00设置硬件断点?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在 CCS 中、查看>断点>右键单击断点窗口>断点>硬件断点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Sahin、感谢您的支持。
    启动代码以汇编方式编写、并将应用代码从外部闪存复制到片上 RAM 中。 此时的应用只是一个用于调试的 GPIO 引脚切换。

    今天、在我进行调试时、我看到了一些不同的东西、我在这里的步骤中进行了介绍:
    1) 1)打开我的板;
    2) 2)连接仿真器后、我通过单击"Launch Selected Configuration"启动配置
    3) 3)连接目标

    此时、我打开了存储器查看器、在存储器地址0x00处、我的所有0xFF 0xFF...

    然后:
    4) 4)通过 CCS 执行"复位 CPU"命令
    5) 5)打开内存查看器

    在地址0x00、我现在看到从外部 EEPROM 正确复制的第一个1k 代码。
    这是否意味着在上电时出现问题?

    在复位后立即按照步骤1)-> 2)-> 3)检查存储器状态是否正确?


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

    连接到目标时、是否有正在运行的 GEL 文件? 如果是、它可能会配置引导加载程序中缺少的内容、例如 PLL。

    有关 GEL 文件的更多信息、请参阅此文档 :processors.wiki.ti.com/.../Debugging_Boot_Issues

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

    我已仔细检查、 但不包含 GEL 文件。 我甚至在 CCS 上打开了一个完全不同的项目 、因此我可以 确保代码没有从仿真器中更新、并且 我始终看到 我之前描述的内容。 在我看来、在  代码启动之前、了解一种方法来确定复位后 RAM 内容是什么真的很有帮助。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我建议遵循 Sahin 提到的这个 wiki 页面上的一些建议:

    processors.wiki.ti.com/.../Debugging_Boot_Issues

    该 wiki 页面是专门使用 C6418等器件编写的。 例如、您是否曾尝试在汇编引导加载程序的开头插入旋转循环? 这将允许您执行以下操作:

    1.打开设备电源,连接并验证是否加载了代码。 如果正确加载了第一级引导加载程序、则 CPU 应在代码开始时旋转。
    2.您可以越过自旋环路并单步执行代码以查看正在发生的情况。

    例如、如果一开始就有这样的循环:

    零 B1
    _myloop:[!B1] B _myloop

    要正常退出循环、只需打开一个寄存器窗口并将寄存器 B1更改为非零值、例如1。 现在、您可以单步执行该循环、看看发生了什么。 如果您需要源代码调试而不是反汇编视图、请确保您执行"加载符号"(而不是"加载程序")。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    感谢您的支持、非常感谢!

    如果我加电然后连接、我会在存储器浏览器中看到、在地址0x00处没有加载第一级引导加载程序(所有0xFF 0xFF ..)

    这是 CCS 在为电路板加电后、即在连接目标之后的情况。

    然后、我按如下方式执行复位 CPU:

    在 CPU 复位后、我看到第一个引导加载程序正确加载在地址0x00、正如您在"Memory Browser"窗口中看到的:

    请注意:这是我写入外部闪存的第一个引导加载程序。 作为第二项测试、我尝试从闪存中擦除引导加载程序的二进制映像、如果我执行相同的步骤、我将不再看到第一个引导加载程序加载在地址0x00。 然后、我假设我看到的实际上是在引导时在地址0x00复制的第一个引导加载程序。

    此时、如果我运行应用程序(只需按 F8)、我会看到引导加载程序执行正确。

    这是否意味着在启动时会发生一些硬件故障?

    如果我想在复位后检查地址0x00处的存储器状态、我使用的方法是否正确?

    我更愿意在硬件团队参与之前对此进行肯定。

    谢谢你

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好!
    您的复位序列和引导模式选择引脚是什么、如何驱动它们? 我是指外部逻辑、CPLD 或类似器件。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    你好,拉格奇,
    我刚刚解决了这个问题、我即将向大家介绍最新信息。
    DSP 复位由 FPGA 驱动:我们需要为该 DSP 复位添加延迟。 DSP 复位基本上与 FPGA 复位同步。 闪存访问由 FPGA 使用多路复用器进行管理。 发生的情况是、DSP 正在执行他的任务、但 FPGA 在启动时尚未准备就绪!!
    顺便说一下、解决了! 现在它可以工作了!! 感谢大家的支持! 我通过您的提示和建议学到了很多!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、卡尔斯、

    感谢您的更新。 很棒的发现,感谢让我们知道!

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

    Brad、您好!
    如果应用程序是 DSP-BIOS 应用程序、第二个引导加载程序的 boot.asm 例程可以相同?
    一旦 boot.asm 将二进制映像复制到 onchip ram 中、是否必须针对非 BIOS 应用调用_c_int00?

    我指的是 boot.asm 末尾、其中这些代码被执行:

       ;调用_c_int00
       mvkl .S2 _c_int00、B0
       mvkh .S2 _c_int00、B0
       b   .S2 B0
       NOP  5.    



    谢谢你
    此致

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

    BIOS 的步骤相同。

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

    谢谢 Brad、

    我有最后一个问题。

    我需要按如下方式在片上 RAM 中创建2个存储器部分:


    BIOS.MEM.create ("BOOTMEM");
    bios.MEM.instance("BOOTMEM").base = 0x00000000;
    bios.MEM.instance("BOOTMEM").len = 0x00005000;
    bios.MEM.instance("BOOTMEM").space ="保留";

    bios.MEM.instance("IRAM").base = 0x00005000;
    bios.MEM.instance("IRAM").len = 0x0007b000;

    DSP-BIOS 应用项目通过存储器配置工具进行配置 、以便 完全 链接 到 IRAM 部分(原点0x5000、长度7b000)。

    由于在我的 DSP-BIOS 应用程序中根本不使用 BOOTMEM、我希望在 BOOTMEM 地址范围 0x00000000 -> 0x00005000中不会放置任何内容。

    但是、通过查看编译后生成的.map 文件、我可以看到:

            名称           源       长度           使用            未使用     的属性        填充
    ------------  ----         ------         ----             ----        --------         
     BOOTMEM       00000000  00005000     00000000    00005000 RWIX
     APPBOOT        00005000  00000400     00000030    000003d0 RWIX
     IRAM                00005400  0007af00      0000ea2    0006c45e  RWIX
     SDRAM            80000000  08000000     0006fd18     07f902e8   RWIX


    部分分配映射

     输出                                 属性/
    段  页   原点        长度          输入段
    ----    --------           ------          --------
    vers     0      00000000   00000040    复制段
                          00000000   00000040    TildeEvoAPPcfg.obj (.vers)

    引导加载  0   00005000   00000020     
                          00005000   00000020    boot.obj (bootload)

    (笑声)

    我注意到.vers 部分:为什么在地址0分配它?

    谢谢你

    此致

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    因为它是一个复制段,所以不会加载到目标中。 它与以下项目类似:

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