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.

[参考译文] TMS320F28375S:从 COFF 迁移到 eabi 格式后应用程序崩溃

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1269372/tms320f28375s-application-crashes-after-migration-from-coff-to-eabi-format

器件型号:TMS320F28375S
Thread 中讨论的其他器件:C2000WARESysBIOS

尊敬的先生或女士

我们已将固件从 COFF 格式迁移到 eabi。 或者至少、我们要尝试这么做。 每当我们刷写它时、即使在它到达 main 之前就会崩溃。 更准确地说、在复位时调用的 Userinit 函数中、我们将一些 progam 代码从闪存复制到内存中。 当我们在汇编步骤中调试时、我们看到、该函数以随机步进的方式跳转到地址0x3FE493并停止。 如果不等于零指令、memcpy 基本上是一个具有两条 MOV 指令和一个分支的循环。 RAM 的存储器范围足够大、能够存储来自闪存的所有数据。 有趣的是、它只会在复制 IQmath 库中的对象时发生。  

两次调试显示、在复制更新的  IQmath_fpu32_eabi 库的函数期间会发生崩溃。 它的地址并不完全相同、但始终处于存储 IQmath 函数的范围内。  

有一个类似的主题没有帮助,因为它只引用手册,我们当然考虑: https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1244672/tms320f28075-migration-from-coff-to-eabi-crash-during-_c_int00

我将新的.eabi 映射文件与 COFF.ABI 文件进行了比较。 有一些变化,似乎是奇怪的我,但我不知道他们是否对这个问题有影响或他们是正确的。

-在 eabi.map 文件中,PieVectTable 以0的长度列出,并且在属性/输入部分只有 DSECT ,而 coff 格式的长度大于0并且也引用了 F2837xS_globalvariables。

- eabi.map 文件中缺少 AdcResultFileD

- CodeStartBranch.asm 在.map 文件中丢失

-在 eabi.map 中:链接器生成的复制表中有一个 addinoal 条目:__TI__cinit_table

这个列表很随机、我认为还有一些其他的差异。 它可能有助于解决该问题。

在帖子的末尾,我插入了这个问题的所有重要文件。

感谢您发送编修。

罗伯特

以下代码显示了 User Init 函数:

/*----------------------------------------------------------------------------
 function:  UserInit
 ----------------------------------------------------------------------------*/
extern "C" void UserInit()
{
	// SYS/BIO UserInit function.
	//
	// This is the user initialization function to be specified in
	// the SYS/BIOS configuration file (Startup -> User reset function)
	//
	// Use this function to copy flash sections to RAM
	//
	// @note Will be called before main().

	//--- Copy all Flash sections that need to run in RAM
    memcpy(&RamfuncsRunStart, &RamfuncsLoadStart, (size_t)&RamfuncsLoadSize);
	//--- Section secureRamFuncs contains user defined code that runs from CSM secured RAM
	memcpy(&secRamRunStart, &secRamLoadStart, (size_t)&secRamLoadSize);
}

已剪切.cmd 文件:

codestart : > FLASHE PAGE = 0
ramfuncs : LOAD = FLASHE | FLASHF | FLASHG | FLASHH | FLASHI |
FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0
RUN = D01SARAM PAGE = 0
RUN_START(RamfuncsRunStart),
LOAD_START(RamfuncsLoadStart),
LOAD_SIZE(RamfuncsLoadSize)
{ -l IQmath_fpu32_eabi.lib
(IQmath)
}

#ifdef __TI_COMPILER_VERSION
#if __TI_COMPILER_VERSION >= 15009000
.TI.ramfunc : LOAD = FLASHE | FLASHF | FLASHG | FLASHH | FLASHI |
FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0,
RUN = LS05SARAM PAGE = 1,
table(BINIT)
#endif
#endif

IQmathTables : > FLASHE | FLASHF | FLASHG | FLASHH | FLASHI |
FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0

映射文件已打分:

