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.

[参考译文] 编译器:TI ARM 链接器别名关键字和 SECTION#39;s 地址

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/682798/compiler-ti-arm-linker-alias-keyword-and-section-s-address

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

您好!

我目前正在使用 TI 16.9.2.LTS 工具版本(用于 TDA2xx 上的 M4 IPU 内核)。 我在 TI 站点中获得的此版本链接的手册是针对版本18.1.0.LTS 编写的、因此我假设语法与我的版本相同。

根据手册、alias 关键字应使我能够定义两个不同的地址空间(长度相同)、 每个存储器都可以用作任何其他存储器、但链接器会知道这两个存储器实际上都引用相同的空间-当能够从不同的地址访问相同的物理存储器时、这是非常好的。

问题是、当我尝试它时、不断出现错误、说我只能将存储器用作运行地址、似乎我还需要单独的加载地址-它不允许我将每个存储器用作任何其他存储器 (例如、如果我定义了两个没有别名的存储器区域、则没有问题)。 因此,我不明白别名应该是如何使用的,也不知道是什么用途,或者这是一个虫子的痛点,我很感谢你的帮助。

我遇到的另一个问题是、我无法将(0x1000 + 5)等表达式作为段的绑定地址给出、即使它是常量、我只能输入实际数字。 为什么是这样?  

谢谢

家伙  

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

    关于别名问题... 请显示一个示例。  确保包含错误消息的准确文本。

    [引用 user="Guy Mardiks">即使表达式是常量、我也无法将其作为段的绑定地址提供(0x1000 + 5)等表达式、并且只能输入实际数字。 为什么是这样?  [/报价]

    这是对链接器解析功能的限制。  在某些情况下、例如分配给符号的值、允许使用表达式。  在其他情况下、仅允许定义明确的常量。

    谢谢、此致、

    乔治

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

    别名示例和错误:

    存储器

    别名

         MEM1 (RWIX):org =(0)

         MEM3 (RWIX):org =(0x55020000)

      } len =(0x4000)

    部分

      组(组1)

      {

      sec_group1:{}

      }> MEM1

      另一个_秒:{}> MEM1

    错误:

    错误#10433-D:ALIAS'ed 存储器范围、MEM1、只能用于运行放置、而不能用于"Group1"的加载放置。

    错误#10433-D:ALIAS'ed 存储器范围、MEM1、只能用于运行放置、而不能用于".another _sec"的加载放置。

    如果 删除别名、则没有问题。

    谢谢

    家伙

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

    感谢您的示例。  我可以重现相同的诊断。  我不知道为什么会发生这种情况。  因此、我在 SDOWP 系统中提交了 CodeGen-4699、以对其进行调查。  欢迎您在我的签名中使用下面的 SDOWP 链接进行访问。

    谢谢、此致、

    乔治

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

    Guy、

    链接器别名功能旨在与 Cortex-M4的 SRAM 映射功能配合使用、其中片上 SRAM 从 SRAM 存储器区域映射到代码存储器区域。  这是由于器件具有单独的指令和数据总线。

    支持的用例用于从 RAM 运行函数。  是因为性能原因。

    它要求您使用复制表将代码加载到别名区。  然后、链接器会在放置期间确保任何到 SRAM_DATA 的放置都不会与用于为 SRAM_CODE 加载代码的放置冲突。

    请参阅以下示例:

    //task1.c
    #include
    空切换(空)
    {printf (" ramfunc 切换的别名放置成功);}

    //main.c
    #include
    extern void toggle ();
    void main (void)

       extern copy_table _task1_copy_table;
       copy_in (&_Task1_copy_table);
       toggle ();



    存储器

       主      (RX):origin = 0x00000020,length = 0x0000FFFF
       别名
       {
          SRAM_CODE (rwx):origin = 0x00030000
          SRAM_DATA (RW):origin = 0x00040000
       }长度= 0x0000F000

    部分

       组
       {
          .task1:{task1.obj (.text)}
       }load = main、run = SRAM_code、table (_task1_copy_table)
       .text  :  > main
       .const :  > main
       .cinit :  > main
       .pinit :  > main
       .data    :>0x00040000
       .bss   :  > SRAM_DATA
       .sysmem:  > SRAM_DATA
       .stack :  > SRAM_DATA (高电平)


    谢谢、此致、
    Greg

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

    大家好、谢谢。
    我可能会误解某些内容、因为它不是很有用-我不能通过将数据和代码分配到同一个区域来做同样的事情、您就不会遇到冲突问题。 如果您需要不同的数据和代码名称、您只需将另一个名称定义为存储器上的一个定义(类似于 GNU MEM_ALIAS)
    我本以为它可以实际定义不同的区域,每个区域都可以单独使用,但链接器会知道它们是相同的物理空间:即对于 M4,因为 RAM 区域是 NX, 需要使用 Ammu 将其映射到可执行区域、因此在 Ammu 之后、您将具有两个相同空间的不同区域-如果别名有助于实现这一点、那将非常有用。

    感谢您让我知道、它不会像我想象的那样起作用(也无法从文档中理解)。
    您可能会考虑更新此功能、使其听起来就像这样。

    此致
    家伙