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.

[参考译文] TMS320F28384D:在 JTAG 菊花链配置中调试闪存中的问题

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1324156/tms320f28384d-debugging-issue-in-flash-memory-in-jtag-daisy-chain-configuration

器件型号:TMS320F28384D
主题中讨论的其他器件: SysConfig

您好!

我在定制电路板中有两个采用 JTAG 菊花链配置的 TMS320F28384D:

我将 CCS 12.5.0.00007和 CWARE 5.0.0.00与 XDS200调试探针一同使用。

直到昨天、我仍然能够毫无问题地对 RAM 或闪存中的两个器件进行编程和调试。  

现在、我可以在两个 MCU 和所有内核中都在 RAM 中进行调试、但我不能在第二个 MCU 中的闪存中进行调试(考虑到链、它被称为 MCU1)。 在闪存中为第二个 MCU 的 CPU1 (CPU2也是如此)加载程序后、我总是得到以下错误:

"C28xx_CPU1_0:在0x82985处执行"Finish Auto Run"操作时、无法设置断点:(错误-1066 @ 0x82985)无法设置/清除请求的断点。 验证断点地址是否在有效的存储器中。 (仿真软件包9.13.0.00201)"

并且未正确加载程序。

因此,如果我禁用"自动运行和启动选项"中的"在程序加载或重新启动上"选项 ,我没有得到错误,程序可以启动,它可以正常运行 (我说的正确、因为我正在使用示例"led ex1_c28x_dual_dblinky_cpu1" 和"led ex1_c28x_dual_dblinky_cpu2"、我可以看到闪烁、但对于我尝试添加的任何断点、我得到了错误:

"C28xx_CPU1_0:在0x829af 的操作"Remain Halted"中设置断点时出现问题:(ERROR -1066 @ 0x829AF)无法设置/清除请求的断点。 验证断点地址是否在有效的存储器中。 (仿真软件包9.13.0.00201) "

它停止、但我无法调试代码、只能在"Disassembly"窗口中进行调试。

此外、现在我在第二个 MCU 的 CPU1的调试窗口上看到以下符号:

这意味着什么?

我已经尝试了一些关于清理工作区和目标配置文件的建议、但即使更改工作区也不起作用。

谢谢。此致、

法比奥

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

    尊敬的 Fabio:

    我以前从未见过这个符号。 您正在使用哪个版本的 CCS? 此外、您是否能够使用片上闪存工具擦除第二个 MCU 的闪存? 连接后、能否在存储器浏览器中查看第二个 MCU 上的闪存内容?  

    此致、

    本·科利尔

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

    尊敬的 Benjamin:

    感谢您的反馈

    我以前没有看到该符号。

    但这并不令人鼓舞,顺便说一下 ,我使用的是 CCS 12.5.0.00007和 CWARE 5.0.0.00,带有 XDS200调试探针。

    是的、我能够为第二个 MCU 擦除闪存(还可以在没有"程序加载或重新启动" 选项的情况下加载和运行程序)、并且我能够在存储器浏览器中看到存储器寄存器:

    通过新的试验、我可以补充一点、如果从一开始就逐步进行、我检查了在第二个 MCU 上也有类似的1066错误、该错误位于  


    *如果_system_pre_init 为0、则绕过 C/C++自动初始化*

    LCR #__SYSTEM_PRE_INIT

    此外、我在第二个 MCU 的 CPU1中不再有奇怪的符号。

    我想添加以下内容:我在闪存一个具有类似链接器命令文件的代码:

    CLA_SCRATCHPAD_SIZE = 0x100;
    --undef_sym=__cla_scratchpad_end
    --undef_sym=__cla_scratchpad_start
    
    MEMORY
    {
       /* BEGIN is used for the "boot to Flash" bootloader mode   */
       BEGIN            : origin = 0x080000, length = 0x000002
       BOOT_RSVD        : origin = 0x000002, length = 0x0001AF     /* Part of M0, BOOT rom will use this for stack */
       RAMM0            : origin = 0x0001B1, length = 0x00024F
       RAMM1            : origin = 0x000400, length = 0x0003F8     /* on-chip RAM block M1 */
    //   RAMM1_RSVD       : origin = 0x0007F8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
       RAMD0            : origin = 0x00C000, length = 0x000800
       RAMD1            : origin = 0x00C800, length = 0x000800
       RAMLS0           : origin = 0x008000, length = 0x000800
       RAMLS1           : origin = 0x008800, length = 0x000800
       RAMLS2           : origin = 0x009000, length = 0x000800
       RAMLS3           : origin = 0x009800, length = 0x000800
       RAMLS4           : origin = 0x00A000, length = 0x000800
       RAMLS5           : origin = 0x00A800, length = 0x000800
       RAMLS6           : origin = 0x00B000, length = 0x000800
       RAMLS7           : origin = 0x00B800, length = 0x000800
       RAMGS0           : origin = 0x00D000, length = 0x001000
       RAMGS1           : origin = 0x00E000, length = 0x001000
       RAMGS2           : origin = 0x00F000, length = 0x001000
       RAMGS3           : origin = 0x010000, length = 0x001000
       RAMGS4           : origin = 0x011000, length = 0x001000
       RAMGS5           : origin = 0x012000, length = 0x001000
       RAMGS6           : origin = 0x013000, length = 0x001000
       RAMGS7           : origin = 0x014000, length = 0x001000
       RAMGS8           : origin = 0x015000, length = 0x001000
       RAMGS9           : origin = 0x016000, length = 0x001000
       RAMGS10          : origin = 0x017000, length = 0x001000
       RAMGS11          : origin = 0x018000, length = 0x001000
       RAMGS12          : origin = 0x019000, length = 0x001000
       RAMGS13          : origin = 0x01A000, length = 0x001000
       RAMGS14          : origin = 0x01B000, length = 0x001000
       RAMGS15          : origin = 0x01C000, length = 0x000FF8
    //   RAMGS15_RSVD     : origin = 0x01CFF8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
       /* Flash sectors */
       FLASH0           : origin = 0x080002, length = 0x001FFE  /* on-chip Flash */
       FLASH1           : origin = 0x082000, length = 0x002000  /* on-chip Flash */
       FLASH2           : origin = 0x084000, length = 0x002000  /* on-chip Flash */
       FLASH3           : origin = 0x086000, length = 0x002000  /* on-chip Flash */
       FLASH4           : origin = 0x088000, length = 0x008000  /* on-chip Flash */
       FLASH5           : origin = 0x090000, length = 0x008000  /* on-chip Flash */
       FLASH6           : origin = 0x098000, length = 0x008000  /* on-chip Flash */
       FLASH7           : origin = 0x0A0000, length = 0x008000  /* on-chip Flash */
       FLASH8           : origin = 0x0A8000, length = 0x008000  /* on-chip Flash */
       FLASH9           : origin = 0x0B0000, length = 0x008000  /* on-chip Flash */
       FLASH10          : origin = 0x0B8000, length = 0x002000  /* on-chip Flash */
       FLASH11          : origin = 0x0BA000, length = 0x002000  /* on-chip Flash */
       FLASH12          : origin = 0x0BC000, length = 0x002000  /* on-chip Flash */
       FLASH13          : origin = 0x0BE000, length = 0x001FF0  /* on-chip Flash */
    //   FLASH13_RSVD     : origin = 0x0BFFF0, length = 0x000010  /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
       CPU1TOCPU2RAM   : origin = 0x03A000, length = 0x000800
       CPU2TOCPU1RAM   : origin = 0x03B000, length = 0x000800
       CPUTOCMRAM      : origin = 0x039000, length = 0x000800
       CMTOCPURAM      : origin = 0x038000, length = 0x000800
    
       CANA_MSG_RAM     : origin = 0x049000, length = 0x000800
       CANB_MSG_RAM     : origin = 0x04B000, length = 0x000800
    
       RESET            : origin = 0x3FFFC0, length = 0x000002
    
       CLA1_MSGRAMLOW   : origin = 0x001480,   length = 0x000080
       CLA1_MSGRAMHIGH  : origin = 0x001500,   length = 0x000080
       CLA1_DMA_MSGRAM  : origin = 0x001680,   length = 0x000080
       DMA_CLA1_MSGRAM  : origin = 0x001700,   length = 0x000080
    }
    
    SECTIONS
    {
       codestart           : > BEGIN, ALIGN(8)
       .text               : >> FLASH0 | FLASH1 | FLASH2 | FLASH3, ALIGN(8)
       .cinit              : > FLASH0 | FLASH1 | FLASH2 | FLASH3, ALIGN(8)
       .switch             : > FLASH1, ALIGN(8)
       .reset              : > RESET, TYPE = DSECT /* not used, */
       .stack              : > RAMM0 | RAMM1
    
    #if defined(__TI_EABI__)
       .init_array      : > FLASH1, ALIGN(8)
       .bss             : > RAMLS3
       .bss:output      : > RAMLS3
       .data            : > RAMLS4
       .sysmem          : > RAMLS4
       /* Initalized sections go in Flash */
       .const           : > FLASH5, ALIGN(8)
    #else
       .pinit           : > FLASH1, ALIGN(8)
       .ebss            : > RAMLS3
       .esysmem         : > RAMLS4
       /* Initalized sections go in Flash */
       .econst          : >> FLASH4 | FLASH5, ALIGN(8)
    #endif
    
       MSGRAM_CPU1_TO_CPU2 : > CPU1TOCPU2RAM, type=NOINIT
       MSGRAM_CPU2_TO_CPU1 : > CPU2TOCPU1RAM, type=NOINIT
       MSGRAM_CPU_TO_CM    : > CPUTOCMRAM, type=NOINIT
       MSGRAM_CM_TO_CPU    : > CMTOCPURAM, type=NOINIT
    
       dclfuncs : > FLASH1, ALIGN(8)
    
    
        /* CLA specific sections */
    #if defined(__TI_EABI__)
       Cla1Prog         :   LOAD = FLASH4,
                            RUN = RAMLS5,
                            LOAD_START(Cla1funcsLoadStart),
                            LOAD_END(Cla1funcsLoadEnd),
                            RUN_START(Cla1funcsRunStart),
                            LOAD_SIZE(Cla1funcsLoadSize),
                            ALIGN(8)
    #else
       Cla1Prog         :   LOAD = FLASH4,
                            RUN = RAMLS5,
                            LOAD_START(_Cla1funcsLoadStart),
                            LOAD_END(_Cla1funcsLoadEnd),
                            RUN_START(_Cla1funcsRunStart),
                            LOAD_SIZE(_Cla1funcsLoadSize),
                            ALIGN(8)
    #endif
    
       CLADataLS0       : > RAMLS0
       CLADataLS1       : > RAMLS1
    
       Cla1ToCpuMsgRAM  : > CLA1_MSGRAMLOW, type=NOINIT
       CpuToCla1MsgRAM  : > CLA1_MSGRAMHIGH, type=NOINIT
       Cla1ToDmaMsgRAM  : > CLA1_DMA_MSGRAM, type=NOINIT
       DmaToCla1MsgRAM  : > DMA_CLA1_MSGRAM, type=NOINIT
    
       Cla1DataRam      : >> RAMLS0 | RAMLS1
    
       /* CLA C compiler sections */
       //
       // Must be allocated to memory the CLA has write access to
       //
       CLAscratch       :
                         { *.obj(CLAscratch)
                         . += CLA_SCRATCHPAD_SIZE;
                         *.obj(CLAscratch_end) } >  RAMLS1
    
       .scratchpad      : > RAMLS1
       .bss_cla         : > RAMLS1
       cla_shared       : > RAMLS1
    #if defined(__TI_EABI__)
       .const_cla       :   LOAD = FLASH2,
                            RUN = RAMLS1,
                            RUN_START(Cla1ConstRunStart),
                            LOAD_START(Cla1ConstLoadStart),
                            LOAD_SIZE(Cla1ConstLoadSize)
    #else
       .const_cla       :   LOAD = FLASH2,
                            RUN = RAMLS1,
                            RUN_START(_Cla1ConstRunStart),
                            LOAD_START(_Cla1ConstLoadStart),
                            LOAD_SIZE(_Cla1ConstLoadSize)
    #endif
    
    
       #if defined(__TI_EABI__)
           .TI.ramfunc : {} LOAD = FLASH3,
                            RUN = RAMD0,
                            LOAD_START(RamfuncsLoadStart),
                            LOAD_SIZE(RamfuncsLoadSize),
                            LOAD_END(RamfuncsLoadEnd),
                            RUN_START(RamfuncsRunStart),
                            RUN_SIZE(RamfuncsRunSize),
                            RUN_END(RamfuncsRunEnd),
                            ALIGN(8)
       #else
           .TI.ramfunc : {} LOAD = FLASH3,
                            RUN = RAMD0,
                            LOAD_START(_RamfuncsLoadStart),
                            LOAD_SIZE(_RamfuncsLoadSize),
                            LOAD_END(_RamfuncsLoadEnd),
                            RUN_START(_RamfuncsRunStart),
                            RUN_SIZE(_RamfuncsRunSize),
                            RUN_END(_RamfuncsRunEnd),
                            ALIGN(8)
       #endif
    
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    

    我说了类似的,因为我修改了它,我的试验很多次,为了修复我的问题... 我没有第一个。

    我可以尝试更多的内容吗?

    谢谢。

    法比奥

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

    Fabio、

    您还记得在出现此问题之前对设备进行了哪些操作吗? 您是否刚刚使用了闪烁的 LED 示例?  

    另外、我想知道当你用 CCS 复位每个 CPU 内核、然后使用重新启动按钮时、会发生什么情况。 得到错误吗?  

    此致、

    本·科利尔

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

    尊敬的 Benjamin:

    我使用链接器命令文件或之前发布的类似内容、从自定义代码的 RAM 调试传递到闪存调试。

    根据您的指示:

    此外、我很好奇当你用 CCS 复位每个 CPU 内核、然后使用重新启动按钮时会发生什么情况。 得到错误吗?  [/报价]

    碰巧 MCU2持续复位:

    如果我尝试运行 MCU2的 CPU2、我得到以下结果:

    有什么想法吗?

    谢谢。

    法比奥

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

    尊敬的 Fabio:

    您是否仅有一种定制电路板?  您是否曾尝试更改链接器 CMD 文件以将程序加载到不同的闪存组中?  

    您还可以在存储器浏览器中检查存储器位置0x78020 - 0x78026处的数据吗?  

    此致、

    本·科利尔

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

    尊敬的 Ben:

    我只有一个定制电路板的原型、但我在 controlCARD 的闪存中免费试用了该代码。 我还  多次更改了链接器 CMD 文件、现在根据您的建议、我将闪存扇区中的所有代码移动了> 8个、但问题相同。

    这是您在 CPU1的存储器浏览器中要求的位置:

    CPU2中的内容:

    再次感谢、

    法比奥

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

    Fabio、

    我需要与同事讨论哪些因素可能会导致您出现问题。  

    此致、

    本·科利尔

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

    尊敬的 Ben:

    非常感谢、我将继续在 RAM 中进行调试、即使我的代码变得越来越大、我始终需要重新映射它、有时我有奇怪的内存行为...  

    再次感谢、此致、

    法比奥

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

    尊敬的 Ben:

    您这边的任何可能的更新或者任何其他的东西都可以帮助我恢复微控制器的正常行为?

    谢谢、此致、

    法比奥  

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

    Fabio、

    我们的怀疑是您的硬件断点已用完、因为您只能在闪存中使用硬件断点、而可以在 RAM 中使用软件断点。  

    此致、

    本·科利尔

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [quote userid="567818" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1324156/tms320f28384d-debugging-issue-in-flash-memory-in-jtag-daisy-chain-configuration 过去、我能顺利地对两个文件进行编程和调试、无论是 RAM 还是闪存。  [/报价]

    从昨天到今天、在工具版本、用法等方面是否有过任何机会? 您的环境和用例是否完全相同?

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

    尊敬的 Ben:  

    我认为不明白:您能更好地解释它意味着什么:  

    您没有硬件断点

    谢谢、此致、

    法比奥

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

    Ki、您好!

    我从 RAM 调试传递到针对 MCU2中的2个内核(CPU1和 CM)和 MCU1中的2个内核(CPU1和 CPU2)的自定义代码的闪存调试、这些自定义代码还对一些计算使用了 CLA1CPU1: 问题解决后、在我的试用中、我删除了 SysConfig 中的 CLA 代码和配置以简化工程、但没有效果。  

    我可以补充一点、如今 MCU2的 CM 也出现了同样的问题、我   也被迫禁用"在程序加载或重新启动时"选项。 我不知道它是否链接到我的工作区、但我也更改了它以进行一些测试、但没有看到任何改进。

    非常感谢。此致、

    法比奥

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

    我认为不明白:您能更好地解释它意味着什么:  

    您的硬件断点用完了

    谢谢、此致、

    [/报价]

    请参阅 CCS 用户指南的这一部分:

    https://software-dl.ti.com/ccs/esd/documents/users_guide/ccs_debug-main.html#breakpoints

    特别是:

    硬件断点由目标硬件在内部实现。 用于实现这一点的方法在很大程度上取决于器件或内核、但通常调试器会将地址写入器件上的寄存器并设置标志以启用断点。 这些寄存器对 IDE 不可见。

    可以在任何存储器类型(RAM、闪存或 ROM)中设置硬件断点、 但它受器件上寄存器数量的限制、 。 这对于控制台 I/O 器件类型而言是强制性的。

    与软件断点(可用于 RAM 中的代码)不同、只有有限数量的硬件断点。  

    另请参阅下面的我的帖子:

    https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/1014632/error-occurred-when-setting-more-than-1-hardware-breakpoint-on-cm-core-of-f28388s/3751872#3751872

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

    Ki、您好!

    非常感谢这里的澄清、但事实是我没有设置任何断点:如果我删除了所有断点、会出现这样的情况吗? HW 寄存器中保留了一些内容? 如果是、如何恢复原始行为?

    谢谢、此致、

    法比奥

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

    当您重现问题时、是否可以在脚本控制台中使用 DEBUG_DumpBreakpoints GEL 调用、并将输出复制并粘贴到文本文件中、然后将其发布到该线程中?

    有关更多详细信息、请参阅以下文章:

    https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/479091/remove-hw-breakpoint-on-ccs-v5/1733180#1733180