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.

[参考译文] TMDSLCDK6748:新 CCS 工程中的程序挂起

Guru**** 2578945 points
Other Parts Discussed in Thread: TMDSLCDK6748

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/626281/tmdslcdk6748-program-from-new-ccs-project-hangs

器件型号:TMDSLCDK6748
Thread 中讨论的其他器件: OMAPL138

你(们)好

我已经使用以下简单程序在 CCS 中创建了一个新项目:

int main (void)
{
int i;
int j = 0;

对于(I = 0;I < 1000000;I++)
{
J++;
}

返回0;
} 

一段时间后、程序挂起(似乎处于随机点)、当调试器挂起时、它会显示:

"0xc3d38e84"没有可用源

但该地址是 DDR2、而链接器命令文件指定共享 RAM。 主函数具有地址0x80000ee0、该地址位于共享 RAM 中、正如预期的那样。 我已成功使用现有 RTSC、但我想拥有 CCS 工程。

发生什么事了? 我忘记了什么吗?

我使用以下硬件和软件:

TMDSLCKD6748

XDS100v2 JTAG 14引脚

CCS 版本:7.2.0.00013

我已随附 CCS project-files.e2e.ti.com/.../1222.TryDspL2RAM.zip

此致

广告

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

    我已通知软件团队。 他们的反馈将在此处发布。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我检查了映射文件、0xc3d38e84中没有代码或数据段。 您能否在返回0处设置断点并查看代码是否到达该点。

    是否确定错误不是由主程序完成后的错误由 EXIT/ABORT 函数传输到该 PC 位置。
    在代码执行结束时添加 printf 还有助于指示程序是否运行到完成、我认为确实如此。

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

    您好、Rahul、

    感谢您的提示。 我以前已经尝试过这种方法、但现在我再次应用了您建议的更改:我已将程序更改为:

    #include 
    
    int main (void)
    {
    int i;
    int j = 0;
    
    对于(I = 0;I < 1000000;I++)
    {
    J++;
    printf ("j =%d\n"、j);
    }
    
    printf ("结束:j =%d\n"、j);
    
    返回0;
    }
    

    这是输出:

    [C674x_0] j = 1
    j = 2
    
    ……
    
    J = 159
    j = 160
    

    我省略了两者之间的行、但"j = 160"是最后一行。 我运行了4次、每次最后一次打印的数字 j 不同:160、99、151和137。

    然后调试器被暂停并在0xc3d38384处停止、这是汇编语言:

    c3d38e10:00000000 NOP
    c3d38e14:00000000 NOP
    c3d38e18:00000000 NOP
    c3d38e1c:00000000 NOP
    c3d38e20:013C62E6 LDW/D2T2 *+SP[3]、B2
    c3d38e24:023C22E4 LDW/D2T1 *+SP[1]、A4
    c3d38e28:023C42E6 LDW/D2T2 *+SP[2]、B4
    c3d38e2c:01BC92E6 LDW/D2T2 *+SP[4]、B3
    c3d38e30:00000000 NOP
    c3d38e34:00080362 B.S2. b2
    c3d38e38:00008000 NOP 5
    c3d38e3c:00000000 NOP
    c3d38e40:001018F3 或.d2x 0、A4、B0
    c3d38e44:0001C228 || MVK.S1 0x0384、A0
    c3d38e48:0061EBE9 MVKH.S1 0xc3d70000、A0
    c3d38e4c:000C0362 || B.S2. B3
    c3d38e50:37800266 [!B0] LDW/D1T2 *+A0[0]、SP
    c3d38e54:30000276 [!B0] STW/D1T2 b0、*+A0[0]
    c3d38e58:00004000 NOP 3
    c3d38e5c:00000000 NOP
    c3d38e60:01900264 LDW/D1T1 *+A4[0]、A3
    c3d38e64:008C6362 BNOP.S2 b3、3
    c3d38e68:018FE058 SUB.L1 a3、1、a3
    c3d38e6c:01900274 STW/D1T1 A3、*+A4[0]
    c3d38e70:00000000 NOP
    c3d38e74:00000000 NOP
    c3d38e78:00000000 NOP
    c3d38e7c:00000000 NOP
    c3d38e80:00000000 NOP
    c3d38e84:0001A120 BNOP.S1 0xC3D38E84 (PC+4 = 0xc3d38e84)、5
    c3d38e88:00000000 NOP
    c3d38e8c:00000000 NOP
    c3d38e90:00000000 NOP
    c3d38e94:00000000 NOP
    c3d38e98:00000000 NOP
    c3d38e9c:00000000 NOP
    c3d38ea0:31F7 STW/D2T2 b3、*b15-[2]
    c3d38ea2:0627 || MVK.L2 0、B4
    c3d38ea4:1FFFB813 || CallP.S2 0xC3D38C60 (PC-576 = 0xc3d38c60)、B3
    c3d38ea8:0726 || MVK.L1 0、A6
    c3d38eaa:71F7 LDW/D2T2 *+B15[2]、B3
    c3d38eac:0626 MVK.L1 0、A4
    c3d38eae:4C6E NOP 3
    c3d38eb0:008CA362 BNOP.S2 b3、5
    c3d38eb4:00000000 NOP
    c3d38eb8:00000000 NOP
    c3d38ebc:E1A00003 fphead N、L、W、BU、nobr>、 Nosat、0001101
    c3d38ec0:02906059 ADD.L1 3、A4、A5
    c3d38ec4:0FF92410 || B.S1. 0xC3D357C0 (PC-14048 = 0xc3d357c0)
    c3d38ec8:03140264 LDW/D1T1 *+A5[0]、A6
    c3d38ecc:0190E058 ADD.L1 7、A4、A3
    c3d38ed0:02101FD8 或.L1x 0、B4、A4
    c3d38ed4:020C1FDA 或.L2X 0、A3、B4
    c3d38ed8:00000000 NOP
    c3d38edc:00000000 NOP
    c3d38ee0:010C1FD9 或.L1x 0、B3、A2
    c3d38ee4:1FED8C13 || CallP.S2 0xC3D2FB40 (PC-37792 = 0xc3d2fb40)、B3
    c3d38ee8:030000A8 || MVK.S1 0x0001、A6
    c3d38eec:0088B362 BNOP.S2X A2、5
    c3d38ef0:00000000 NOP
    c3d38ef4:00000000 NOP
    c3d38ef8:00000000 NOP
    c3d38efc:00000000 NOP
    c3d38f00:008C6363 BNOP.S2 B3,3. 

    上的指令为 BNOP.S1 0xC3D38E84 (PC+4 = 0xc3d38e84)、5、这始终是一个分支指令、通过使用汇编步骤进入(Ctrl-Shift-F5)进行确认、该步骤一直保持在同一地址。

    现在、我想上面在 DDR2存储器中显示的汇编代码不是真实代码、而只是统一化 DDR2中随机位的结果。 现在的问题是:为什么程序跳转到 DDR2中的地址? 它是否可以是已在引导条目代码(即调用 main 函数的代码)中启动的中断?

    此致、

    广告

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

    我之前曾研究 过使用 PSDK 的 RTSC 工程和 CCS 工程的启动条目代码(即调用 main 函数的代码)的差异(RTOS 4.0、请参阅 software-dl.ti.com/.../index_FDS.html)。 RTSC 的 boot.c 文件位于:

    C:\ti\BIOS_6_46_05_55\packages/ti\targets\rts6000\boot.c

    CCS 的 boot.c 文件位于:

    C:\ti\ti-cgt-C6000_8.1.3\lib\src\boot.c

    CCS boot.c 文件中缺少的代码为:

    /*
    *清除 CSR 和 IER 寄存器。 这是禁止中断所必需的
    *无法启用中断、无法为中断提供服务。
    *
    _asm ("\t zero\t\t B0");
    _asm ("\t mvc\t\t b0、IER);
    _asm ("\t mvc\t\t b0、csr");
    
    

    这解释了我遇到的问题。 当我将上面的代码复制到主函数的开头时、问题就得到了解决。

    因此 CCS boot.c 代码中存在一个错误:缺少上面显示的指令。 权变措施是将这些指令添加到主函数的开头、但它们应放置在代码执行的最早期的 boot.c 文件中。

    Rahul、您能否将此文件归档为 RTOS 4.0的错误、以便在后续版本中解决?

    提前感谢。

    此致、

    广告

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您在此处公布根本原因。 这似乎是编译器错误、因此我将与编译器团队合作解决此问题。 我们需要检查较新的8.x 编译器 alsos 是否存在此问题。

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

    很抱歉耽误你的时间。

    [引用用户="Ad van de Voort"]

    CCS boot.c 文件中缺少的代码为:

    /*
    *清除 CSR 和 IER 寄存器。 这是禁止中断所必需的
    *无法启用中断、无法为中断提供服务。
    *
    _asm ("\t zero\t\t B0");
    _asm ("\t mvc\t\t b0、IER);
    _asm ("\t mvc\t\t b0、csr"); 

    [/报价]

    此引导例程已在现场运行了20多年。  它从未接触过这些控制寄存器。  实际上、除了内核 CPU 操作之外的任何内容都不会被修改。  这项政策多年来一直行之有效。  因此、请了解我们现在非常不愿意更改它的原因。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    感谢您查看问题。

    这显然是一个错误:程序会在一段时间后挂起。 它已经在这个领域工作了20多年、这一事实绝非一个好的论据:其他软件部件和硬件一直在变化、此外、代码的不同使用会揭示从一开始就存在的错误。 从论坛上可以看出:其他人也遇到了这个问题。 我知道您在更改代码时很小心、但不能修复错误意味着您只是停止维护代码、代码变得过时了。

    由于我不是此代码的所有者(很明显)、我无法决定是否更改此代码、但我只是想让您知道我的观点:总结:我认为此错误需要修复。 如果您认为必须在软件的其他部分(或硬件中)修复、请告知我。

    此致、

    广告

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

    我还担心我们的用户群、通过这个点在1000s 中的数字、我们的用户群是如此。  它们依赖于此引导例程来执行它所做的操作、而不再是其他操作。  行为的任何变化都可能导致至少其中一些问题。   

    关于仅初始化主 CPU 寄存器的策略,编译器显式依赖于... 假设我们违反了中断控制寄存器的此策略。  为什么要在这里停留?  外部存储器接口、高速缓存控制寄存器和其他外设怎么样?  请记住、这些寄存器在不同器件上的工作方式不同。  此策略将引导例程与所有这些详细信息分开。

    如果您愿意、我很乐意提出一个请求、要求更改引导例程以提供引导挂钩函数。  引导例程将在 START 附近调用一个挂钩、在结尾附近调用一个挂钩  将提供这些挂钩函数的默认实现、该实现不执行任何操作。  但是、用户可以提供他们自己的定制实现这些挂钩函数。  该实现可以执行特定于器件和系统的初始化。

    谢谢、此致、

    乔治

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

    我理解您的顾虑。 在前面的一条消息中、我说 boot.c 中存在一个错误(因为我看到 RTSC 工程以这种方式解决了这个错误)、但这并不一定是正确的。 因此、这个问题也许不应该在 boot.c 中解决、而应该在其他地方解决。 我看到硬件在复位时将寄存器 IER 和 CSR 设置为零、因此可能是其他情况导致这些寄存器处于未定义状态(可能是引导加载程序?)。 我很感谢提供挂钩函数的提议、但这不是必需的、因为在主函数中有一个变通办法、可以将这些寄存器设置为0。 但是、如果这个问题得到解决、那就更好了。 您能否将此错误修复请求传递给负责该请求的同事? 谢谢。

    此致、

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

    [引用 user="Ad van de Voort"]感谢提供挂钩函数的提议,但这并不是必需的,因为在 main 函数中有一种变通办法,可以将这些寄存器设置为0。 但是、如果这个问题得到解决、那就更好了。[/引述]

    我很困惑。  我建议的解决方案是挂钩函数。  我可以提交一个请求、要求将它们添加到引导例程中。  请注意最大的优势:这些挂钩函数永远不会为现有代码带来问题。  是否要我提交此请求?

    谢谢、此致、

    乔治

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

    Processor SDK RTOS 4.0.0.4的当前情况是、对于每个新的 CCS 工程、程序会在一段时间后挂起。 这可以通过我在上面描述的权变措施来解决、也可以通过您建议的挂钩函数来解决。 对于我自己来说、这不再是问题、我可以使用 main 中的权变措施、我只需记住将权变措施添加到每个新的 CCS 工程中即可。 但是、我想为所有新用户和 TI 解决严重错误的利益着想。 新用户将遇到问题、因为他们遇到了错误、并且不知道解决方法:main 解决方法或挂钩函数解决方法。 现在、您可以记录权变措施、但在我看来、解决漏洞要容易得多、这样每个人都可以开箱使用新的 CCS 项目、而无需实施权变措施。 我希望这解释更清楚。

    此致、

    广告

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

    AD、

    根据您报告的内容、我设置了项目、唯一可以重现问题的是我第一次执行上电复位并设置 GEL 文件。  

    代码正确返回后、所有后续加载和运行似乎都转到 ABORT 函数。 我的印象是、发生这种情况的原因是、您在 LCDK 平台上的 NAND 闪存上闪存了一些代码、这些代码在第一个 POR 期间引导、使器件处于不干净的状态。 确认这一点的一种好方法是在您第一次连接到器件时报告程序计数器。 如果 PC 处于0xcXXXXXXX 范围或0x8XXXXXXXX 范围内、则 DSP 上从闪存加载了一些代码。

    这意味着您不会在 NOboot 或 UART 引导模式下加载代码、在这种模式下、DSP 不会从闪存加载代码。 解决此问题的另一种方法是在运行 GEL 文件后发出 CPU 复位命令、使 CPU 处于清理状态。

    引导开关设置: http://processors.wiki.ti.com/index.php/L138/C6748_Development_Kit_(LCDK)#User_Interface 

    请尝试此选项并告知我们问题是否已解决。

    此致、

    Rahul

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

    Rahul、

    我不完全理解您的答案、但我已完成以下操作:

    • 在 PC 上启动 CCS
    • 创建一个新的 CCS 项目:空项目(使用 main.c)
    • 添加链接器命令文件 C6748.cmd
    • 构建
    • 为 TMDSLCDK6748加电
    • 运行调试器并等待其在 main 停止

    此时、当我查看寄存器时、PC 指示值为0xC0004740、如果按下 TMDSLCDK6748上的复位按钮、PC 值将变为0x00700000。

    我正在使用硬件:TMDSLCDK6748 (不对闪存进行任何更改)和 XDS100v2 JTAG 14引脚;以及、软件:CCS 版本:7.2.0.00013和 processor_sdk_rtos_omapl138_4_00_00_04。

    此致、

    广告

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我忘记提到寄存器 CSR 和 IER 的值:
    调试器启动后:csr=0x14000103、IER =0x00004003
    按下重置按钮后:csr=0x14000100、IER =0x00000001
    广告
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    AD van de Voort、

    让我尝试并提供更多背景信息。 为了完全理解我的评论、您需要了解 DSP 的启动流程。

    DSP 复位时、器件上的 ROM 引导加载程序软件将读取引导开关设置、以确定 DSP 是否需要从引导介质引导。 如果引导开关配置为从闪存引导、器件会初始化器件时钟和引导介质外设、并尝试读取/查找其中的引导映像。 如果找到映像、它将根据应用程序的要求加载映像设置器件、然后将控制权传递给从闪存加载的应用程序。

    在您的情况下、当您连接到 DSP 时、内核正在片上存储器或 DDR 区域中执行代码、这表示在您执行上电复位时闪存上有一个应用程序引导。 n`t 解决此问题的理想方法是将引导开关设置为不引导或仿真引导模式、或设置为引导模式、该模式不会刷写引导映像、以便在连接仿真器时 DSP 内核卡在引导 ROM 中 并且没有器件初始化或应用配置正在运行、并且 DSP 处于干净状态。

    在 LCDK 上、n`t 有仿真引导模式、但我们有 UART 引导模式、可供使用。 当器件在 UARTn`t 模式下引导时、器件会将 PLL 和 UART 设置为以115.2kbps 的速率引导、但当器件找到来自 UART 的图像时、它将在 BootROM 中保持旋转。 此时、如果您连接并运行 GEL 文件、DSP 应处于清理状态。

    请注意、LCDK 附带预编程的 NAND 闪存、因此、如果您按照快速入门指南中的说明将 SW1设置为 NAND 启动、您将在0xCXXXXXXXX 上看到 DSP 从 NAND 启动 TI RTOS 应用程序以及 DSP PC。 请更改 SW1设置并尝试此设置。 连接 DSP 时、您应该会看到它在 L2 ROM 区域[0x700000 - 0x7F FFFFFFF]中执行

    希望这有助于澄清我先前的评论。

    此致、
    Rahul

    PS:引导加载程序应用手册:

    www.ti.com/.../spraat2f.pdf

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

    您好、Rahul、

    感谢您的解释、非常清楚。

    但是、我一直在为 TMDSLCDK6748开发套件寻找仿真器引导模式、因为我找不到我认为启动仿真器会执行硬件复位的模式、但显然情况并非如此。 因此、我尝试将电路板设置为 UART2引导模式、这确实解决了问题:寄存器 CSR 和 IER 在开始时具有其复位值、程序不再挂起。 使用仿真器的 UART2引导模式是文档中缺少的关键信息。

    此致、

    广告

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    感谢您确认这不是编译器问题。 我更新了此处的文档:
    processors.wiki.ti.com/.../AM1808_EVM_board_using_CCS?

    希望这对您有所帮助。

    此致、
    Rahul