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.

[参考译文] 编译器/TMS320F2.8377万D:帮助我了解链接文件

Guru**** 2587365 points
Other Parts Discussed in Thread: C2000WARE

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/659820/compiler-tms320f28377d-help-me-understand-the-linking-file

部件号:TMS320F2.8377万D
主题中讨论的其他部件:C2000WARE

工具/软件:TI C/C++编译器

大家好,

注意:这将是一个很长的帖子,因此请在阅读之前暂停并放松

 

我发布此查询是为了继续发布此处发布的问题(e2e.ti.com/support/microcontrollers/c2000/f/171/t/654370)65.437万),我认为该问题偏离了轨道。 如果 不是我,这也可能对许多其他人有用。

我从一开始就解释这个问题(见下文):

  • 我正在处理一个代码,其中main函数在 循环中调用另一个函数'lorlineshape()',直到满足阈值条件。
  • 函数 'lorlineshape()'从预定义的'.c'文件(HITRAN)导入一组数组
  • 此算法在使用较小的数据集时工作非常顺利。 我已成功运行此算法,每个数组的大小为31 (来自HITRAN.c文件)。
  • 在新的要求下,我需要这些HITRAN.c文件的数组的大小为460。所以函数 'lorlineshape()'导入一个更大的数据集,然后处理数据。 我也要改变一些常量来进行计算和理论上的改变,但这并没有改变 'lorlineshape()'的功能,我已经明确地检查了它。
  • 这是一个测试程序,我已将此函数从循环中拉出,并尝试查看输出是否为correct.e2e.ti.com/.../ADC.main.c 。您将看到2134.5238 和DAC已初始化,但我希望它们不会干扰这里的功能。
  • 以下是HITRAN.c文件 e2e.ti.com/.../6036.HITRAN.c

观察:请于 2018年1月24日上午9:05查看此 帖子 e2e.ti.com/support/microcontrollers/c2000/f/171/t/654370中65.437万中的帖子

我假设当程序进入函数 'lorlineshape()'时,程序没有从缺省链接文件中创建的扇区获得足够的内存,因此产生了垃圾结果。

 

我的问题:

谁能知道main函数何时调用 'lorlineshape()',那么在该函数中初始化/声明的变量会获得内存中的哪个空间?

当程序脱离功能时,这个空间是否释放? 由于我在原始程序的循环中调用此函数,那么每次调用该函数时,该函数是否会占用新的空间?  这是如何工作的? 是否有文档需要阅读或有人需要解释。

 

感谢病人一直阅读到最后

提前感谢您提供的任何帮助

