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.

[参考译文] TMS320F28379D:函数指针在到达 Main 之前被覆盖

Guru**** 2590990 points
Other Parts Discussed in Thread: TMS320F28379D, C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000847/tms320f28379d-function-pointer-overwritten-before-reaching-main

器件型号:TMS320F28379D
主题中讨论的其他器件: C2000WARE

参考此论坛帖子:

https://e2e.ti.com/support/microcontrollers/c2000/f/c2000-microcontrollers-forum/998430/tms320f28379d-debugging-itrap-interrupt_illegaloperatorhandler

虽然我能够发现 我获得的 ITRAP 是因为函数指针被覆盖、因此发生了无效的函数调用、但我无法弄清为什么函数指针在内存中被覆盖。 实际上、我不相信代码中的任何内容会覆盖此函数指针。 我发现的问题是、假设我为函数指针分配一个空指针、这样它就像 funcPointer =(void*) 0一样。 理想情况下、在编译时间之后、函数指针应该读取0x00000000:

但是,当我第一次按下调试按钮并将代码刷写到 CPU1和 CPU2上时,函数指针值会在我到达 main()之前发生变化。 请注意、我有一个调试配置、该配置设置为一个接一个地对两个内核进行编程。 它将为每个内核构建代码、然后擦除闪存并将代码加载到每个内核上:

0x0608015A 不是有效的空函数指针、因此触发了一个 ITRAP (非法指令 ISR)。  在启动期间、什么会导致这个函数指针在 main.c 之前被覆盖? 引导 ROM 中的某个内容是否会变为非法并覆盖其他存储器区域?

为了进一步调试、我尝试禁用程序加载/重新启动时的自动运行以单步执行引导 ROM、并查看是否有任何更改函数指针值的操作:

但是、函数指针在整个引导 ROM 中仍然是一个空指针、并且永远不会被覆盖(即、如果程序加载或重新启动时自动运行被禁用、我无法复制被覆盖的函数指针)。 一旦我 在 程序加载或重新启动时启用自动运行至 main 并尝试再次闪烁、问题就会重新出现...这让我感到很不快。  

这是另一个褶皱。 如果我已经处于活动的调试会话中、那么在我第一次将代码加载到闪存中的两个内核后、我无法复制此问题。 如果我尝试 CPU 复位/重新启动、函数指针返回到正常值0x00000000。 这个问题似乎只在我第一次启动一个新的调试会话和闪存代码到两个内核上时发生。 我必须停止当前调试会话并重新启动调试会话、并将代码刷写到两个内核上、以便再次查看问题。

仿真器调试器模式、引导 ROM 或链接器 CMD 文件设置不正确、这是否是一个奇怪的问题? 这里有一个针对"Memory:Prepetching Beyond Valid Memory"的勘误表、因此我必须研究我们是否使用勘误表 SPRZ413L 中指定的 M1 GS11或 GS15。 仔细检查了链接器文件、它们 特别不允许按照勘误表使用无效存储器区域的结束、因此似乎不会出现链接器文件的问题。 尽管 我确实合并了 RAMLS0和 RAMLS1、以便在 CPU1上为 TI ramfuncs 生成 RAMLS0_1 (CPU2仅需要 RAMLS0)、但不确定这是否会影响任何内容。