ramfuncs 0 00088010 00000ae3 RUN ADDR = 0000b000
00088010 000001af MotionControl.obj (ramfuncs:_ZN13MotionControl3isrEv)
000881bf 000000a0 MotionControlPwmIRQ.obj (ramfuncs:_ZN19MotionControlPwmIrq6pwmIrqER19PwmControlParamer)
0008825f 0000008b MotionControlPwmIRQ.obj (ramfuncs:_ZN19MotionControlPwmIrq24holdPositionStaHandlerENS_9EPwmEvenR19PwmControlParamer)
000882ea 00000089 PWM.obj (ramfuncs:_ZN6PWMGEN6setPWMERK19PwmControlParamer)
00088373 00000079 PIDController.obj (ramfuncs:_ZN13PIDController9calculaEll)
000883ec 00000069 MotionControlPwmIRQ.obj (ramfuncs:_ZN19MotionControlPwmIrq23safeHoldPosStaHandlerENS_9EPwmEvenR19PwmControlParamer)
00088455 00000064 MotionControlPwmIRQ.obj (ramfuncs:_ZN19MotionControlPwmIrq16moveStaHandlerENS_9EPwmEvenR19PwmControlParamer)
000884b9 0000005e StatisticModuleExnded.obj (ramfuncs:_ZN23StatisticModuleExnded8addValueEv)
00088517 0000004c EncoderBase.obj (ramfuncs:_ZNK11EncoderBase8getThetaEPl)
00088563 00000042 Absoluncoder2.obj (ramfuncs:_ZN15Absoluncoder217calculaPositionEv)
000885a5 0000003b Absoluncoder.obj (ramfuncs:_ZN14Absoluncoder17calculaPositionEv)
000885e0 0000003b QEP.obj (ramfuncs:_ZN3QEP17calculaPositionEv)
0008861b 00000036 MotionControlFsmBase.obj (ramfuncs:_ZN20MotionControlFsmBase24calculaAllEncPositionsEv)
00088651 00000023 TwinQep.obj (ramfuncs:_ZN7TWINQEP17calculaPositionEv)
00088674 0000001e OverCurrent.obj (ramfuncs:_ZN11OverCurrent9calculaEl)
00088692 00000018 DataLogger.obj (ramfuncs:_ZN10DataLogger8logValueEl)
000886aa 00000018 StatisticModuleLight.obj (ramfuncs:_ZN20StatisticModuleLight8addValueEv)
000886c2 00000010 SysmTimers.obj (ramfuncs:SysmTimers_delay_us)
000886d2 0000000e StatisticModuleExnded.obj (ramfuncs:_ZN23StatisticModuleExnded13prepareMeanIQEl)
000886e0 0000000e StatisticModuleExnded.obj (ramfuncs:_ZN23StatisticModuleExnded14prepareMeanInl)
000886ee 00000009 ExndedstPointManager.obj (ramfuncs:_ZN24ExndedstPointManager20calculaMinMaxValueERNS_20ExndedstPointDefE)
000886f7 00000009 ExndedstPointManager.obj (ramfuncs:_ZN24ExndedstPointManager20updaFaststPointsEv)
00088700 00000009 ExndedstPointManager.obj (ramfuncs:_ZN24ExndedstPointManager20updaSlowstPointsEv)
00088709 00000008 MotionControl.obj (ramfuncs:ADCINT_A1_ISR)
00088711 00000006 CanDriver.obj (ramfuncs:ECAN0INTB_ISR)
00088717 00000006 CanDriver.obj (ramfuncs:ECAN1INTB_ISR)
0008871d 00000003 Absoluncoder.obj (ramfuncs:_ZNK11EncoderBase11getPositionEv)
00088720 000000e2 IQmath_fpu32_eabi.lib : IQNtoa.obj (IQmath)
00088802 00000047 : IQ12div.obj (IQmath)
00088849 00000047 : IQ15div.obj (IQmath)
00088890 00000047 : IQ16div.obj (IQmath)
000888d7 00000047 : IQ17div.obj (IQmath)
0008891e 00000047 : IQ20div.obj (IQmath)
00088965 00000047 : IQ26div.obj (IQmath)
000889ac 00000042 : IQ16sqrt.obj (IQmath)
000889ee 00000032 : IQ28sin.obj (IQmath)
00088a20 00000030 : IQ28cos.obj (IQmath)
00088a50 0000002a : IQ26sinPU.obj (IQmath)
00088a7a 00000028 : IQ26cosPU.obj (IQmath)
00088aa2 00000016 : IQ16toF.obj (IQmath)
00088ab8 00000016 : IQ26toF.obj (IQmath)
00088ace 00000016 : IQ28toF.obj (IQmath)
00088ae4 00000009 : IQ16int.obj (IQmath)
00088aed 00000006 : iqntoa_get_frac_c.obj (IQmath)