此致,

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

    局部变量将进入堆栈。 那些在'lorlineshape()'中的外部变量不会影响堆栈的使用,因为我认为,它们是HITRAN.c中的最常数组,但我看到长度为960的数组'phi_Voigt'可能会影响堆栈自身的大部分。 您为堆栈分配了多少空间?

    此致,

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

    现在我使用的是C2000Ware_1_00_03_00文件的默认链接文件

    2837xD_FLASH_lnk_CPU1.cmd中分配的堆栈

    ..................................................................................................

    此致,

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

    因此,RAMM1的长度为0x400 (1024) 16位字,而'phi_Voigt'的长度为900个32位字。 'phi_Voigt'能否成为全球? 否则,您必须通过将堆栈移动到不同的RAM块来为堆栈分配更多内存。

    此致,

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

    嗨,Richard,

    我在另一个系统上尝试此程序(我的笔记本电脑目前不可用),并且我在构建时收到此错误

    我也在此处添加链接文件

    内存
    {
    第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万
    RAMGS14 :原点= 0x01A000,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 *
    RAMGS15 :原点= 0x01B000,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 */
    重置 	:原始= 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 :原点= 0x1.7万,长度= 0x0.1万
    RAMGS12 :原点= 0x1.8万,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 *
    RAMGS13 :原点= 0x1.9万,长度= 0x0.1万 /*仅在F2.8379万D,F2.8377万D和F2.8375万D设备上可用。 删除其它设备上的线路。 */
    
    CPU2TOCPU1RAM:原始= 0x03F800,长度= 0x0.04万
    CPU1TOCPU2RAM:原始= 0x03FC00,长度= 0x0.04万
    }
    
    节
    {/*
    分配程序区域:*/
    .cinit :> FLASHB 页面= 0,对齐(4)
    。\n定位 :> FLASHB, 页面= 0,对齐(4)
    .text :>> FLASHB | FLASHC | FLASHD | FLASHE 页面= 0,对齐(4)
    代码开始 :>开始 Page =0,align(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)
    
    .reset :>重置, Page =0,type = DSECT /* Not Used,*/
    
    Filter_RegsFile :> RAMGS0,	页面= 1
    
    SHARERAMGS0		:> RAMGS0,		页面= 1
    SHARERAMGS1		:> RAMGS1,		页面= 1
    ramgs0 :> RAMGS0, 页面= 1
    ramgs1. :> RAMGS1, Page =1
    
    #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)
    	#else
    ramfuncs :负载= 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)
    #endif
    #endif
    
    /*使用IPC API驱动程序时,需要使用以下部分定义*/
    组:> CPU1TOCPU2RAM,页= 1
    {
    PUTBUFFER
    PUTWRITEIDX
    GETREADIDX
    }
    
    组:> CPU2TOCPU1RAM,页= 1
    {
    GETBUFFER:类型= DSECT
    GETWRITEIDX:类型= DSECT
    PUTREADIDX:类型= DSECT
    }
    
    /*以下部分定义适用于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
    }/*
    
    
    //===================================================
    //文件结束。
    //===========================================================================================================================================
    */
    

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

    罗汉

    'program will not fit ...'(程序将不适合...)错误消息显示,用于全局变量的.ebss部分太大,无法容纳您为其分配的内存。  你需要找到一个更大的内存块。  此示例似乎没有充分利用GS内存,因此您可以执行如下操作:

    .ebss :>> RAMLS5 | RAMGS0 | RAMGS1 | RAMGS2 | RAMGS3 | RAMGS4 页面= 1. 

    我不知道为什么会出现未定义的符号错误,除非您从示例中删除了一些代码?

    此致,

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

    嗨,Richard,

    我尝试了您刚才建议的所有RAMGS,最多12个。

    在控制台列出的所有RAM GS中,程序仍然显示相同的错误。

    实际上不会删除任何内容。

    如果您看到,则以前共享的main.c文件包含多个程序...因此,只需保留其中一个并删除其他程序。

    此致

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

    嗨,Richard,

    它现在起了作用

    我将更多的块分配给堆叠,并将phivoigt[]带回到llorlineshape中。

    堆栈 :> RAMGS2 页面= 1
    //而不是RAMM1 

    这种方法可以正常工作,但我感到困惑,因为如果这种额外的内存足以让它正常工作,那么您之前建议的方法也可以正常工作

    .ebss :>> RAMLS5 | RAMGS0 | RAMGS1 | RAMGS2 | RAMGS3 | RAMGS4 页面= 1. 

    我想.ebss不能超出某些限制:0x16CF,如我在先前帖子中共享的控制台的屏幕截图所示

    此致

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

    很高兴知道它在工作。 增加堆栈意味着导致问题的是局部变量的数量。

    如果尚未执行此操作,请确保已将项目链接器属性设置为生成.map文件。 这将详细告诉您哪些部分链接在何处以及它们的大小。

    此致,

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

    感谢Richard昨天的持续帮助...

    [报价用户="Richard Poley"]

    如果尚未执行此操作,请确保已将项目链接器属性设置为生成.map文件。 这将详细告诉您哪些部分链接在何处以及它们的大小。
    [/引述]

    我从未这样做过。 请问您的意思是什么,或者是否有相关文档。

    此致,

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

    罗汉

    不用客气。

    您可以从CCS中设置"-map_file"链接器属性,方法是右键单击“资源管理器”窗口中的项目,然后选择“属性”->“CCS生成”->“C2000链接器”->“基本选项”。  链接程序将生成扩展名为".map"的文本文件,您可以在任何文本编辑器中打开该文件。  该文件包含内存使用情况和符号放置的列表,我认为这非常有用。  链接器的此功能和其他功能在汇编语言工具指南的第8章中有说明,此处为:

    http://www.ti.com/lit/ug/spru513p/spru513p.pdf

    此致,

    Richard