编辑2021年5月12日: 清理并简化了问题

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

    您好、Nigel、

    您能否说明您使用哪个板来运行代码? 它是定制板还是我们的标准 C2000 EVM 之一? 您能否提供启动调试会话时所使用的目标配置的屏幕截图? 您是否对调试会话启动时运行的 GEL 脚本进行了任何修改?

    [引用 userid="462401" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000847/tms320f28379d-function-pointer-overwritten-before-reaching-main ]请注意、我有一个调试配置、该配置设置为一个接一个地对两个内核进行编程。 它将为每个内核构建代码、然后擦除闪存并将代码加载到每个内核上:

    您能澄清这一陈述吗? 您是否创建了自己的构建配置?

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

    具有 TMS320F28379D ZWTS 修订版 C 芯片的定制板。 下面是.ccxml 屏幕截图:

    没有我知道的对 GEL 脚本的修改。

    调试配置的意思是、我使用以下过程创建了调试配置:

    1) 1)右键单击 CPU1项目> Debug As > Debug Configurations...

    2) 2)右键单击"Code Composer Studio - Device Debugging (Code Composer Studio -设备调试)"> New Configuration (新配置)"

    3) 3)在调试窗口中的"Name"旁边放置 CPU1工程的名称 > Apply

    "Main"选项卡

    4) 4)在"Target Configuration"旁边、按"File System..." 或"Workspace...">导航至 .ccxml 文件>确定

    5) 5)在主窗口中选择 我计划加载代码的内核(在我们的案例中仅为 C28xx_CPU1和 C28xx_CPU2、无 CLA)>应用

    程序选项卡:

    6) 6)从"Device"下拉菜单中选择 CPU1

    7) 7)在"Project"旁边按"Workspace..." >选择包含要加载到 CPU1的源代码的工程

    8) 8)对 CPU2重复前面的两个步骤

    9) 9)应用并关闭


    在 调试配置设置中、我要将代码加载到内核上:

    1) 1)通过板载接头将 ARM JTAG 连接到板、并通过 USB 连接到计算机

    2) 2)为电路板通电

    3)右键单击 CPU1工程>编译配置>设置为活动>选择闪存编译配置(已为此配置设置了多个链接器和编译器设置、以包括 driverlib、预定义符号、flash.cmd 等)。 某些文件变为灰色 并从编译中排除(例如 RAM .cmd 文件)。

    4) 4)对  CPU2项目重复上一步

    5) 5)对 CPU1和 CPU2进行全新构建

    6)选择 CPU1项目>单击错误图标以生成代码并将其加载到板上,然后启动调试会话(如果正确配置了调试配置,则它将自动构建 CPU1,然后构建 CPU2,然后擦除并加载 CPU1的闪存, 然后擦除并加载 CPU2的闪存)

    7) 7)选择 CPU1调试探针>按"Resume"按钮、电路板现在应在 CPU1上运行代码

    8) 8)对 CPU2调试探针重复上述步骤

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

    Nigel、

    感谢您提供更多详细信息、这很有帮助。 重新读取一些调试结果、最好将重点放在代码的闪存和引导过程上。

    [引用 userid="462401" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000847/tms320f28379d-function-pointer-overwritten-before-reaching-main~]但是,第一次按调试按钮并将代码刷写到 CPU1和 CPU2时,函数指针值会在到达 main ()之前发生变化。
    Unknown 说:
    这是另一个褶皱。 如果我已经处于活动的调试会话中、那么在我第一次将代码加载到闪存中的两个内核后、我无法复制此问题。 如果我尝试 CPU 复位/重新启动、函数指针返回到正常值0x00000000。 这个问题似乎只在我第一次启动一个新的调试会话和闪存代码到两个内核上时发生。 我必须停止当前调试会话并重新启动调试会话、并将代码刷写到两个内核上、以便再次查看问题。

    正如您可能已经知道的那样,在您到达代码中的 main()之前,会发生许多不同的事情。 下面的实验课程材料提供了一个非常好的概述、您可以从中了解更多信息。 我建议在《车间维修手册》中添加有关复位和中断的部分。

    https://training.ti.com/c2000-f2837xd-microcontroller-workshop?context=1137755-1139641-1137781 

    我可以提供以下几个调试提示:

    -正在损坏的函数指针的地址是什么?  您可以尝试设置一个硬件观察点、以查看是否可以捕捉该函数指针的地址被写入的时刻。 下面的文章介绍了如何设置硬件观察点。  

    https://software-dl.ti.com/ccs/esd/documents/ccs_breakpoint_watchpoint_c2000.html 

    -您是否已查看 CPU1和 CPU2的命令文件以确保它们不会相互干扰?

    - CPU1和 CPU2使用哪些引导模式选项?

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="13605" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000847/tms320f28379d-function-pointer-overwritten-before-reaching-main/3699532 #3699532"]函数指针的地址损坏了什么?

    从上面的屏幕截图中、函数指针地址为0x0000C654。

    [引用 userid="13605" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000847/tms320f28379d-function-pointer-overwritten-before-reaching-main/3699532 #3699532"]您可以尝试设置硬件观察点,以查看是否可以捕捉该函数指针的地址写入的时刻。

    我曾尝试为0x0000C654 (WRITE)设置一个硬件监视点、但禁用了自动运行到 main()、但它被触发的唯一时间是 cinit 将该值清零时、其余代码正常运行。 当我尝试使用启用了自动运行到 main()的监视点时,同样,一切都正常。 我似乎无法物理观察到它,当我在仿真器/调试模式下第一次刷写代码时自动运行到 main()时,会发生其他情况。

    [引用 userid="13605" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000847/tms320f28379d-function-pointer-overwritten-before-reaching-main/3699532 #3699532"]是否已查看 CPU1和 CPU2的命令文件以确保它们不会相互干扰?

    是的、就我所知、没有冲突、这些冲突是从最新的 C2000Ware_3_04_00_00中提取的、并修改为与我们的项目一起使用。  我似乎无法将.cmd 文件作为附件上传、因此我已将代码粘贴到这里:

    // 2837xD_FLASH_lnk_cpu1.cmd
    MEMORY
    {
    PAGE 0 :  /* Program Memory */
              /* Memory (RAM/FLASH) blocks can be moved to PAGE1 for data allocation */
              /* BEGIN is used for the "boot to Flash" bootloader mode   */
    
       BEGIN           	: origin = 0x080000, length = 0x000002
       RAMM0           	: origin = 0x000123, length = 0x0002DD
       RAMD0           	: origin = 0x00B000, length = 0x000800
    
       // For .TI.ramfunc (see note below)
       RAMLS0_1         : origin = 0x008000, length = 0x001000
    //   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
    //   RAMGS14          : origin = 0x01A000, length = 0x001000 // RESERVED FOR CPU2     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
    //   RAMGS15          : origin = 0x01B000, length = 0x000FF8 // RESERVED FOR CPU2     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
    
    //   RAMGS15_RSVD     : origin = 0x01BFF8, length = 0x000008    /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
       RESET           	: origin = 0x3FFFC0, length = 0x000002
    
       /* Flash sectors */
       FLASHA           : origin = 0x080002, length = 0x001FFE	/* on-chip Flash */
       FLASHB           : origin = 0x082000, length = 0x002000	/* on-chip Flash */
       FLASHC           : origin = 0x084000, length = 0x002000	/* on-chip Flash */
       FLASHD           : origin = 0x086000, length = 0x002000	/* on-chip Flash */
       FLASHE           : origin = 0x088000, length = 0x008000	/* on-chip Flash */
       FLASHF           : origin = 0x090000, length = 0x008000	/* on-chip Flash */
       FLASHG           : origin = 0x098000, length = 0x008000	/* on-chip Flash */
       FLASHH           : origin = 0x0A0000, length = 0x008000	/* on-chip Flash */
       FLASHI           : origin = 0x0A8000, length = 0x008000	/* on-chip Flash */
       FLASHJ           : origin = 0x0B0000, length = 0x008000	/* on-chip Flash */
       FLASHK           : origin = 0x0B8000, length = 0x002000	/* on-chip Flash */
       FLASHL           : origin = 0x0BA000, length = 0x002000	/* on-chip Flash */
       FLASHM           : origin = 0x0BC000, length = 0x002000	/* on-chip Flash */
       FLASHN           : origin = 0x0BE000, length = 0x001FF0	/* on-chip Flash */
    
    //   FLASHN_RSVD     : origin = 0x0BFFF0, length = 0x000010    /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
    PAGE 1 : /* Data Memory */
             /* Memory (RAM/FLASH) blocks can be moved to PAGE0 for program allocation */
    
       BOOT_RSVD       : origin = 0x000002, length = 0x000121     /* Part of M0, BOOT rom will use this for stack */
       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" */
       RAMD1           : origin = 0x00B800, length = 0x000800
    
       RAMLS5      : origin = 0x00A800, length = 0x000800
    
       RAMGS0      : origin = 0x00C000, length = 0x001000
       RAMGS1      : origin = 0x00D000, length = 0x001000
       RAMGS2      : origin = 0x00E000, length = 0x001000
       RAMGS3      : origin = 0x00F000, length = 0x001000
       RAMGS4      : origin = 0x010000, length = 0x001000
       RAMGS5      : origin = 0x011000, length = 0x001000
       RAMGS6      : origin = 0x012000, length = 0x001000
       RAMGS7      : origin = 0x013000, length = 0x001000
    //   RAMGS8      : origin = 0x014000, length = 0x001000 // RESERVED FOR CPU2
    //   RAMGS9      : origin = 0x015000, length = 0x001000 // RESERVED FOR CPU2
    //   RAMGS10     : origin = 0x016000, length = 0x001000 // RESERVED FOR CPU2
    
    //   RAMGS11     : origin = 0x017000, length = 0x000FF8   /* Uncomment for F28374D, F28376D devices */
    
    //   RAMGS11_RSVD : origin = 0x017FF8, length = 0x000008    /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
    //   RAMGS11     : origin = 0x017000, length = 0x001000 // RESERVED FOR CPU2     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
    //   RAMGS12     : origin = 0x018000, length = 0x001000 // RESERVED FOR CPU2     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
    //   RAMGS13     : origin = 0x019000, length = 0x001000 // RESERVED FOR CPU2     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
    
    /* Only needed for examples:
       CPU2TOCPU1RAM   : origin = 0x03F800, length = 0x000400
       CPU1TOCPU2RAM   : origin = 0x03FC00, length = 0x000400
    */
    }
    
    SECTIONS
    {
       /* Allocate program areas: */
       .cinit              : > FLASHB      PAGE = 0, ALIGN(8)
       .text               : >> FLASHB | FLASHC | FLASHD | FLASHE      PAGE = 0, ALIGN(8)
       codestart           : > BEGIN       PAGE = 0, ALIGN(8)
       /* Allocate uninitalized data sections: */
       .stack              : > RAMD1       PAGE = 1
       .switch             : > FLASHB      PAGE = 0, ALIGN(8)
       .reset              : > RESET,      PAGE = 0, TYPE = DSECT /* not used, */
    
    #if defined(__TI_EABI__)
       .init_array         : > FLASHB,       PAGE = 0,       ALIGN(8)
       .bss                : > RAMLS5,       PAGE = 1
       .bss:output         : > RAMLS3,       PAGE = 0
       .bss:cio            : > RAMLS5,       PAGE = 1
       .data               : > RAMLS5,       PAGE = 1
       .sysmem             : > RAMLS5,       PAGE = 1
       /* Initalized sections go in Flash */
       .const              : > FLASHF,       PAGE = 0,       ALIGN(8)
    #else
       .pinit              : > FLASHB,       PAGE = 0,       ALIGN(8)
       .ebss               : >> RAMLS5 | RAMGS0 | RAMGS1,    PAGE = 1
       .esysmem            : > RAMLS5,       PAGE = 1
       .cio                : > RAMLS5,       PAGE = 1
       /* Initalized sections go in Flash */
       .econst             : >> FLASHF      PAGE = 0, ALIGN(8)
    #endif
    
    /* Only needed for SDFM module:
    
       Filter_RegsFile     : > RAMGS0,	   PAGE = 1
    
       Only needed for examples:
    
       SHARERAMGS0		: > RAMGS0,		PAGE = 1
       SHARERAMGS1		: > RAMGS1,		PAGE = 1
       ramgs0           : > RAMGS0,     PAGE = 1
       ramgs1           : > RAMGS1,     PAGE = 1
    */
    
    // NOTE: if you have trouble fitting .TI.ramfunc in RAMLS0, see this forum post:
    // e2e.ti.com/.../691117
    #ifdef __TI_COMPILER_VERSION__
        #if __TI_COMPILER_VERSION__ >= 15009000
            #if defined(__TI_EABI__)
                .TI.ramfunc : {} LOAD = FLASHD,
                                     RUN = RAMLS0_1,
                                     LOAD_START(RamfuncsLoadStart),
                                     LOAD_SIZE(RamfuncsLoadSize),
                                     LOAD_END(RamfuncsLoadEnd),
                                     RUN_START(RamfuncsRunStart),
                                     RUN_SIZE(RamfuncsRunSize),
                                     RUN_END(RamfuncsRunEnd),
                                     PAGE = 0, ALIGN(8)
            #else
                .TI.ramfunc : {} LOAD = FLASHD,
                                 RUN = RAMLS0_1,
                                 LOAD_START(_RamfuncsLoadStart),
                                 LOAD_SIZE(_RamfuncsLoadSize),
                                 LOAD_END(_RamfuncsLoadEnd),
                                 RUN_START(_RamfuncsRunStart),
                                 RUN_SIZE(_RamfuncsRunSize),
                                 RUN_END(_RamfuncsRunEnd),
                                 PAGE = 0, ALIGN(8)
            #endif
        #else
       ramfuncs            : LOAD = FLASHD,
                             RUN = RAMLS0_1,
                             LOAD_START(_RamfuncsLoadStart),
                             LOAD_SIZE(_RamfuncsLoadSize),
                             LOAD_END(_RamfuncsLoadEnd),
                             RUN_START(_RamfuncsRunStart),
                             RUN_SIZE(_RamfuncsRunSize),
                             RUN_END(_RamfuncsRunEnd),
                             PAGE = 0, ALIGN(8)
        #endif
    
    #endif
    
    /* The following section definitions are required when using the IPC API Drivers
    
        GROUP : > CPU1TOCPU2RAM, PAGE = 1
        {
            PUTBUFFER
            PUTWRITEIDX
            GETREADIDX
        }
    
        GROUP : > CPU2TOCPU1RAM, PAGE = 1
        {
            GETBUFFER :    TYPE = DSECT
            GETWRITEIDX :  TYPE = DSECT
            PUTREADIDX :   TYPE = DSECT
        }
    */
    
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */

    // 2837xD_FLASH_lnk_cpu2.cmd
    
    MEMORY
    {
    PAGE 0 :
       /* BEGIN is used for the "boot to SARAM" bootloader mode   */
    
       BEGIN           	: origin = 0x080000, length = 0x000002
       RAMM0           	: origin = 0x0000A2, length = 0x00035E
       RAMD0           	: origin = 0x00B000, 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
       RAMGS14          : origin = 0x01A000, length = 0x001000     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
       RAMGS15          : origin = 0x01B000, length = 0x000FF8     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
    
    //   RAMGS15_RSVD     : origin = 0x01BFF8, length = 0x000008    /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
       RESET       		: origin = 0x3FFFC0, length = 0x000002
    
       /* Flash sectors */
       FLASHA           : origin = 0x080002, length = 0x001FFE	/* on-chip Flash */
       FLASHB           : origin = 0x082000, length = 0x002000	/* on-chip Flash */
       FLASHC           : origin = 0x084000, length = 0x002000	/* on-chip Flash */
       FLASHD           : origin = 0x086000, length = 0x002000	/* on-chip Flash */
       FLASHE           : origin = 0x088000, length = 0x008000	/* on-chip Flash */
       FLASHF           : origin = 0x090000, length = 0x008000	/* on-chip Flash */
       FLASHG           : origin = 0x098000, length = 0x008000	/* on-chip Flash */
       FLASHH           : origin = 0x0A0000, length = 0x008000	/* on-chip Flash */
       FLASHI           : origin = 0x0A8000, length = 0x008000	/* on-chip Flash */
       FLASHJ           : origin = 0x0B0000, length = 0x008000	/* on-chip Flash */
       FLASHK           : origin = 0x0B8000, length = 0x002000	/* on-chip Flash */
       FLASHL           : origin = 0x0BA000, length = 0x002000	/* on-chip Flash */
       FLASHM           : origin = 0x0BC000, length = 0x002000	/* on-chip Flash */
       FLASHN           : origin = 0x0BE000, length = 0x001FF0	/* on-chip Flash */
    
    //   FLASHN_RSVD     : origin = 0x0BFFF0, length = 0x000010    /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */
    
    PAGE 1 :
    
       BOOT_RSVD       : origin = 0x000002, length = 0x0000A0     /* Part of M0, BOOT rom will use this for stack */
       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" */
       RAMD1           : origin = 0x00B800, length = 0x000800
    
       RAMLS5          : origin = 0x00A800, length = 0x000800
    
       RAMGS8          : origin = 0x014000, length = 0x001000
       RAMGS9          : origin = 0x015000, length = 0x001000
       RAMGS10         : origin = 0x016000, length = 0x001000
       RAMGS11         : origin = 0x017000, length = 0x001000     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
       RAMGS12         : origin = 0x018000, length = 0x001000     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
       RAMGS13         : origin = 0x019000, length = 0x001000     /* Only Available on F28379D, F28377D, F28375D devices. Remove line on other devices. */
    
    /* Only needed for examples:
       CPU2TOCPU1RAM   : origin = 0x03F800, length = 0x000400
       CPU1TOCPU2RAM   : origin = 0x03FC00, length = 0x000400
    */
    }
    
    //
    // NOTE: avoid using global shared RAM (RAMGSx) for CPU2 sections, instead
    // use local memory (M0/M1/D0/D1 or LSx RAMs), as noted by Vivek Singh:
    // e2e.ti.com/.../1791385
    //
    SECTIONS
    {
       /* Allocate program areas: */
       .cinit              : > FLASHB      PAGE = 0, ALIGN(8)
       .text               : >> FLASHA | FLASHB | FLASHC | FLASHD      PAGE = 0, ALIGN(8)
       codestart           : > BEGIN       PAGE = 0, ALIGN(8)
    
       /* Allocate uninitalized data sections: */
       .stack              : > RAMD1        PAGE = 1
    
       /* Initalized sections go in Flash */
       .switch             : > FLASHB      PAGE = 0, ALIGN(8)
       .reset           : > RESET,     PAGE = 0, TYPE = DSECT /* not used, */
       
    #if defined(__TI_EABI__)
       .init_array         : > FLASHB,       PAGE = 0,       ALIGN(8)
       .bss                : > RAMLS5,       PAGE = 1
       .bss:output         : > RAMLS3,       PAGE = 0
       .bss:cio            : > RAMLS5,       PAGE = 1
       .data               : > RAMLS5,       PAGE = 1
       .sysmem             : > RAMLS5,       PAGE = 1
       /* Initalized sections go in Flash */
       .const              : > FLASHF,       PAGE = 0,       ALIGN(8)
    #else
       .pinit              : > FLASHB,       PAGE = 0,       ALIGN(8)
       .ebss               : >> RAMLS1 | RAMLS2 | RAMLS3,      PAGE = 0
       .esysmem            : > RAMLS5,       PAGE = 1
       .cio                : > RAMLS5,       PAGE = 1
       /* Initalized sections go in Flash */
       .econst             : >> FLASHF       PAGE = 0, ALIGN(8)
    #endif
    
    // Only needed for examples:
    
    //   SHARERAMGS0		: > RAMGS0,		PAGE = 1
    //   SHARERAMGS1		: > RAMGS1,		PAGE = 1
    
    // NOTE: if you have trouble fitting .TI.ramfunc in RAMLS0, see this forum post:
    // e2e.ti.com/.../691117
    #ifdef __TI_COMPILER_VERSION__
        #if __TI_COMPILER_VERSION__ >= 15009000
            #if defined(__TI_EABI__)
                .TI.ramfunc : {} LOAD = FLASHE,
                                     RUN = RAMLS0,
                                     LOAD_START(RamfuncsLoadStart),
                                     LOAD_SIZE(RamfuncsLoadSize),
                                     LOAD_END(RamfuncsLoadEnd),
                                     RUN_START(RamfuncsRunStart),
                                     RUN_SIZE(RamfuncsRunSize),
                                     RUN_END(RamfuncsRunEnd),
                                     PAGE = 0, ALIGN(8)
            #else
                .TI.ramfunc : {} LOAD = FLASHE,
                                 RUN = RAMLS0,
                                 LOAD_START(_RamfuncsLoadStart),
                                 LOAD_SIZE(_RamfuncsLoadSize),
                                 LOAD_END(_RamfuncsLoadEnd),
                                 RUN_START(_RamfuncsRunStart),
                                 RUN_SIZE(_RamfuncsRunSize),
                                 RUN_END(_RamfuncsRunEnd),
                                 PAGE = 0, ALIGN(8)
            #endif
        #else
       ramfuncs            : LOAD = FLASHE,
                             RUN = RAMLS0,
                             LOAD_START(_RamfuncsLoadStart),
                             LOAD_SIZE(_RamfuncsLoadSize),
                             LOAD_END(_RamfuncsLoadEnd),
                             RUN_START(_RamfuncsRunStart),
                             RUN_SIZE(_RamfuncsRunSize),
                             RUN_END(_RamfuncsRunEnd),
                             PAGE = 0, ALIGN(8)
        #endif
    #endif
    
    /* The following section definitions are required when using the IPC API Drivers
        GROUP : > CPU2TOCPU1RAM, PAGE = 1
        {
            PUTBUFFER
            PUTWRITEIDX
            GETREADIDX
        }
    
        GROUP : > CPU1TOCPU2RAM, PAGE = 1
        {
            GETBUFFER :    TYPE = DSECT
            GETWRITEIDX :  TYPE = DSECT
            PUTREADIDX :   TYPE = DSECT
        }
    */
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    

    [引用 userid="13605" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000847/tms320f28379d-function-pointer-overwritten-before-reaching-main/3699532 #3699532"]您要为 CPU1和 CPU2使用哪些引导模式选项?

    好的一点、我们实际上存在一个引导引脚悬空的问题、但在下一个电路板版本中、我们会将它们上拉、以便始终以闪存引导模式引导、而不是以某些未知状态引导。 我们在过去遇到过这种问题、浮点引导模式引脚可能会在存储器区域被覆盖时引起一些意外行为。

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

    Nigel、

    非常奇怪的是、只有在禁用观察点并启用自动运行时才能复制此问题。 我将看到我是否可以让我们的 CCS 团队对这种行为差异进行评论。  

    您是否尝试将 包含函数指针的段移动到另一个存储器位置? 看看问题是否仍然存在?

    关于引导模式、请注意、有几个 GEL 帮助程序函数可帮助您在调试期间覆盖引脚引导模式选择。 请参阅 f28377d_cpuX.gel 文件中的"EMU 引导模式选择"函数。 这些 GEL 文件应已作为目标配置的一部分加载。  

    7.9.5.将 GEL 文件添加到目标配置—Code Composer Studio 9.1.0文档

    GEL 文件的位置:

    \ccs\ccs_base\emulation\gel

    要在 CCS 中访问 GEL 文件、请使用:tools -> GEL Files

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    [引用 userid="13605" URL"~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1000847/tms320f28379d-function-pointer-overwritten-before-reaching-main/3701401 #3701401">这种奇怪的是、您只能在禁用监视点并启用自动运行时复制此问题。 我将看到我是否可以让我们的 CCS 团队对这种行为差异进行评论。  [/报价]

    这确实是奇怪的。 自动运行功能所做的所有操作都是在加载(或重新启动)程序后、在 main (或指定的任何标签)的开头设置断点、然后运行目标。  当程序到达 main 处的断点时、目标被暂停并且断点被自动删除。 这与"运行到线路"行为类似。 我不确定它如何与函数指针混淆。

    Nigel -如果您禁用自动启动、但随后手动复制它的功能(重新启动、在 main 开始处设置断点、然后运行目标)、您是否仍然能够复制此问题?  

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

    您好、Nigel、

    我认为这不是 CCS 断点或观察点的问题。 在我看来、在这种情况下、指针会被闪存编程工具覆盖、该工具使用 GSx RAM 加载闪存 API 代码/数据来对闪存进行编程。 当您启用自动运行时、在其中一个内核中加载代码后、CPU 将开始运行、而代码将加载到其他内核上、这会导致竞争条件并会导致此类问题。 因此、您应该避免这样做。 您应该将代码加载到 ist 内核中、然后将代码加载到第二个内核中。 如果您想尝试现在的操作方式、则最好禁用自动运行选项。

    此致、

    Vivek Singh

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    novar luo 说:
    Nigel -如果禁用自动启动、但手动复制它的功能(重新启动、在 main 的开头设置断点、然后运行目标)、您是否仍然能够复制此问题?  [/报价]

    不幸的是、不是。 Vivek 的结论似乎足够合理。 我想我们不必使用自动运行选项。 这是 一个很好的错误、可以在闪存编程工具中修复、因此多核编程不会遇到这些竞态条件。