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.

[参考译文] TMS570LS3137:链接器文件:为文件中的数据指定一个段。

Guru**** 2538960 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/1432968/tms570ls3137-linker-file-specify-a-section-for-the-data-from-a-file

器件型号:TMS570LS3137

工具与软件:

您好!  

在我们的项目中、我们使用 MPU 区域将任务的存储器区域相互隔离。  

到目前为止、我们 通过在每个.c 文件中使用#pragma SET_DATA_SECTION 意识到了这一点。 稍后在链接器阶段、将整个段分配到 RAM 位置。 请在此处查找一个示例

/* test.c file*/

#pragma SET_DATA_SECTION("test_section")

uint8 testData;

const uint8 testConstData;



#pragma SET_DATA_SECTION()

/* END test.c file*/


/*sys_link.cmd file */

MEMORY
{
    RAM     (RW)		: origin=0x08002000 length=0x0003C000
}


SECTIONS
{
	test_section : START( StartAdrTestSection )
                        {} > RAM palign( 0x20 )
}

/*End sys_link.cmd file */

在这种方法中、常量数据和 RAM 数据进入相同的 RAM 存储器区域。  

您能否提出一种解决方案、在链接器文件中、我可以从段标识符 test_section 中提取 ram 和 const 数据。

替代方法:

我尝试了手动处理单个文件的解决方案、但没有成功、我有来自链接器的以下消息

警告:没有匹配的部分

/* sys_link.cmd file */
	testData : {
		test*(.data)
	} > RAM

我不确定如何获取该区域的起始地址和大小、即使替代方法可行也是如此。 执行命令  启动 大小 兼容这种方法?  

提前感谢。

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

    Anudeep、

    由于印度的排华节假日、敬请期待延迟回复。

    此致、

    Brennan

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

    Anudeep、您好!

    为什么不将它们存储到不同的存储器段中、如下所示:

    /* test.c file*/
    
    #pragma SET_DATA_SECTION("test_section_data")
    uint8 testData;
    #pragma SET_DATA_SECTION()
    
    
    #pragma SET_DATA_SECTION("test_section_const")
    const uint8 testConstData;
    #pragma SET_DATA_SECTION()
    
    
    /* END test.c file*/
    
    
    /*sys_link.cmd file */
    
    MEMORY
    {
        RAM     (RW)		: origin=0x08002000 length=0x0003C000
    }
    
    
    SECTIONS
    {
    	test_section_data : START( StartAdrTestSectiondata )
                            {} > RAM palign( 0x20 )
        
        test_section_const : START( StartAdrTestSectionconst )
                            {} > RAM palign( 0x20 )
    }
    
    /*End sys_link.cmd file */

    ——
    谢谢、此致、
    Jagadish。

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

    您好 Jagadish、

    是的、我的确对我们编写的文件使用了这种方法。 但是、我们生成第三方软件包、在这些生成的文件中、const 和数据没有很好地分离、因此每次生成文件时都很难添加 const 和 ram 段。 (手动/通过脚本)。  

    这就是我认为最好在链接器文件级处理它的原因。  

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

    那么、是否还有其他方法可以在文件级执行该操作?

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

    Anudeep、您好!

    .const

                   该段 包含字符串文字、浮点常量和使用 C/C++限定符常量定义的数据 。 这是一个只读段。

    因此、在链接器 cmd 文件中、我们通常将执行以下操作:

    这表示要存储在闪存中的常量变量、因此您可以使用此.const 段名称来分隔常量对象、并可以将其存储在所需段中。

    尝试此方法、了解结果。

    ——
    谢谢、此致、
    Jagadish。

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

    您好!  

    感谢您提供的投入。 问题是将文件中的常量分配到特定地址。 您建议的解决方案将所有保修人员分配到一个位置。 这会造成问题、因为在本例中、使用 MPU 来隔离各个文件中的数据。

    以下命令也不起作用、它会提供与之前相同的警告  警告:没有匹配的部分

    	testData : {
    		test.*(.const)
    	} > FLASH0			

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Unknown 说:
    我尝试了手动处理单个文件但没有成功的解决方案

    我认为您需要改变两件事:

    1) testConstData 的初始化程序:

    const uint8 testConstData = 0xFF;

    2) 2)在输出段名称的位置放置变量名称。 我认为它应该是这样的:

    	test_section_data : {
    		test.o(.bss)   // // testData will go here
    	} > RAM
    
    	test_section_const : {
    		test.o(.rodata)  // testConstData will go here
    	} > FLASH0

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

    您好!  

    感谢提示1. 当我尝试复制这里的实际代码时、我忘记在我的文章中添加它。 在我们的实际代码库中、const 被初始化。

    我已经尝试了您的方法、但问题是使用这种方法时、链接器显示错误"找 不到文件 test.o"。  

    请从我创建的测试项目中找到屏幕截图。

    我看到目标文件 test.obj、我曾尝试使用、并收到以下警告。  

    我认为该方法正确、但我不确定为什么不生成 const、它们是否以某种方式进行了优化? (OPT_LEVEL 为 OFF、OPT_SPEED 为1)。

    我缺少了一些明显的东西。 如果您能引导我、那就太好了。 谢谢。

    这是我使用的测试工程

    .e2e.ti.com/.../7127.TstMap.zip

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

    我正在使用其他处理器和编译器、因此.obj 对于您来说是正确的。

    我认为问题是编译器用 testv 替换了字符串字面量、并丢弃了 const 变量。 这超出了优化级别的控制范围。

    尝试强制编译器保留"testv"变量。

    对我来说,这看起来像这样:

    __attribute__((retain)) const uint16 testv = 0xFFFF;

    您需要在编译器手册中查找环境所需的语法。 它可能被称为"已使用"或类似。

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

    很有道理。 在测试项目中、我创建了一个更复杂的常量数组。 然后在链接器文件中使用.const 效果很好。  

    但是、在实际项目中、它不起作用。

    (不允许我在这里分享真实的数据、因此我尝试举个例子)。  

    在实际工程中、我有一个类似的初始化常量数组(自定义类型)。 我为上述文件中的这些常量值分配一个自定义段。  

      测试数据:{
        test.*(.const)
      }> FLASH1      

    在映射文件中、我看到该 const 数组被分配给了.unpriv_flash 部分。 表示如下:

             0006cf28  00000c08   libTest.A:Test.c.obj (.const:Test_Dir)

    很明显、数组被标识并创建为常量、但我不知道为什么链接器的响应下降为"warning: no matching section"。  

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

    链接器脚本的顺序很重要。 尝试将特殊的输出段定义放置在脚本文件中的常规定义之前、即段的开头。  

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

    "我在课的开头、似乎没有任何影响。