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.
工具/软件:Code Composer Studio
我遇到了无法将堆大小扩展到0x800之后的问题。 它的默认值为0x400,我可以使用“属性”->“链接器”->“常规”设置将其设置为0x600。 有可用的164 KB RAM,我不确定需要在.lnk文件中更改什么才能访问更多RAM。
这是我在尝试使用堆大小0x800和堆栈大小0x200时收到的错误
****生成配置调试项目Example_2.8377万SLaunchPad **** “D:\ti\\ccsv7\\utils\\bin\\gmake”-k -j 16 all -O 'Building target:example_2.8377万SLaunchPad.out ' 正在调用:C2000 Linker'...... >>编译失败 makefile:180:目标'Example_2.8377万SLaunchPad.out的配方失败 :“D:/ti/device_support/F2837xS/v180/F2837xS_common/Cmd/2837xS_Generic_flash_lnk.cmd”2837”第2837第80行:错误: 程序将不适合可用内存。对 齐CIO.0x120/1部分无法进行定位。 可用 内存范围: RAMLS5 大小:0x800 未使用:0x0 最大孔数:0x0 CIO :> RAMLS5 Page =1 错误:链接时出错;"Example_2.8377万SLaunchPad.ut"未 构建 gmake[1]:***[example_2.8377万SLaunchPad.ut]错误1 gmake:***[All]错误2 makefile:176:目标'All'的配方失败 ****构建完成****
这是链接文件,但我不太熟悉,也不确定需要更改的内容。
内存 { 第0页:/*程序内存*/ /*内存(RAM/flash)块可移动到Page1以进行数据分配*/ /* begin用于“引导至闪存”引导加载程序模式*/ begin :原点= 0x8万,长度= 0x0.0002万 RAMM0 :原点= 0x0.0122万,长度= 0x0002DE RAMD0 :Origin = 0x00B000,length = 0x0.08万 RAMLS0 :原点= 0x0.8万,长度= 0x0.08万 RAMLS1 :原点= 0x0.88万,长度= 0x0.08万 RAMLS2 :原点= 0x0.9万,长度= 0x0.08万 RAMLS3 :原点= 0x0.98万,长度= 0x0.08万 RAMLS4 :原点= 0x00A000,长度= 0x0.08万 重置 :原点= 0x3FFFC0,长度= 0x0.0002万 /*闪存扇区*/ FLASHA :原点= 0x8.0002万,长度= 0x001FFE /*片上闪存*/ FLASHB :原始= 0x8.2万,长度= 0x0.2万 /*片上闪存*/ FLASHC :原点= 0x8.4万,长度= 0x0.2万 /*片上闪存*/ FLASHD :原点= 0x8.6万,长度= 0x0.2万 /*片上闪存*/ FLASHE :原点= 0x8.8万,长度= 0x0.8万 /*片上闪存*/ FLASHF :原始= 0x9万,长度= 0x0.8万 /*片上闪存*/ FLASHG :原始= 0x9.8万,长度= 0x0.8万 /*片上闪存*/ FLASHH :原始= 0x0A0000,长度= 0x0.8万 /*片上闪存*/ FLASHI :原点= 0x0A8000,长度= 0x0.8万 /*片上闪存*/ FLASHJ :原始= 0x0B0000,长度= 0x0.8万 /*片上闪存*/ FLASHK :原点= 0x0B8000,长度= 0x0.2万 /*片上闪存*/ FLASHL :原点= 0x0BA000,长度= 0x0.2万 /*片上闪存*/ FLASHM :原点= 0x0BC000,长度= 0x0.2万 /*片上闪存*/ FLASHN : Origin = 0x0BE000,length = 0x0.2万 /*片上闪存*/ 第1页:/*数据存储器*/ /*内存(RAM/flash)块可以移动到PAGE0以进行程序分配*/ BOOT_RSVD :原点= 0x0.0002万,长度= 0x0.012万 /* M0的一部分,引导ROM将使用此堆栈*/ RAMM1 :原点= 0x0.04万,长度= 0x0.04万 /*片上RAM块M1 */ RAMD1 :原点= 0x00B800,长度= 0x0.08万 RAMLS5 :原点= 0x00A800,长度= 0x0.08万 RAMGS0 :原点= 0x00C000,长度= 0x0.1万 RAMGS1 :原点= 0x00D000,长度= 0x0.1万 RAMGS2 :原点= 0x00E000,长度= 0x0.1万 RAMGS3 :原点= 0x00F000,长度= 0x0.1万 RAMGS4 :原点= 0x1万,长度= 0x0.1万 RAMGS5 :原点= 0x1.1万,长度= 0x0.1万 RAMGS6 :原点= 0x1.2万,长度= 0x0.1万 RAMGS7 :原点= 0x1.3万,长度= 0x0.1万 RAMGS8 :原点= 0x1.4万,长度= 0x0.1万 RAMGS9 :原点= 0x1.5万,长度= 0x0.1万 RAMGS10 :原点= 0x1.6万,长度= 0x0.1万 RAMGS11 : Origin = 0x1.7万,length = 0x0.1万 } 节 {/* 分配程序区域:*/ .cinit :> FLASHB 页面= 0,对齐(4) 。\n定位 :> FLASHB, 页面= 0,对齐(4) .text :>> FLASHB | FLASHC | FLASHD | FLASHE 页面= 0,对齐(4) 代码开始 :>开始 页面= 0,对齐(4) ramfuncts :负载= FLASHD, RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3, load_start(_RamfuncsLoadStart), load_size (_RamfuncsLoadSize), load_end (_RamfuncsLoadEnd), run_start(_RamfuncsRunStart), Run_Size (_RamfuncsRunSize), Run_End(_RamfuncsRunEnd), 页面= 0,对齐(4) /*分配未初始化的数据段:*/ .stack :> RAMM1. 页面= 1 .ebss :>> RAMLS5 | RAMGS0 | RAMGS1 页面= 1 个.esysmem :> RAMLS5 页面= 1 。CIO :> RAMLS5 页面= 1 /*初始化部分进入Flash */ .econst :>> FLASHF | FLASHG | FLASHH 页面= 0,对齐(4) .switch :> FLASHB 页面= 0,对齐(4) 重置 :>重置, Page =0,type = DSECT /*未使用,*/ #ifdef __TI_Compiler_version #if __TI_Compiler_version >= 1500.9万 .TI.ramfunc:{} load = FLASHD, RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3, load_start(_RamfuncsLoadStart), load_size (_RamfuncsLoadSize), load_end (_RamfuncsLoadEnd), run_start(_RamfuncsRunStart), Run_Size (_RamfuncsRunSize), Run_End(_RamfuncsRunEnd), Page =0,align(4) #endif #endif ramgs0 :> RAMGS0,页面= 1 ramgs1. :> RAMGS1,第= 1页 /*以下部分定义适用于SDFM示例*/ Filter1_RegsFile :> RAMGS1, page =1, Fill=0x1111 Filter2_RegsFile :> RAMGS2, page =1,Fill=0x2222 Filter3_RegsFile :> RAMGS3, page =1,Fill=0x3333 Filter4_RegsFile :> RAMGS4, RegsFile =0x44: >RAMGS5, 页面=1,填充=0x3333 }/* //=================================================== //文件结束。 //=========================================================================================================================================== */
Kyle Stoudt 说:这是我在尝试使用0x800堆大小和0x200堆栈大小时收到的错误[/QUOT]
堆进入名为.esysmem的内存部分。 链接程序命令文件将.esysmem和.cio分配给长度只有0x800的RAMLS5内存。 因此,当您将堆大小设置为0x800时,.esysmem部分将单独使用所有RAMLS5,因此没有空间分配给同一内存区域中的.CIO部分。 因此,您将看到错误消息。
您可以编辑链接程序命令文件,将.cio分配给不同的内存区域,如RAMD1或任何其他RAM区域:
CIO :> RAMD1. 页面= 1.
请注意,如果将堆大小增加到0x800以上,则RAMLS5也不适合。 然后,您需要将.esysmem部分移动到更大的RAM区域。 您还可以将连续的RAM区域组合成一个较大的RAM区域,以便能够将较大的部分分配到其中。
有一个Wiki网页,它很好地介绍了链接程序命令文件及其语法,以及memory和sections指令的工作方式。 请 在此处查看,它应该有助于澄清我在上面所解释的内容。
谢谢,这篇文章非常有帮助,但现在我遇到了一个麻烦的问题。 我已对链接程序文件进行了以下更改:
esysmem :> RAMLS5至
esysmem :>> RAMGS2 | RAMGS3 | RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8 page = 1.
它为我提供了的链接程序脚本
内存 { 第0页:/*程序内存*/ /*内存(RAM/flash)块可移动到Page1以进行数据分配*/ /* begin用于“引导至闪存”引导加载程序模式*/ begin :原点= 0x8万,长度= 0x0.0002万 RAMM0 :原点= 0x0.0122万,长度= 0x0002DE RAMD0 :Origin = 0x00B000,length = 0x0.08万 RAMLS0 :原点= 0x0.8万,长度= 0x0.08万 RAMLS1 :原点= 0x0.88万,长度= 0x0.08万 RAMLS2 :原点= 0x0.9万,长度= 0x0.08万 RAMLS3 :原点= 0x0.98万,长度= 0x0.08万 RAMLS4 :原点= 0x00A000,长度= 0x0.08万 重置 :原点= 0x3FFFC0,长度= 0x0.0002万 /*闪存扇区*/ FLASHA :原点= 0x8.0002万,长度= 0x001FFE /*片上闪存*/ FLASHB :原始= 0x8.2万,长度= 0x0.2万 /*片上闪存*/ FLASHC :原点= 0x8.4万,长度= 0x0.2万 /*片上闪存*/ FLASHD :原点= 0x8.6万,长度= 0x0.2万 /*片上闪存*/ FLASHE :原点= 0x8.8万,长度= 0x0.8万 /*片上闪存*/ FLASHF :原始= 0x9万,长度= 0x0.8万 /*片上闪存*/ FLASHG :原始= 0x9.8万,长度= 0x0.8万 /*片上闪存*/ FLASHH :原始= 0x0A0000,长度= 0x0.8万 /*片上闪存*/ FLASHI :原点= 0x0A8000,长度= 0x0.8万 /*片上闪存*/ FLASHJ :原始= 0x0B0000,长度= 0x0.8万 /*片上闪存*/ FLASHK :原点= 0x0B8000,长度= 0x0.2万 /*片上闪存*/ FLASHL :原点= 0x0BA000,长度= 0x0.2万 /*片上闪存*/ FLASHM :原点= 0x0BC000,长度= 0x0.2万 /*片上闪存*/ FLASHN : Origin = 0x0BE000,length = 0x0.2万 /*片上闪存*/ 第1页:/*数据存储器*/ /*内存(RAM/flash)块可以移动到PAGE0以进行程序分配*/ BOOT_RSVD :原点= 0x0.0002万,长度= 0x0.012万 /* M0的一部分,引导ROM将使用此堆栈*/ RAMM1 :原点= 0x0.04万,长度= 0x0.04万 /*片上RAM块M1 */ RAMD1 :原点= 0x00B800,长度= 0x0.08万 RAMLS5 :原点= 0x00A800,长度= 0x0.08万 RAMGS0 :原点= 0x00C000,长度= 0x0.1万 RAMGS1 :原点= 0x00D000,长度= 0x0.1万 RAMGS2 :原点= 0x00E000,长度= 0x0.7万 //RAMGS3 :原点= 0x00F000,长度= 0x0.1万 //RAMGS4 :原点= 0x1万,长度= 0x0.1万 //RAMGS5 :原点= 0x1.1万,长度= 0x0.1万 //RAMGS6 :原点= 0x1.2万,长度= 0x0.1万 //RAMGS7 :原点= 0x1.3万,长度= 0x0.1万 //RAMGS8 :原点= 0x1.4万,长度= 0x0.1万 RAMGS9 :原点= 0x1.5万,长度= 0x0.1万 RAMGS10 :原点= 0x1.6万,长度= 0x0.1万 RAMGS11 : Origin = 0x1.7万,length = 0x0.1万 } 节 {/* 分配程序区域:*/ .cinit :> FLASHB 页面= 0,对齐(4) 。\n定位 :> FLASHB, 页面= 0,对齐(4) .text :>> FLASHB | FLASHC | FLASHD | FLASHE 页面= 0,对齐(4) 代码开始 :>开始 页面= 0,对齐(4) ramfuncts :负载= FLASHD, RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3, load_start(_RamfuncsLoadStart), load_size (_RamfuncsLoadSize), load_end (_RamfuncsLoadEnd), run_start(_RamfuncsRunStart), Run_Size (_RamfuncsRunSize), Run_End(_RamfuncsRunEnd), 页面= 0,对齐(4) /*分配未初始化的数据段:*/ .stack :> RAMM1. 页面= 1 .ebss :>> RAMLS5 | RAMGS0 | RAMGS1 页面= 1 //.esysmem :> RAMLS5 .esysmem :>> RAMGS2 | RAMGS3 | RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8 page =1 .CIO :> RAMLS5. 页面= 1 /*初始化部分进入Flash */ .econst :>> FLASHF | FLASHG | FLASHH 页面= 0,对齐(4) .switch :> FLASHB 页面= 0,对齐(4) 重置 :>重置, Page =0,type = DSECT /*未使用,*/ #ifdef __TI_Compiler_version #if __TI_Compiler_version >= 1500.9万 .TI.ramfunc:{} load = FLASHD, RUN = RAMLS0 | RAMLS1 | RAMLS2 |RAMLS3, load_start(_RamfuncsLoadStart), load_size (_RamfuncsLoadSize), load_end (_RamfuncsLoadEnd), run_start(_RamfuncsRunStart), Run_Size (_RamfuncsRunSize), Run_End(_RamfuncsRunEnd), Page =0,align(4) #endif #endif ramgs0 :> RAMGS0,页面= 1 ramgs1. :> RAMGS1,第= 1页 /*以下部分的定义适用于SDFM示例*//Filter1_RegsFile :> RAMGS1, page =1,fill = 0x1111 // Filter2_RegsFile :> RAMGS2, page =1,fill = 0x2222 // Filter3_RegsFile :> RAMGS3, page =1,fill = 0x3333 // Filter4_RegsFile = 1,RAM44/ RegsFile: >RAMGS5, 页面=1,填充=0x3333 }/* //=================================================== //文件结束。 //=========================================================================================================================================== */
这可能是不正确的,因为我的代码中有一个非常奇怪的错误,可能是一些内存 损坏。 我正在尝试执行memcpy,一些变量被设置为0,而其他变量正在被修改。 请参阅以下代码中的注释以了解该问题。 我不能解释为什么它会如此受到影响,除非我对链接器做了一些错误。
DecodePacketFooter (const uint8_t* packetData,const int length) { int dataLength; uint8_t footer Data[6]; //转换Base64编码页脚。 //页脚由6个字节组成,这些字节编码为消息 base64->Decode(packetData + length -8,footerData,8,6)的最后8个字节; // packetData[]现在是[fooetData,0,0,0,0] 21.311万 dataLength =长度-9; /*字符串输入= System.Text.Encoding.Default.GetString(FooetData, packetData.Length -8,8); 数据= System.Text.PackEncoding.Default.GetString(packetData, 0, packetData.Length -9); byte[] footer = Convert.FromBase64String(FooterInput);*// 解析页脚数据(前2个字节是CRC16,最后4个字节是数据包编号) uint16_t crc16 = 0; uINT32_t packetNumber =1;//设置为1而不是0,用于测试 memcpy( footcr2;数据) // dataLength为4,长度为13 memcpy(&packetNumber, footerData +2,4);//在此行执行dataLength和Length之后,两者都是0??? PacketNumber是0,正如我所期待的那样 // footerData已从[USB 21.311万 ,0,0,0]更改为[USB 11.011万 ,0,0,0]???
[报价用户="Kyle Stoudt"].esysmem :>> RAMGS2 | RAMGS3 | RAMGS4 | RAMGS5 | RAMGS6 | RAMGS7 | RAMGS8 page = 1[/QUE]
由于您已将多个RAMGS*区域组合到RAMGS2中,因此该语句可以简单地:
esysmem :> RAMGS2 页面= 1
仅供参考,根据 此帖子,.esysmem部分不能拆分(这是>>运算符的操作)。
这可能是不正确的,因为我的代码中现在有一个非常奇怪的错误,可能是一些内存 损坏。 [/引述]
这是可能的,但是链接程序命令文件本身看起来正常。 是否为程序设置了足够的堆大小?