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.

[参考译文] TMDXIDK5718:RTOS 加载和运行.data 段的放置

Guru**** 2589265 points
Other Parts Discussed in Thread: SYSBIOS

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/635099/tmdxidk5718-rtos-load-and-run-placement-of-data-section

器件型号:TMDXIDK5718
Thread 中讨论的其他器件:SYSBIOS

你(们)好

我将使用具有 SYSBIOS V6.46.5.55和 GNU 编译器 V6.3.1的 CCS7.3在 IDK5718上为 A15处理器构建应用。

的原因

processors.wiki.ti.com/.../BIOS_with_GCC_(CortexA)

我尝试将.data 段放入不同的存储器段中、以用于加载和运行时间。
因此、我在我的配置脚本中添加了以下内容:

Program.sectMap[".data"]= new Program.SectionSpec ();
Program.sectMap[".data"].loadSegment ="data_init";
Program.sectMap[".data"].runSegment ="EXT_RAM";

DATA_INIT 和 EXT_RAM 由我自己的平台文件定义。

在自动创建的链接器命令文件(..\Debug\configPkg\linker.cmd)中、我可以看到内存段已正确定义(仅显示相关的部分):

存储器

   EXT_RAM (rwx):org = 0x84000000,len = 0x3c000000
   DATA_INIT (RW):org = 0x82000000,len = 0x2000000

在同一链接器命令文件中、.data 段定义为:

.data:{*(.data)}>EXT_RAM at>DATA_INIT

(笑声)

.data :{
       __DATA_LOADDR___= LOADDR (.data);
       __data_start__=.;
       *(.got.plt)
       *(.GOT)
       *(.shdata)
       保留(*(.data))
       保留(*(.data*))
       *(.gnu.linkone.d*)
       。 =对齐(4);
       __DATA_END__=.;
}> region_data at > region_text


查看创建的映射文件时、仅使用.data 段的运行地址(EXT_RAM 中的0x84000000)。
加载地址根本不使用(__DATA_LOAD__应为0x82000000)。

               0x84000000               _DATA_LOADDR__= LOADDR (.data)
               0x84000000               __DATA_START__=。

如何告知链接器将.data 段的加载地址放置在与运行地址不同的地址?

此致、
Markus

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    RTOS 团队已收到通知。 他们将在这里作出回应。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是否有此问题的更新?

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

    您好!

    很抱歉、我错过了这个主题。 在我们的 Processor SDK RTOS 驱动程序示例中、我们有类似的 VPS 环回案例。 在配置文件中:

     Program.sectMap[".bss:frameBuffer"].loadSegment          ="app_cached_data_BLK1_MEM";

    在映射文件中:

    APP_SACK_DATA_BLK1_MEM 0x80c00000        0x0f400000

    .bss:帧缓冲区
                   0x80c00000 0xf400000
     *(.bss:帧缓冲区)
     .bss:帧缓冲区
                   0x80c00000 0xf400000 C:\ti\pdk_am57xx_1_0_4\packages/ti\drv\v\lib\am572x\a15\release\vps_examples_utility.aa15fg (bsputils_mem_default.oa15fg)
                   0x80c00000               gBspUtils_heapMemFrame

    因此、如果您定义了 loadSegment 并将数据放在那里、我不会看到问题。

    此致、Eric

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

    因为它不起作用,我做了一些实验。
    然后、我发现它完全适用于我自己定义的段。
    例如:

    __attribute__((section(".mysection")))
    void TestFunction (void){}

    Program.sectMap[".mysection"]= new Program.SectionSpec ();
    Program.sectMap[".mysection"].loadSegment ="data_load";
    Program.sectMap[".mysection"].runSegment ="DATA_TUN";

    我在该段中放置的所有内容都在映射文件中的正确位置发生。

    但是当我尝试放入内置段(如.text、.data、.bss、...)时 将其完全忽略。
    有什么想法吗?

    此致、
    Markus