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.

[参考译文] CCS/TMS320F2.8377万S:调整堆大小。 链接程序可以找到足够的内存。

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/601389/ccs-tms320f28377s-adjusting-heap-size-linker-can-find-enough-memory

部件号:TMS320F2.8377万S

工具/软件: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部分不能拆分(这是>>运算符的操作)。

    这可能是不正确的,因为我的代码中现在有一个非常奇怪的错误,可能是一些内存 损坏。 [/引述]

    这是可能的,但是链接程序命令文件本身看起来正常。 是否为程序设置了足够的堆大小?