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.

[参考译文] Linux/TDA2EVM5777:"无法分配内存"错误- remoteproc

Guru**** 2551110 points


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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/616415/linux-tda2evm5777-can-not-allocate-memory-error---remoteproc

器件型号:TDA2EVM5777
主题中讨论的其他器件:TDA2

工具/软件:Linux

您好!

我尝试使用随附的 TI 内核的 Remoteproc 功能
Visual SDK_2_12_02_00 (修补 Linux 4.4.45)。 我已回退 sysfs 支持以监控 remoteproc。  
我的板是带 TDA2的 XC5777x。  

我构建了一个简单的程序、该程序对变量进行计数、并在 CCS 下使用我的 XDS200 JTAG 调试器使其运行。  
这很好、没有问题(除了 Linux 正在运行... 调试器无法访问 JTAG 链... 但这是我几乎已经公布的另一个问题。)

现在、下一步将是:构建版本... 完成。 复制为 dra7-ipu1-fw.xem4到 lib/固件... 取消绑定和绑定 5882000.IPU... 什么也不会发生、dmesg 中没有错误消息。  

一只/sys/class/remoteproc/remoteproc0/state 猫显示:"离线"。  

还可以。。。 尝试开始... 将"开始"回显到状态... 我收到了错误消息:  

sh:写入错误:无法分配内存

编译 elf 文件时出错。 我已经尝试过 CCS 附带的 TI-Toolchain 和 Linaro-Toolchain。 我没有使用链接器脚本、也没有使用 SDK 附带的脚本(starterpack)...
一点都不成功! 存储器映射与数据表和 devicetree 中定义的内容匹配。  

我要做的是生成一个 Remoteproc "ELF"文件... 在一天结束时不使用 TI 中间件或引导加载程序、因此我需要以下无法从 starterpack 或 SDK 中分离的内容:  

  1. 适用于 TDA2-EVM5777x 电路板的有效链接器说明文件。 (也许我已经拿到了这些、但我不是很放心、所以只是站在安全的一边...)

  2.  "真正裸机"启动代码的一个简单示例、没有(!) TI 库或引导加载程序或 RTOS 的使用...
    =>如果需要?! 我必须如何配置其他 CPU 的外设、然后配置 MPU? (即使是通过 devicetree 也是如此? 您准备好了什么? 如何操作?)

  3. 如何构建与 Linux 中的 TI Remoteproc 机制兼容的 ELF 文件的配方。
    无论我试过什么、这一次都失败了。
    唯一有效的示例: "linux/targetfs/lib/firmware/ipc/ti_platforms_evmDRA7XX_ipu1/MessageQ_single.xem4"、该示例可以加载、并且在"bind "IPU1"之后、IPU1开始运行、状态类:正在运行...

… 所以:原则上它是有效的!
我一定忘记了一些重要的事情... 但是、什么呢?  

因此、我需要最简单的可能性(框架)、以便使用 Remoteproc 机制在 M4、DSP、TDA2的 EVE 上运行 GCC 编译的 ANSI-C 代码。  
(没有 CCS 项目、没有库或通用链接器脚本和构建环境、这些都太复杂、无法在原则上展示其工作原理... 一个不带引导加载程序、操作系统、库的简单 Makefile GCC 项目。。。。)  

