主题中讨论的其他器件:C2000WARE
工具/软件:Code Composer Studio
大家好、我正在尝试调试一个困难的问题、想知道这里是否有人对这个问题有任何见解。 我的固件应用程序在闪存之外运行。 我的链接器文件中有一个错误、其中.pinit 段映射到 RAM 而不是闪存。 这样做的结果是、当我对代码进行编程/调试时、我的代码可以正常运行、但当我对电路板进行下电上电并从闪存引导时、我的所有全局对象(C++类)都未正确初始化。
修复此错误以使.pinit 映射到闪存而不是 RAM 后、当我从调试器加载程序时、我的程序仍然正常运行、 但是、当我对电路板进行下电上电并从闪存引导时、没有发生任何事情、如所示、根据 LED 切换判断、即使主代码的前几行似乎也没有执行。 然后、我对几个全局对象进行了注释、当我只有少数几个定义了程序运行时、 但是、当我通过特定的全局对象阈值时、具体来说、哪一个对象无关紧要、什么都不运行、CPU 似乎在到达前几行 main 之前被锁定。
我将在这里附加我的 cmd 文件。 如果您有任何关于如何进一步调试此功能的建议、我们将不胜感激。
#ifdef CLA_C //定义将由 CLA 编译器用于局部符号和 temps 的 CLA 暂存区的大小 //还强制引用标记 了//暂存区的特殊符号。 CLA_ScratchPad_size = 0x100; --undef_sym=__cla_scratchpad_end --undef_sym=_cla_scratchpad_start #endif //cla_C MEMORY { /* begin 用于"引导至闪存"引导加载程序模式*/ begin :origin = 0x080000、length = 0x000002 boot_RSVD :origin = 0x000002、length = 0x0001AE // M0的一部分,引导 ROM 将此用于栈*/ RAMM0 :origin = 0x0001B0、length = 0x000250 RAMM1 :origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 *// RAMD0 :origin = 0x00C000、length = 0x000800 // RAMD1 :origin = 0x00C800,length = 0x000800 RAMD0_1 :origin = 0x00C000、length = 0x001000 // RAMLS0 :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 RAMLS5 :origin = 0x00A800,length = 0x000800 RAMLS6 :origin = 0x00B000、length = 0x000800 RAMLS7 :origin = 0x00B800,length = 0x000800 RAMGS0 :origin = 0x00D000、length = 0x005000 // RAMGS0 :origin = 0x00D000、length = 0x001000 // RAMGS1 :origin = 0x00E000、length = 0x001000 // RAMGS2 :origin = 0x00F000、length = 0x001000 // RAMGS3 :origin = 0x010000,length = 0x001000 // RAMGS_4 :origin = 0x011000,length = 0x004000 // RAMGS4 :origin = 0x011000,length = 0x001000 RAMGS5 :origin = 0x012000,length = 0x004000 // 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 = 0x005000 // 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 = 0x001000 //闪存扇区*/ FLASHA :origin = 0x080002、length = 0x001FFE//片上闪存*/ FLASHB :origin = 0x082000、length = 0x002000//片上闪存*/ FLASHC :origin = 0x084000、length = 0x002000//片上闪存*/ FLASHD :origin = 0x086000、length = 0x002000//片上闪存*/ FLASHE :origin = 0x088000、length = 0x008000//片上闪存*/ FLASHF :origin = 0x090000、length = 0x008000//片上闪存*/ FLASHG :origin = 0x098000、length = 0x008000//片上闪存*/ FLASHH :origin = 0x0A0000、length = 0x008000//片上闪存*/ FLASHI :origin = 0x0A8000、length = 0x008000//片上闪存*/ FLASHJ :origin = 0x0B0000、length = 0x008000//片上闪存*/ FLASHK :origin = 0x0B8000、length = 0x002000//片上闪存*/ FLASHL :origin = 0x0BA000、length = 0x002000//片上闪存*/ FLASHM :origin = 0x0BC000、length = 0x002000//片上闪存*/ FLASHN :origin = 0x0BE000、length = 0x002000//片上闪存*/ CPU1TOCPU2RAM:origin = 0x03A000、length = 0x000800 CPU2TOCPU1RAM:origin = 0x03B000、length = 0x000800 CANA_MSG_RAM :origin = 0x049000、length = 0x000800 CANB_MSG_RAM :origin = 0x04B000、length = 0x000800 复位 :origin = 0x3FFFC0、length = 0x000002 CLA1_MSGRAMLOW:origin = 0x001480、length = 0x000080 CLA1_MSGRAMHIGH:origin = 0x001500、length = 0x000080 } SECTIONS { codestart :>开始,align (4) .text :>> FLASHB | FLASHH | FLASHI | FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN、ALIGN (4) .cinit :> FLASHG,ALIGN (4) .switch :> FLASHG,align (4) .reset :>重置,类型= DSECT /*未使用,*/ .stack :> RAMM1 DMARAML4:> RAMGS0 #if defined (__TI_EABI __) .init_array :> FLASHG,ALIGN (8) .bss :> RAMGS0、ALIGN (4) .bss:输出 :> RAMLS0,align(4) .bss:CIO :> RAMLS0 .data :> RAMLS0 .sysmem :> RAMLS0/* 初始化段进入闪存*/ .const :> FLASHG、align (8) #else .pinit :> FLASHG,align (8) .ebss :> RAMGS0 .esysmem :> RAMGS10,ALIG(8) .cio :> RAMLS6 | RAMLS7,align(8) //初始化段进入闪存*/ .econst :> FLASHG、ALIGN (8) #endif //闪存编程缓冲器*/ BufferDataSection:> RAMLS5、ALIGN (8) MSGRAM_CPU1_TO_CPU2:> CPU1TOCPU2RAM,type=NOINIT MSGRAM_CPU2_TO_CPU2 :> CPU2TO_CPU1,type=NOINIT /* CLA 特定部分*/ #if defined (__TI_EABI __) Cla1Prog :LOAD = FLASHF、 运行= RAMLS4 | RAMLS5、 Load_start (Cla1funcsLoadStart)、 LOAD_END (Cla1funcsLoadEnd)、 run_start (Cla1funcsRunStart)、 load_size (Cla1funcsLoadSize)、 align (8) #else Cla1Prog :LOAD = FLASHF、 运行= RAMLS4 | RAMLS5、 load_start (_Cla1funcsLoadStart)、 load_end (_Cla1funcsLoadEnd)、 run_start (_Cla1funcsRunStart)、 load_size (_Cla1funcsLoadSize)、 align (8) #endif ClaData:> RAMLS3 #ifdef __TI_Compiler_version__ #if __TI_Compiler_version__>=15009000 #if defined (_TI_EABI) 组{.TI.ramfunc{-l F021_API_F2837xD_FPU32.lib} load = FLASHD、 run = RAMD0_1 | RAMGS5、 load_start (RamfuncsLoadStart)、 load_size (RamfuncsLoadSize)、 load_end (RamfuncsLoadEnd)、 run_start (RamfuncsRunStart)、 run_size (RamfuncsRunSize)、 run_end (RamfuncsRunEnd)、 page = 0、align (8) 其他 组{.TI.ramfunc{-l F021_API_F2837xD_FPU32.lib} load = FLASHD、 run = RAMD0_1 | RAMGS5、 load_start (_RamfuncsLoadStart)、 load_size (_RamfuncsLoadSize)、 load_end (_RamfuncsLoadEnd)、 run_start (_RamfuncsRunStart)、 run_size (_RamfuncsRunSize)、 run_end (_RamfuncsRunEnd)、 page = 0、align (8) #endif 其他 组{ramfuncs{-l F021_API_F2837xD_FPU32.lib}} load = FLASHD、 //run = RAMLS0、 run = RAMD0_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 Cla1ToCpuMsgRAM:>CLA1_MSGRAMLOW,type=NOINIT CpuToCla1MsgRAM:>CLA1_MSGRAMIGH,type=NOINIT /* SFRA 特定段*/ SFRA_F32_Data:>RAMGS9,CLA = 64 * 必须 为 CLA 分配内存/ CLA / CLA 访问#64 / CLA / CLA * : {*。obj (CLAscratch) 。 += CLA_ScratchPad_size; *。obj (CLAscratch_end)}> RAMLS2 .scratchpad :> RAMLS2 .bss_cla :> RAMLS2 #if defined (__TI_EABI _) .const_cla :LOAD = FLASHF、 运行= RAMLS6、 RUN_START (Cla1ConstRunStart)、 Load_start (Cla1ConstLoadStart)、 load_size (Cla1ConstLoadSize)、 align (8) #else .const_cla :LOAD = FLASHF、 运行= RAMLS6、 run_start (_Cla1ConstRunStart)、 Load_start (_Cla1ConstLoadStart)、 load_size (_Cla1ConstLoadSize)、 align (8) #endif #endif //cla_C //使用 IPC API 驱动程序时需要以下段定义*/ 组:> CPU1TOCPU2RAM { PUTBUFFER PUTWRITEIDX GETREADIDX } 组:> CPU2TOCPU1RAM { GETBUFFER:TYPE = DSECT GETWRITEIDX:TYPE = DSECT PUTREADIDX:TYPE = DSECT } }
