我有一个大型、复杂的项目、该项目中的一段代码使用动态内存分配。 有时,当我更改代码的不相关部分时,这会导致具有动态内存分配的部分中的 FREE()函数永远不会返回。 我要修改的不相关代码是.ebss 存储器块中的一个大型静态结构。 在项目设置中堆大小定义为0x2000、.esysmem 块映射到 RAMGS0-1、我已将其配置为从地址0xC000开始的0x2000大小块。 .ebss 位于 RAMGS3-10中(长度0x8000、从0xF000开始)。
是否有什么可能导致 free()崩溃的想法? 或有关如何调试它的建议?
以下是我的 cmd 文件。
//######################################################################################################################## // ////文件:dual_axis_f2837x_flash_lnk_cpu1.cmd.cmd // ////########################################################################## //$TI 发布:MotorControl SDK v3.00.01.00美元 //$发布 日期:星期二5月26日19:13:59 CDT 2020 $ //版权所有: //版权所有(C) 2017-2020德州仪器(TI)公司- http://www.ti.com/ // 只要 满足以下条件,就允许以源代码和二进制形式重新分发和使用//修改或不修改//: // //重新分发源代码必须保留上述版权 //声明、此条件列表和以下免责声明。 // //二进制形式的再发行必须复制上述版权 //声明、此条件列表和// 分发随附的//文档和/或其他材料中的以下免责声明。 //// 未经 事先书面许可,不能使用德州仪器公司的名称或//其贡献者的名称来认可或推广源自此软件的产品//。 //// 本软件由版权所有者和贡献者提供 //“按原样”,不 承认任何明示或暗示的保证,包括但不限于//适销性和对//特定用途适用性的暗示保证。 在任何情况下、版权 //所有者或贡献者都不对任何直接、间接、偶然、 //特殊、模范、 或相应的损害(包括但不 限于采购替代产品或服务;丧失使用、 //数据或利润; 或业务中断)、无论 出于何种原因使用 本软件(即使被告知可能会造成此类损坏)、还是出于任何原因而产生的任何//责任理论(无论是合同、严格责任还是侵权行为)//(包括疏忽或其他)。 //$ //######################################################################################################################## //除了这个内存连接器命令文件之外, //将头连接器命令文件直接添加到项目中。 //将 //外设结构链接到 //内存映射中的适当位置需要使用头链接器命令文件。 // //对于 BIOS 应用程序,添加: F28004x_Headers_BIOS.cmd //对于非 BIOS 应用添加:F28004x_Headers_nonBIOS.cmd // 如果使用 // CLA C 编译器 //项目属性-> C2000链接器->高级选项->命令文件 //预处理->--,用户必须在项目链接器设置中定义 CLA_C define #ifdef CLA_C //定义 将由 CLA 编译器用于局部符号和 temps 的 CLA 暂存区的大小 //还强制引用标记 了//暂存区的特殊符号。 CLA_ScratchPad_size = 0x100; --undef_sym=__cla_scratchpad_end --undef_sym=_cla_scratchpad_start #endif //cla_C MEMORY { PAGE 0://程序存储器*/ /*内存(RAM/FLASH)块可移动到 Page1进行数据分配*/ /* begin 用于"引导至闪存"引导加载程序模式*/ begin:origin = 0x080000、length = 0x000002 RAMM0:origin = 0x000123,length = 0x0002DD RAMD0:origin = 0x00B000、length = 0x000800 RAMLS0:origin = 0x008000、length = 0x001800 // 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 /*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 */ RAMGS15 :origin = 0x01B000、length = 0x000FF8 /*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 // RAMGS15_RSVD :origin = 0x01BFF8,length = 0x000008 //保留并不用于代码,根据勘误咨询“内存:有效内存之外的预取”*/ 重置:origin = 0x3FFFC0、length = 0x000002 //闪存扇区*/ 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 = 0x001FF0/*片上闪存*/ // FLASHN_RSVD :origin = 0x0BFFF0,length = 0x000010 //根据勘误咨询“Memory:Prepetching Beyond valid Memory”(内存:有效内存之外的预取)来保留并不用于代码*/ 页1:/* Data Memory */ /*内存(RAM/FLASH)块可移动到 PAGE0进行程序分配*/ BOOT_RSVD :origin = 0x000002、length = 0x000121 // M0的一部分,引导 ROM 将此用于栈*/ RAMM1 :origin = 0x000400、length = 0x0003F8 /*片上 RAM 块 M1 *// RAMM1_RSVD :origin = 0x0007F8,length = 0x000008 /*根据勘误咨询"Memory:Prepetching Beyond Valid Memory"(内存:有效内存之外的预取)来保留和不用于代码*/ RAMD1 :origin = 0x00B800,length = 0x000800 RAMLS5 :origin = 0x00A800,length = 0x000800 RAMGS0 :origin = 0x00C000、length = 0x002000 // RAMGS1 :origin = 0x00D000、length = 0x001000 RAMGS2 :origin = 0x00E000、length = 0x001000 RAMGS3 :origin = 0x00F000、length = 0x008000 // 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 //取消对 F28374D、F28376D 器件的注释*// RAMGS11_RSVD:origin = 0x017FF8,length = 0x000008 //根据勘误表中的“Memory:Prepetching Beyond valid Memory”*/ RAMGS11保留并不用于代码 :origin = 0x017000,length = 0x003000 /*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 */ / RAMGS12 :origin = 0x018000、length = 0x001000 /*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 */ / RAMGS13 :origin = 0x019000、length = 0x001000 /*仅在 F28379D、F28377D、F28375D 器件上可用。 移除其他设备上的线路。 // CPU2TOCPU1RAM:origin = 0x03F800,length = 0x000400 CPU1TOCPU2RAM:origin = 0x03FC00,length = 0x000400 CLA1_MSGRAMLOW:origin = 0x001480,length = 0x000080 CLA1_MSGRAMHIGH:origin = 0x001500,length = 0x000080 */*分配程序区域 :> FLASHG PAGE = 0,align (8) .text :>> FLASHB | FLASHH | FLASHI | FLASHJ | FLASHK | FLASHL | FLASHM | FLASHN PAGE = 0,ALIGN (8) codestart :>开始页= 0,align (8) /*分配未初始化的数据段:*/ .stack :> RAMM1 PAGE = 1. switch :> FLASHG PAGE = 0,align (8) .reset :>重置,PAGE = 0,TYPE = DSECT //未使用,*/ DMARAML4:>RAMGS2 PAGE = 1 #if defined (__TI_EABI __) .init_array :> FLASHG,PAGE = 0, align (8) .bss :> RAMLS5,page = 1.bss :output :> RAMLS3,页= 0 .bss:CIO :> RAMLS5,page = 1.data :> RAMLS5,page = 1 .sysmem :> RAMLS5,page = 1/* 初始化段进入 Flash */ .const :> FLASHG,PAGE = 0, align (8) #else .pinit :> FLASHG,PAGE = 0, align (8) .ebss :> RAMGS3,page = 1 .esysmem :> RAMGS0,PAGE = 1.CIO :> RAMLS5,page = 1/* 初始化段进入 Flash */ .econst :> FLASHG PAGE = 0,align (8) #endif // Filter_RegsFile :> RAMGS0,PAGE = 1 // SHARERAMGS0:> RAMGS0,PAGE = 1 // SHARERAMGS1:> RAMGS1,PAGE = 1 // ramgs0 :> RAMGS0, PAGE = 1 // ramgs1 :> RAMGS1、 PAGE = 1/* 闪存编程缓冲器*/ BufferDataSection:>RAMD1,PAGE = 1,ALIG(8) MSGRAM_CPU1_TO_CPU2:>CPU1TOCPU2RAM,type=NOINIT MSGRAM_CPU2_TO_CPU1:>CPU2TOCPU1RAM,type=NOINIT /* CLA 特定部分*/ #if defined (__TI_EABI __) Cla1Prog :LOAD = FLASHF、 运行= RAMLS4、 Load_start (Cla1funcsLoadStart)、 LOAD_END (Cla1funcsLoadEnd)、 run_start (Cla1funcsRunStart)、 load_size (Cla1funcsLoadSize)、 align (8) #else Cla1Prog :LOAD = FLASHF、 运行= RAMLS4、 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 = FLASHB、 run = RAMLS0、 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 = FLASHB、 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 其他 组{ramfuncs{-l F021_API_F2837xD_FPU32.lib}} 负载= FLASHB、 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 Cla1ToCpuMsgRAM:>CLA1_MSGRAMLOW,type=NOINIT CpuToCla1MsgRAM:>CLA1_MSGRAMIGH,type=NOINIT /* SFRA 特定段*// SFRA_F32_Data:>RAMGS9,=CLA/ CLA / CLA 已分配内存/#64个字 段/ CLA / CLA 必须对齐 : {*。obj (CLAscratch) 。 += CLA_ScratchPad_size; *。obj (CLAscratch_end)}> RAMLS3 .scratchpad :> RAMLS3 .bss_cla :> RAMLS3 #if defined (__TI_EABI __) .const_cla :LOAD = FLASHF、 运行= RAMLS3、 RUN_START (Cla1ConstRunStart)、 Load_start (Cla1ConstLoadStart)、 load_size (Cla1ConstLoadSize)、 align (8) #else .const_cla :LOAD = FLASHF、 运行= RAMLS3、 run_start (_Cla1ConstRunStart)、 Load_start (_Cla1ConstLoadStart)、 load_size (_Cla1ConstLoadSize)、 PAGE = 0 #endif #endif //cla_C //使用 IPC API 驱动程序时需要以下段定义*/ 组:> CPU1TOCPU2RAM,PAGE = 1 { PUTBUFFER PUTWRITEIDX GETREADIDX } 组:> CPU2TOCPU1RAM,PAGE = 1 { GETBUFFER:TYPE = DSECT GETWRITEIDX:TYPE = DSECT PUTREADIDX:TYPE = DSECT } }