完整的 cmd 文件在这里:

MEMORY
{
PAGE 0 :  /* Program Memory */
	D01SARAM		: origin = 0x00B000, length = 0x001000

	/* BEGIN is used for the "boot to FLASH" bootloader mode */
	BEGIN			: origin = 0x080000, length = 0x000002
	/* Flash sectors */
#ifdef BOOTLOADER
	/* IMAGE Header adress range */
	IMAGE_HEADER	: origin = 0x080010, length = 0x000010
	//FLASHA - FLASHC is used for Bootloader
	FLASHA  : origin = 0x080020, length = 0x001FE0  /* on-chip Flash */
	FLASHB  : origin = 0x082000, length = 0x002000  /* on-chip Flash */
	FLASHC  : origin = 0x084000, length = 0x001FFE  /* on-chip Flash, last two bytes of sector C are reserved for bootloader CRC */
#else
	/* IMAGE Header adress range */
	IMAGE_HEADER	: origin = 0x088000, length = 0x000010
	// FLASHE - FLASHN is used for Application
	FLASHE			: origin = 0x088010, length = 0x007FF0  /* 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 = 0x001FFE  /* on-chip Flash , last two bytes of sector N are reserved for bootloader CRC */
#endif

	// FLASHD is used for shared data
	FLASHD			: origin = 0x086000, length = 0x001C00  /* on-chip Flash */
	USEROTPEMU		: origin = 0x087C00, length = 0x000400  /* Mapping of the old user OTP memory */

	BOOTROM			: origin = 0x3FF27C, length = 0x000D44
	RESET			: origin = 0x3FFFC0, length = 0x000002

PAGE 1 : /* Data Memory */
	BOOT_RSVD		: origin = 0x000002, length = 0x000122 /* Part of M0, BOOT rom
	                                                    will use this for
	                                                    stack */

	M01SARAM		: origin = 0x000124, length = 0x0006D6  /* on-chip RAM */
	//   M01SARAM_RSVD      : origin = 0x0007F8, length = 0x000008     /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

	LS05SARAM		: origin = 0x008010, length = 0x003000 /* on-chip RAM */

	/* on-chip Global shared RAMs */
	BOOT_PARAMETER	: origin = 0x00C000, length = 0x000010
	RAMGS0			: origin = 0x00C010, length = 0x000FF0
	RAMGS1			: origin = 0x00D000, length = 0x001000
	//RAMGS2			: origin = 0x00E000, length = 0x001000 // Used for overlay
	RAMGS3			: origin = 0x00F000, length = 0x002000
	//RAMGS4			: origin = 0x010000, length = 0x001000 // merged with RAMGS3 to fit the DataLogger.obj
	RAMGS5			: origin = 0x011000, length = 0x001000
	RAMGS6			: origin = 0x012000, length = 0x001000
	RAMGS7			: origin = 0x013000, length = 0x000FF8
//   RAMGS7_RSVD : origin = 0x013FF8, length = 0x000008    /* Reserve and do not use for code as per the errata advisory "Memory: Prefetching Beyond Valid Memory" */

PAGE 2:    /* Program Memory Overlay1 (RAMGS2) */
	LOVERLAY		: origin = 0x00E000, length = 0x001000     /* BLDC motor specific programm area */

PAGE 3:    /* Program Memory Overlay2 (RAMGS2) */
	LOVERLAY		: origin = 0x00E000, length = 0x001000     /* FOC motor specific programm area */

PAGE 4:    /* Program Memory Overlay3 (RAMGS2) */
	LOVERLAY		: origin = 0x00E000, length = 0x001000     /* DC motor specific programm area */
}

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

    Robert:

    我想从新的.map 文件中不存在 code_start_branch.asm 开始;这个文件需要在启动时有正确的分支。  在.cmd 文件的最后一个片段中、我只看到"存储器"区域、而没有看到继续进行的"部分"区域。  我之前看了一些针对 EABI 编译项目的.cmd 文件、但我已经粘贴了我们的一个 C2000Ware 示例链接器文件、即作为参考编译的 EABI。

    您可以看到、与旧版 COFF 格式相比、EABI 的段名存在一些差异。  您还会看到一个分配、用于在"BEGIN"处放置 codestart、对于闪存引导、该分配的长度为0x80000、即2。  这是放置代码开始分支的位置。

    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
       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 : /* 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
       RAMGS9      : origin = 0x015000, length = 0x001000
       RAMGS10     : origin = 0x016000, length = 0x001000
    
    //   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     /* 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. */
    
       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              : > RAMM1       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
    
       Filter_RegsFile     : > RAMGS0,	   PAGE = 1
    
       SHARERAMGS0		: > RAMGS0,		PAGE = 1
       SHARERAMGS1		: > RAMGS1,		PAGE = 1
       SHARERAMGS2		: > RAMGS2,		PAGE = 1
       ramgs0           : > RAMGS0,     PAGE = 1
       ramgs1           : > RAMGS1,     PAGE = 1
    
    #ifdef __TI_COMPILER_VERSION__
        #if __TI_COMPILER_VERSION__ >= 15009000
            #if defined(__TI_EABI__)
                .TI.ramfunc : {} LOAD = FLASHD,
                                     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 = FLASHD,
                                 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 = FLASHD,
                             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 : > CPU1TOCPU2RAM, PAGE = 1
        {
            PUTBUFFER
            PUTWRITEIDX
            GETREADIDX
        }
    
        GROUP : > CPU2TOCPU1RAM, PAGE = 1
        {
            GETBUFFER :    TYPE = DSECT
            GETWRITEIDX :  TYPE = DSECT
            PUTREADIDX :   TYPE = DSECT
        }
    
       /* The following section definition are for SDFM examples */
       Filter1_RegsFile : > RAMGS1,	PAGE = 1, fill=0x1111
       Filter2_RegsFile : > RAMGS2,	PAGE = 1, fill=0x2222
       Filter3_RegsFile : > RAMGS3,	PAGE = 1, fill=0x3333
       Filter4_RegsFile : > RAMGS4,	PAGE = 1, fill=0x4444
       Difference_RegsFile : >RAMGS5, 	PAGE = 1, fill=0x3333
    }
    
    /*
    //===========================================================================
    // End of file.
    //===========================================================================
    */
    

    访问针对 F2837x 的最新 C2000Ware 示例也可能会有所帮助、这些示例是使用 EABI 输出选项构建的;您可以查看那里的.cmd 文件以了解是否存在一些其他差异。  我的本地路径为 C:\ti\c2000\C2000Ware_5_00_00\driverlib\f2837xd\examples\cpu1\

    我不熟悉 ADCRESULTD 文件、但我认为 cinit 表是用于您的闪存至 RAM 副本的 binit 位置。

    请告诉我您找到了什么、我们可以从那里开始。

    此致!
    马修

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

    马修

    感谢您投入时间并给予回复。

    您的 code_start_branch 的提示很有帮助。 我将 coff 映射文件与 eabi 映射文件进行了比较、实际上没有 code_start 条目或 CodeStartBranch.obj 文件的对象。 我现在想知道、目标文件缺失是怎么发生的? 我如何设置它、以生成它?
    关于内存和段区域、我尚未在 POST 中给出全部信息。 我们将各节和内存分成了单独的文件 、但不幸的是、我在帖子中并未区分这些文件。 以下已打过的是链接器文件的部分。 它完成了从我的初始帖子中抽取的最后一个代码。

    SECTIONS
    {
    	/* Allocate program areas: */
    	// data initialization section
    	.cinit			: > FLASHE | FLASHF | FLASHG | FLASHH | FLASHI |
    						FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0
    	// boot time initialization
    	.binit			: > FLASHE | FLASHF | FLASHG | FLASHH | FLASHI |
    						FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0
    	// C function initialization table
    	.init_array			: > FLASHE | FLASHF | FLASHG | FLASHH | FLASHI |
    						FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0
    	// text (program) section
    	.text			: >> FLASHE | FLASHF | FLASHG | FLASHH | FLASHI PAGE = 0
    
    	codestart		: > FLASHE PAGE = 0
    	ramfuncs		: LOAD = FLASHE | FLASHF | FLASHG | FLASHH | FLASHI |
    							 FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0
    					  RUN  = D01SARAM  PAGE = 0
    					  RUN_START(RamfuncsRunStart),
    					  LOAD_START(RamfuncsLoadStart),
    					  LOAD_SIZE(RamfuncsLoadSize)
    				{ -l IQmath_fpu32_eabi.lib
    						(IQmath)
    	            }
    
    #ifdef __TI_COMPILER_VERSION
    #if __TI_COMPILER_VERSION >= 15009000
    	.TI.ramfunc 	: LOAD = FLASHE | FLASHF | FLASHG | FLASHH | FLASHI |
    							 FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0,
    					  RUN  = LS05SARAM PAGE = 1,
    					  table(BINIT)
    #endif
    #endif
    
        /* Allocate uninitalized data sections: */
        // stack space
        .stack			: >  M01SARAM  | LS05SARAM    PAGE = 1 // > .stack output is not split
        // global variables
        .bss			: >> RAMGS0 | RAMGS1 | RAMGS3 | LS05SARAM  PAGE = 1 // >> .bss output is split
        // memory for malloc type functions
        .sysmem			: >  LS05SARAM | M01SARAM    PAGE = 1
        // console input/output functions
        .bss:cio		: >  LS05SARAM | M01SARAM    PAGE = 1
    
        /* Initalized sections go in Flash */
        // constant data
        .const			: > FLASHE | FLASHF | FLASHG | FLASHH | FLASHI |
        					FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0
    	// tables for switch statements
        .switch			: > FLASHE | FLASHF | FLASHG | FLASHH | FLASHI |
        					FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0
    	// argument buffer
        .args			: > FLASHE | FLASHF | FLASHG | FLASHH | FLASHI |
        					FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0
    	// reset vector
        .reset			: > RESET,     PAGE = 0, TYPE = DSECT /* not used, */
    
    	/*** BLDC specific overlay ***/
      	ramBlm			:	LOAD = FLASHJ,		PAGE = 0
    						RUN  = LOVERLAY,	PAGE = 2
    						RUN_START(ramBlmRunStart),
    						LOAD_START(ramBlmLoadStart),
    						LOAD_SIZE(ramBlmLoadSize)
    
    	/*** FOC motor specific overlay ***/
    	ramFoc			:	LOAD = FLASHJ,		PAGE = 0
    						RUN  = LOVERLAY,	PAGE = 3
    						RUN_START(ramFocRunStart),
    						LOAD_START(ramFocLoadStart),
    						LOAD_SIZE(ramFocLoadSize)
    
    	/*** DC motor specific overlay ***/
    	ramDcm			:	LOAD = FLASHJ, 		PAGE = 0
    						RUN  = LOVERLAY,	PAGE = 4
    						RUN_START(ramDcmRunStart),
    						LOAD_START(ramDcmLoadStart),
    						LOAD_SIZE(ramDcmLoadSize)
    
    	/* Section secureRamFuncs used by file SysCtrl.c */
    	secureRamFuncs	:	LOAD = FLASHE | FLASHF | FLASHG | FLASHH | FLASHI |
    							   FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN, PAGE = 0        /* Should be Flash */
                      		RUN  = LS05SARAM,    PAGE = 1        /* Must be CSM secured RAM */
    						RUN_START(secRamRunStart),
    						LOAD_START(secRamLoadStart),
    						LOAD_SIZE(secRamLoadSize)
    
    	IQmathTables	:	> FLASHE | FLASHF | FLASHG | FLASHH | FLASHI |
        					  FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN	PAGE = 0
    
    	.BootParameter	: > BOOT_PARAMETER, PAGE 1 /* begining of RAMGS0 */
    	.ImageHeader	: > IMAGE_HEADER, PAGE 0
    }
    

    我检查了 cmd 链接器文件、而且我们有一个条目  

    BEGIN			: origin = 0x080000, length = 0x000002

    memorymap.cmd 文件中。 那么、我要说这到目前为止是正确的。 你同意吗?

    同时、我将看看我们刚刚讨论的

    罗伯特·贝斯特

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

    Robert:

    感谢您添加这个额外的代码、在上述代码片段中、我可以在第16行看到该代码

    codestart      :> FLASHE 页面= 0

    这将在 FLASHE 中的某个位置分配 codestart。

    如果您将其更改为

    codestart      :> begin page = 0并且重建它将正确放置 code_start_branch。

    您可能需要手动将其添加到工程中、通常它会自动拉入、但只需确保它位于 C2000Ware 示例中的此处:

    C:\ti\c2000\C2000Ware_5_00_00\device_support\f2837xs+ common\source\F2837xS_CodeStartBranch.asm

    此致!
    马修

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

    感谢您的答复。

    我仔细检查你的 cmd 文件与我的,我已经尝试替换 FLASHE 与开始。 同样的问题、.map 文件中没有条目。

    在我们的固件中、我们在项目中有 CodeStartBranch.asm 文件。

    我发现、你在.cmd 文件中使用 align (8)。 我也尝试过这个方法、甚至连闪存都不起作用。 align (4)让 MCU 闪存、但仍然是 memcpy 崩溃的问题。

    此外、 编译器标志 --unused_section_elimination=off、在 eabi 模式下默认将其设置为 on。 可能是 CodeStartBranch.asm 文件刚在映射文件中被删除、因为它不是必需的?

    此致。

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

    Robert:

    您是否能够附加较旧的基于 COFF 的.map 文件和最新的 EABI Build .map 文件?  我认为这将帮助我跟踪缺少什么等等。  我有点犹豫为什么 codestartbranch 没有被放置。

    如果你能够附加两个.cmd 文件、这也会有所帮助。

    如果您在公共论坛上有问题、我也可以设立私人股票。

    此致!

    马修

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

    Matthew、您好!

    我向您发送了包含所请求文件的私人消息。

    同时、我可以设法将 CodeStartBranch 对象映射到存储器中。 需要使用-retain'_code_start'链接器命令手动保留对象。 然而,我不明白为什么它没有自动映射它,因为 codestartbranch 对象显然是必需的。

    我遇到了另一个问题:某些代码分配失败、之后程序再次停止执行。 这是出现它的代码缺口的地方:malloc 始终返回 NULL、并让应用程序稍后重新启动。 我不知道什么原因可能导致此问题。 我是否需要为 eabi 格式修改 SYS/BIOS 配置?

    static inline void* sysBiosHelperMalloc(size_t size)
    {
    	// Handle heap-overflow
    	// If the SYS/BIOS Config "Error Function" is defined, the SYS/BIOS will handle
    	// then heap-overflow.
    
    	void* p = malloc(size);
    	//LOG_printf( &trace, "new(%u) at %x", (Uint16)(size), (Uint16)((long)p) );
    	if (p == 0)
    	{
    		LOG_FATAL(eConfig_FunctionId, ErrorCode::eErrMemory, "OutOfMem");
    		Task_sleep(1000);
    		WatchDog::reboot();
    	}
    	return p;
    }

    此致

    罗伯特

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

    Robert:

    如果你右键单击项目并选择"properties"、然后导航到 C2000连接器-> Basic Options、这将显示以下屏幕(忽略我的堆大小、这是一个非 BIOS 示例)。  你可以评论堆栈和堆大小吗?  如果你增加堆、它是否解决了 malloc 问题?  由于您正在使用 BIOS、我想知道这是否也与原始问题有关。

    如果 BIOS 堆(在 BIOS 中)有一个独立变量、请检查一下。  我将看看我能否请一位 BIOS 专家来了解以上内容、从而了解您的问题是否与此处的关系。

    此致!
    马修

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

    Matthew、您好!

    感谢您的答复。 我添加了 C2000链接器的屏幕截图。 由于使用的是 SYS/BIOS、因此我们未在其中定义堆大小。 到目前为止、SYS/BIOS 无论如何都会覆盖连接器的堆大小。

    不过、我们在.cfg 文件中将堆大小从9216增加到了10496 (BIOS.heapSize = 10496;)、但它仍然没有分配内存。 尽管我们在.bss 段中看到 taskStackSection 有所增加。 为什么在 taskStackSection 中映射堆? 这 根本没有道理、我需要一个堆对象。

    我正在考虑利用 MS 团队召开一次会议、继续讨论这个问题、因为我们都花了一些时间来讨论这个问题。

    此致、

    罗伯特

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

    谢谢 Robert、我让一位同事也来看看这篇帖子。  我们将立即跟进。

    马特

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

    您好、Matt

    是否有任何更新? 我仍然面临同样的问题。

    此致

    罗伯特

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

    Robert:

    您可以用以下版本回复吗?

    1. C2000Ware 中提供
    2. SYSBIOS
    3. Code Composer Studio

    您还可以附加 SYSBIOS 配置文件(.cfg)以便我们可以查看这些设置吗?

    重新读取该线程后、只想对 code_start_branch.asm 进行注释;"retain"是我们缺失的部分。  由于这是通过将其位置地址放置在闪存中的闪存引导位置来自动调用的函数、因此没有正式"使用"该函数、因此 EABI 会优化该函数。 此外、还可以将 retain 放到.asm 中。  我附上了最新的 C2000Ware、以防您要为此交换您的现有文件。  还允许将看门狗设置为"off"、因为 EABI 的初始化时间比 COFF 长得多。

    e2e.ti.com/.../F2837xD_5F00_CodeStartBranch.asm

    此致!

    马修

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

    Matthew、您好!

    再次感谢您与我取得联系。

    是的、我发现、可以通过链接器标志(--retain='_code_start')或者像您提供的那样在 CodeStartBranch.asm 文件中插入.retain 来保存 code_start 段。 我还想提一下,我们的 CodeStartBranch.asm 文件看起来和你的完全一样,但我们使用了--retain 标志 而不是.retain 命令。 此外、我们使用_code_start 作为分支、而不是像您那样使用 code_start。 当然、我们通过将 WD_DISABLE 设置为1来禁用看门狗。 这里有另一个线程提出了该解决方案。

    我现在感到困惑。 您在上一篇文章中提到、映射文件中缺少 codestartbranch、这是错误的。 但现在您说、eabi 不是真正需要它、因此需要手动保留它? 如果是这样、您提供的迁移指南中缺少此信息、我建议添加一个注释、说明必须在文件的部分下面添加.retain。

    这是我们的.cfg 文件:

    e2e.ti.com/.../TeMotion_5F00_II.cfg

    我们的版本:

    编译器/连接器版本:V22.6.1

    Code Composer Studio:v12.5

    SYS/BIOS:V6.83.00.18

    XDC 工具:V3.61.02.27

    我们正在使用 RTS 库 rts2800_fpu32_eabi.lib。

    我不太确定、C2000软件是指什么、我曾尝试尽可能多地提供信息。

    此致

    罗伯特

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

    Robert:

    让我澄清 code_start_branch.asm 方面、我想我对上一篇文章不清楚:

    为了使引导方面正常工作、需要100%放置该文件/ASM。  缺少该函数的原因是 EABI 如何删除"未使用"函数。  由于函数 code_start_branch() 从未被任何其他函数 EABI "认为"明确调用,因此 没有必要。  

    EABI 不知道/理解的是、在闪存启动期间仍有一个引导矢量被提取、因此我们将 CODE_START_BRANCH 的地址放在该位置、所以需要它。  同意迁移指南中需要更好地记录这一点。

    您将查看您在工具版本中发送的信息并返回给您。

    C2000Ware 是我们统一的软件支持产品、其中包含所有基本模块.c 和.h 文件以及示例等。  如果我们知道这一点、就可以更好地了解您在构建项目时使用的器件文件的版本。

    默认情况下安装在此路径 C:\ti\c2000\中 、您应该会在计算机上看到一个或多个类似以下内容的文件夹。  

    此致!

    马修

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

    Matthew。

    好的、很清楚。

    我已经使用 C2000Ware_4_30_00_00有一段时间了、最近我下载了 C2000Ware_5_00_00_00以获取您在上一篇文章中提到的 eabi 格式的最新示例。

    罗伯特·贝斯特

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

    有任何相关更新?

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

    Robert:

    您是否曾尝试在 CCS 中使用此工具: ROV  这或许能够提供一些见解、以了解我们执行代码时会发生什么中断。

    此致!

    马修

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

    Matthew、您好!

    是的、我尝试使用 ROV。 但是、我们的应用甚至不会进入主函数、因此 ROV 甚至不会启动。
    为了将我尝试的 ROV 与 SYS/BIOS 的一个示例项目进行比较。 这种情况仍然有效、应用程序将跳转到 MAIN、而 ROV 将启动。

    您是否与同事讨论过?

    此致

    罗伯特

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

    尊敬的 Robert:

    项目是否曾在 CCS 调试中启动至 NMI 处理程序? 另一件要确保禁用看门狗计时器标志工程 CMD 文件的事情。  

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

    尊敬的 Genatco:

    感谢您联系我。 我不是很确定,如果我理解正确。

    我在 Isr_Bios 45c.c 文件中的第50行设置一个断点:

    未到达 Stop cmd、该应用程序之前崩溃。

    此外、如果我理解您是说 CodeStartBranch.asm 文件中的看门狗标志吗? 如果是、我反复检查了几次、因为您的同事提到了它。 通过将标志设定为1、安全装置一直被禁用。

    我希望这可以解答您的问题。

    罗伯特·贝斯特

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

    我想分享其他结果。  

    我查看了 RESC 寄存器并将结果与我们的 COFF 格式进行了比较。 两种格式在 RESC 寄存器中具有相同的值、这意味着引脚状态位和 WDRSn 位都被置位。

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

    我还发现了使用我们的 eabi 格式启用的 NMIE 位、该位会崩溃:

    如果我将其与我们的 coff 格式和一个具有 SYS/BIOS 的基本 eabi-example 进行比较、结果看起来就像

    这是否会导致问题? 我在另一个帖子(https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1008481/tms320f280049-nmiwdrs-default-and-how-to-disable-if-boot-rom-makes-it-enabled)中看到的内容
    无法禁用它。  

    罗伯特

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

    Robert:

    我将在 E2E 聊天中向您发送一条私人消息、让我们看看电话会议或代码共享是否是正确的路径。

    此致!

    马修

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

    尊敬的 Robert:

    确定 RESC 显示 WDRSn 位被设置、看门狗计时器正在驱动 ROM 引导加载程序处理程序中的 NMI。 显然、我们不需要在 NMI_ISR 处理程序中添加断点、当发生未处理的 NMI 异常时、它会在调试中弹出。 通过 CPU 显然有效的 HLT 指令,CCS 调试可能没有显示进入 STOP ()的下一个仿真器步骤。 好奇是否在*。asm 启用 WD 且 NMI 在恢复调用堆栈中停止的位置、单击顶部到底行、向后查看执行了哪些函数。

    也许检查#pragma 段、调整 eabi 编译函数的优化速度设置、您怀疑这些函数可能会使 LSRAM 的速度提高崩溃。 可能是 mcopy (.TI.ramfunc)段导致崩溃。   

    #pragma function_options (MyNewFunction、"--opt_level=1 --opt_for_speed=2")

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

    Robert:

    会在 BootROM 本身中设置 NMIE 位。 当你检查 NMIE 的值, PC 指向哪里? 执行 BootROM 本身时、两种情况下都发生了故障。 您是否已查看 NMISHDFLG 寄存器以了解是否触发了任何错误? 您还可以检查地址0x2处的引导状态以查看引导流程。

    此致、

    维维克·辛格

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

    作者:Vivek、

    我看了看你的想法。 NMISHDFLG 没有触发错误。
    我同意您的说法、即 BootROM 中的某个时间会失败、

    罗伯特·贝斯特

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

    您是否也检查 BootROM 状态? 这有什么价值?

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

    Hei Vivek、感谢您的回复。

    我在地址0x2处检查了它、它始终为0。 我从未见过地址0x2的值发生变化。

    希望能为您提供一些信息。

    罗伯特·贝斯特

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

    Robert 和我正在这个论坛上工作、一旦我们取得了一些进展、我们会回复、以便其他人知道我们发现了什么。

    此致!

    马修