谢谢、Marco。

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

    一些附加信息

    创建的 ELF 文件无法作为"远程固件"加载的原因很简单:  

    (1)未创建名为".resource_table"的段。  

    因此、可以稍微绕过使用 JTAG 和直接注入(GEL 脚本将执行其他所有操作...) 但是、即使已经构建了一个版本、创建的 ELF 也不会包含资源部分、需要该部分来填充 Remoteproc 的 TI Linux 驱动程序中的资源表。 如果此为空,则会出现错误"remoteproc remoteproc 0:boot failed:-12”。
    (Remoteproc_core.c -> fw_boot -> if (!rproc->table_ptr)-> return -ENOMEM;)

    (笑声) 现在、我尝试包括这样一个重新源码映射:  
    我找不到 任何可能包含信息的 rsc_table_XXX.h => TDA2x 或 DRA7... 或 x5777x 等...

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

    又回来了…

    (...  能够帮助我?)

    井:  

    (1)我需要一个 GNU 连接器脚本(.lds、而不是.cmd)来生成 M4和 C6x 代码、该代码能够是与"remoteproc"一起使用的"固件"。 因此、必须创建一个".resource_table"段、但我无法找到它必须看起来的样子...  

    (2)您是否有任何类型的真正的"裸机"启动代码、没有镇流器? TDA2-XC5777x 的小型 GNU/Examples/Skelletons 可能吗?
    (GCC 能够构建 M4和 C6x 代码以及构建 A15代码和 Linux。 为什么使用另一 个垂体 TI 编译器? 我们有自动测试、夜间构建... 质量管理系统和我的软件必须满足此要求。 我需要一个简单的支柱,没有 SDK 或 IDE……)  

    是的、有"复杂"visual SDK 和您称为"裸机"的入门套件。 但这两种设计都可以在 Windows 和 CCS - IDE 下工作。  
    如果您必须在 Linux 主机系统下实施代码并希望使用"免费"编译器和"简单、极简"的库、则提取所需内容并不容易。  

    所有内容都嵌入在 SDK 基础架构中、使用"BIOS"、"RTOS"、大库... 一个复杂的构建系统(在 Linux 下不能正常工作...)、TI 编译器...
    我们必须在开发过程中“更加自由”,不能使用这些东西,也不能提取*真正*需要的东西,一点都不有趣...  

    因此、请帮我:我不需要任何使用"用例"或"可配置性..."的 SDK 我需要简单的裸机示例、而不需要专有产品、因为我们需要满足外部要求。  

    谢谢!

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

    附加的链接器脚本是否适合您? 尝试一下。  e2e.ti.com/.../8446.TDA2x.lds

    2.我不确定、但如果您在这里运气不佳、我可以将此主题移至器件论坛、也许读者对此特定 EVM 场景会有更大帮助。

    谢谢、

    Alex

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

    (1)我知道这个脚本并几乎尝试了它、但没有成功。
    也许不是脚本... 我必须构建 Linux 中使用的"远程固件"(ELF):Remoteproc 应该能够写入这个特殊的 ELF 文件(其中包含一个名为".resource_table"的段... 但无论如何都不会生成...?!) M4和(稍后...) 并启动子内核。
    这是我们的目标...

    (2)这很好! 谢谢您...

    也许有人已经构建了一个小型 GNU 项目来构建任何类型的 M4或 C66x 固件,这些固件将使用 A15内核中的 Linux 的 Remoteproc 机制成功地引导。

    (笑声) 现在我无法这样做。 我正在尝试了解 SDK 的工作原理以及在何处扩展"非专有构建"真实裸机代码所需的内容... (一点也不有趣...)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。


    是的、该链接器脚本足以在所选内核上运行裸"hello world"程序。 这对您的需求帮助不大、因此我不知道。 让我们等待社区和他们的意见。

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

    亚历克斯·巴什科夫(1239253):

    我也有消息。

    看起来 simpe .h 文件可以是用户(包括在内)来创建所需段。

    我在 以下位置找到了类似的东西:

    TI_components /算法编解码器/ipumm/platform/ti/dc/baseimage/custom_rsc_table_omap5_ipu.h

    "秘密":

    #pragma DATA_SECTION (ti_ipc_remoteproc_ResourceTable、".resource_table")

    #pragma DATA_ALIGN (ti_ipc_remoteproc_ResourceTable、4096)

    struct my_resource_table ti_ipc_remoteproc_ResourceTable ={

      1、   /*我们是实现此功能的第一个版本*/

      16、  /*表中的条目数*/

      0、0、 /*保留、必须为零*/

      /*条目的偏移量*/

      {

        offsetof (struct my_resource_table、rpmsg_vdev)、

        offsetof (struct my_resource_table、text_cout)、

        offsetof (struct my_resource_table、data_cout)、

    这将创建所需的表... 对于 omap5;)  

    我将需要这些信息、我可以在 TDA2上使用哪些已发货文件、或者我需要 TDA2的此类文件。  

    但最好的是... 有人构建了一个非常简单的框架、用于裸机编码 M4和 DSP、而不使用镇流器...  
    (一切都变成了:“啊! 这很简单!"... 让我们等待社区... 激发智能规则。)  

    Marco

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

    谢谢、

    我昨天已经尝试过这种方法。 (必须进行更改;在 GNU 工具链中不知道 pragma、还有一些其他问题... 现在,它将编译,并将创建一个 elf。。。 大于小于)

    现在有.resource_table 段、但我无法通过 remoteproc 将生成的 ELF 加载到 M4中。

    由于我尝试在 GNU 工具链下引入 M4真正裸机... 我收到了相同的错误消息:  

    echo "start">/sys/class/remoteproc/remoteproc0/state
    sh:写入错误:无法分配内存

    我认为这是一个未知的 resource_table 的结果。 而在 remoteproc_cpu.c 中指向它的指针保持为"NULL"、并且不会分配任何内存。  

    仅挑选复杂 SDK 的几个部分不会带来成功。 我已经尝试了很多... 但我仍然无法实现我们所需的目标:  

    我们*必须*从头开始构建代码,在非专有工具链下真正裸机。  
    上面的链接器脚本是一个*必须有*,但仍有一些内容缺失... 不管用。  

    到目前为止、我的东西产生了什么:  

    ELF 接头:
     魔术: 7F 45 4c 46 01 01 00 00 00 00 00 00 00 00 00 00
     类别:               ELF32.
     数据:                二进制补码、小端字节序
     版本:              1 (电流)
     OS/ABI:               UNIX -系统 V
     ABI 版本:            0
     类型:                EXEC (可执行文件)
     机器:              ARM
     版本:              0x1.
     入口点地址:        0x80000bcd
     程序头开始:      52 (字节到文件中)
     段头开始:      530304 (字节到文件)
     标志:               0x5000202、具有入口点、版本5 EABI、软浮点 ABI
     此标题的大小:        52 (字节)
     程序头大小:      32 (字节)
     程序标头数量:     5.
     段头的大小:      40 (字节)
     段头数量:     26
     段头字符串表索引:23
    章节标题:
     [NR]姓名        类型       地址  关闭  大小 ES 浮动 Lk 下拉电流
     [0]          null       00000000 000000 000000 00 00   0 0 0
     [1].text       PROFGBITS    80000000 008000 076f78 00 Ax 0 16
     [2]__libc_freeres_fn PROGBITS    80076f78 07ef78 000cbc 00 AX 0 0 4.
     [3]__libc_thread_fre PROFGBITS    80077c34 07fc34 0000e0 00 AX 0 0 4
     [4].arm.extab    PROGBITS    80077d14 07fd14 000248 00 A 0  4
     [5]__libc_subfreeres PROGBITS    80077f5c 07ff5c 00002c 00 A 0  4
     [6]__libc_atexit  PROGBITS    80077f88 07ff88 000004 00 A 0  4
     [7]__libc_thread_sub PROGBITS    80077f8c 07ff8c 000004 00 A 0 4  
     [8].arm.exidx    arm_EXIDX   80077f90 07ff90 000680 00 AL 1 0 4
     [9].not.abi-tag  注释       80078610 080610 000020 00 A 0  4
     [10].not.gnu.build-I 注释       80078630 080630 000024 00 A 0  4
     [11].data       PROFGBITS    80078658 080658 000ef0 00 WA 0  8
     [12].tdata       PROGBITS    80079548 081548 000010 00 Wat 0  4
     [13].tbss       NOBITS      80079558 081558 000018 00 Wat 0 4  
     [14].JCR        PROFGBITS    80079558 081558 000004 00 WA 0  4
     [15].gOT        PROGBITS    8007955c 08155c 000070 00 WA 0  4
     [16].bss        NOBITS      800795d0 0815cc 001124 00 WA 0  8
     [17]__libc_freeres_pt NOBITS      8007a6f4 0815cc 000018 00 WA 0  4
     [18]堆       NOBITS      8007a70c 0815cc 000400 00 WA 0  1
     [19].stack       NOBITS      8007ab0c 0815cc 000400 00 WA 0  1
     [20].resource_table PROGBITS    00003000 003000 0003d4 00 WA 0 4  
     [21].comment      PROGBITS    00000000 0815cc 000056 01 MS 0  1
     [22].arm.attributes arm_attributes 00000000 081622 000035 00   0  1
     [23].shstrtab     STRTAB      00000000 081657 000128 00   0  1
     [24].symtab      SYMTAB      00000000 081b90 00dfe0 10  25 2434 4.
     [25].strtab      STRTAB      00000000 08fb70 007a5d 00   0  1
    标志键:
     W (写入)、A (alloc)、X (执行)、M (合并)、S (字符串)
     I (INFO)、L (链路顺序)、G (组)、T (TLS)、E (排除)、 X (未知)
     o (需要额外的操作系统处理) o (特定于操作系统)、p (特定于处理器)
    此文件中没有段组。
    程序标题:
     类型      偏移 量 VirtAddr PhysAddr FileSiz MemSiz 浮动对齐
     EXIDX      0x07ff90 0x80077f90 0x80077f90 0x00680 0x00680 R 0x4
     负载      0x000000 0x00000000 0x00000000 0x033d4 0x033d4 RW 0x8000
     负载      0x008000 0x80000000 0x80000000 0x795cc 0x7af0c RWE 0x8000
     注释      0x080610 0x80078610 0x80078610 0x80078610 0x00044 0x00044 R 0x4
     TLS       0x081548 0x80079548 0x80079548 0x00010 0x00028 R 0x4

    有些东西仍然很可怕:我遇到了很多错误、例如:  

    readelf:warning:corrupt arm compact model table entry:b4040184 compact model index:52
    readelf:警告:遇到未知的 ARM 压缩模型索引

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

    现在、我尝试修复入口点地址... 应该是0x0....附近的东西。 现在为@0x8xxxxxxx。


    (我将我的小编译系统的结果与工作示例的自下读数进行比较、并替换我的段以适应工作 xem4中的布局)

    还有很多事情要做...

    您是否有文档、其中说明了固件必须是什么才能通过 Remoteproc 进行引导?  

    我找到的唯一内容是内核中有关如何编写驱动程序的文档。 这项工作仍在进行中...  
    在 Linux 中 TI-remoteproc 驱动程序实现的 API 的文档如何?  

    这也会非常好。  

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

    我找到了一些东西、现在它运行了一点...  

    第一:将问题分为以下几个部分:

    1) 1)使用 GNU 工具链构建 M4代码

    要构建 M4代码、我使用  具有以下选项的 ARM-LINUX-gnueabi-toolchain:  

    CFLAGS +=-lm -mthumb -mcpu=cortex-m4

    问题:我是否必须使用另一个 GNU 工具链或选项?

    2) 2)构建"resource_table"以使"remoteprov"可用。  

    我使用了以下文件:
    custom_rsc_table_omap5_ipu.h
    如本主题前面所述。
    (为了使其发挥作用、需要进行一些更改:
    GNU 不知道或将忽略#pragma、因此我使用了:  
    __attribute__((section(".resource_table")))__attribute__(((aligned (2))) struct my_resource_table ti_ipc_remoteproc_ResourceTable =...
    以生成所需的"rexouce_table"。  

    问题:是否有经过充分测试的与此文件"裸 GNU"兼容的版本?  

    3) 3)使用有效的启动代码  

    嗯,在一个银河系中,很远…… 名为:  
    STARTUP_ARMCM4.S
    发现了... 绑定到... 不要做预期的:(  

    问题:我所做的就是像 这样(在 Makefile 文件中)将这些内容与小型主文件及其包含的 custom_RSC_table_omap5_IPU "放在一起":

    $(CC)$(LDFLAGS)-o main.o startup.S main.c $(LDLIBS$(LDLIBS-$(@))$(CFLAGS)-i $(include_path)-static
    (我在 startup.S 中重命名了启动代码)。 没有加油器错误... 但机器上仍然没有工作代码。 但是:它可以作为固件加载! 有点成功...
    现在:也许 startup.S 是错误的、或者我必须自定义 devicetree 文件、执行"dra7-EVM-infoadas.dtb"通常执行的其他操作?  

     

    总而言之:一个简单的 GND-Toolchain Makefile 工程、它展示了如何以最简单的方式构建固件... 裸机... 非常欢迎。  
    否则、需要注意的事项太多:如果没有现有的板级支持、我就没有时间创建自己的 SDK 了。此时、这仅限于某些"让它在您自己的基础上工作"的内容和漂亮的环境(CCS 及其示例-强烈使用 Sys/BIOS! 和 visual SDK... 与"用例"和"算法"的机制完全一致... 但没有什么能满足我们的要求:  
    一个简单的示例、让 startet 在 Linux 中仅使用非常简单的 Makefile 工程中的 GND-toolchain 为 Remoteproc 构建裸机固件... 当然:使用足够的启动代码、如果没有这个小的汇编器存根、什么都不起作用、我找到的那个:也许可以、但不管怎样、它不起作用。。。)