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/TMS570LC4357:我能否在链接器命令文件中提供绝对地址

Guru**** 2606725 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/750354/ccs-tms570lc4357-can-i-supply-an-absolute-adress-in-the-linker-command-file

器件型号:TMS570LC4357

工具/软件:Code Composer Studio

在链接器命令文件的文档中、我可以看到我可以定义:

  • 具有地址范围的存储器
  • 我在其中定义它们位于哪个存储器中。

链接器可用的绝对地址是什么?

我 需要在内部 SRAM 的末尾创建两个部分重叠的数组。

我不想在 C 语言中创建联合体、以避免复杂的命名。

最好是在地址空间中的正确位置创建一个"存储器"、
并在 链接器命令文件中添加指向此存储器的两个绝对地址。

在 C 文件中、我将把到数组声明为 extern

extern uint32_t array1[];

extern uint32_t array2[];

我尝试了几 个变体、但没有成功。 链接器抱怨 array1和 array2未定义。

是否可以在链接器命令文件中定义全局标签?

(很明显、我可以使用定义创建一个汇编器文件、但我更喜欢在链接器文件中使用它)

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

    您可以使用链接器命令创建段并指定段的地址(将包含您的两个数组)。 变量在段中的相对位置由编译器/链接器决定。 存储器段不应重叠。 例如

    在 c 中:
    静态 int 标志__attribute__((section (".flag"))__attribute__(__used__)=6;
    #pragma DATA_SECTION (array1、".array_data");
    uint32_t array1[10];

    在 cmd 中:
    #define BASE1 0x00000020
    #define BASE2 0x00000040
    部分

    .intvecs :{}>向量
    .flag :{}> BASE1
    array_data:{}> BASE2
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我知道这个。 我也可以在汇编文件中执行它、这正是我要避免的。

    我想在链接器文件中定义绝对地址、并在 extern 声明中使用该地址。

    这是不是可能的?

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

    我不知道这对您的方案是否有帮助、但在我们的项目中、我们使用这种类型的样式:

    在 Linker.cmd 中:

    部分

    头文件 :{__PTR_IMAGE_START_C=.;}>页眉


    __PTR_APP_HEADER_C =__PTR_IMAGE_START_C;/**<应用程序头开始*/

    在 Linker.h 中:

    外部 uint32 __PTR_IMAGE_START_C; /**<指向图像起始地址的指针*/

    使用'&__PTR_IMAGE_START_C'获取使用中的地址。

    谢谢、
    Tony。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    这看起来是一个很好的开始。
    我实际需要的是定义几 KB 的未初始化区域。
    最好位于内部 SRAM 的末尾、因为我想使用存储器保护来检测该区域之后的任何写入。

    我需要在该区域的开头添加一个标签、并在其中添加一个带有偏移4的标签。

    如果以下操作正常、我将会正常工作:
    Buffer= 4100字节= 4096 + 4
    链接器文件:
    部分

    buffer:{__BUFFER0=.;__BUFFER1=.+4}> buffer


    在 C++语言中:
    extern uint32_t __BUFFER0[1024];
    extern uint32_t __BUFFER1[1024];

    ----
    我需要实现一个循环缓冲器、每当我到达缓冲器的末尾时、
    我将会换行、但我也会切换到另一个缓冲区、因此访问将是
    _BUFFER0[0]、__BUFFER0[1]、...、__BUFFER0[1022]、__BUFFER0[1023]、
    _BUFFER1[0]、__BUFFER1[1]、...、__BUFFER1[1022]、__BUFFER1[1023]、
    _BUFFER0[0]、__BUFFER0[1]、...、__BUFFER0[1022]、__BUFFER0[1023]、
    _BUFFER1[0]、...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    现已测试此项:

    link.cmd:

    存储器

    (笑声)
    缓冲区(RW):origin=0x0806D400 length=0x00012C00 //0x0806D400->0x00012C00 76KBDRAM:512KB
    (笑声)


    /*------------------ *
    /*段配置 *

    部分

    (笑声)
    缓冲区:{__buffer_nooffset=.;__buffer_offset=.+4;}>缓冲区
    (笑声)


    /*------------------ *
    /*其他 *
    /*------------------ *

    .map:

    0806d400 __buffer_nooffset
    0806d404 __buffer_offset

    因此、这符合预期!