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/TM4C1290NCPDT:将不同的固件映像嵌入为二进制资源

Guru**** 3001220 points

Other Parts Discussed in Thread: CC1310, TM4C1290NCPDT

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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/921367/ccs-tm4c1290ncpdt-embedding-a-different-firmware-image-as-a-binary-resource

器件型号:TM4C1290NCPDT
主题中讨论的其他器件:CC1310、

工具/软件:Code Composer Studio

我的应用是、我希望通过 tm4c1290处理器的串行系统引导加载程序对 CC1310器件进行编程。 两个固件项目都是在 ccs9下开发的。

目前、CC1310固件已编译并生成.out 文件。 我已使用 arm-none-eabi-objcopy.exe 创建一个平面二进制文件(.bin)、其中包含用0xFF 归档的未定义存储器。 使用命令

arm-none-eabi-objcopy.exe -Obinary --gap-fill 0xff cc131x-davistal-receiver Davistalk_Rx.bin

使用 下面链接的文章中描述的方法、我已将此二进制文件"转换"为 ELF 文件、并为二进制资源的开头和结尾自动生成链接器符号、但当我尝试将生成的.out 文件包含到我的 Tiva-C 工程中时、 我收到错误消息

致命错误#10178:尝试链接未为高级 RISC 计算机 ARM 构建的目标文件
("C:/MyFirmware/workspace_v9/Angelia-Baremetal/DavisTalkSupport/Davistalk_Rx_0_5_5_38_RGZ.out =无机器)

我从中获得的文章针对 "TI C6x"器件、建议使用参数"-alt-machine-code=140"来设置机器类型、但由于我在 ARM 器件上执行此操作、我不知道这是要使用的正确机器码。 有人能告诉我、为了让链接器接受二进制 blob、ARM 处理器需要使用什么机器代码吗?

在这种情况下、二进制数据恰好是不同处理器的固件映像、但将原始二进制数据包含到程序闪存中可能具有其他用途、例如嵌入式图形文件(.jpg 等)。

另外、请告诉我这个问题是否已在 ccs10中得到解决。 如果是、我将升级到它。

请注意、我已经成功地使用 Code Composer Studio 外部的 gcc 编译器和链接器将二进制数据包含或至少附加到映像文件中。 这是我遇到问题的 CSS 链接器。

相关问题:

e2e.ti.com/.../792875

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

    作为后续行动、我使用命令行(从 Cygwin 执行)取得了一些进展:

    arm-none-eabi-objcopy --input-target=binary -B arm --output-target=ELF32-littleum --rename 节.data=.const Davistalk_Rx_0_5_5_38_RGZ.bin Davistar_Rx_0_5_38_RGZ.out

    其中-B 指定了一个到 ARM 架构的二进制转换、而--rename 段用于将生成的二进制资源移出.data 段。

    我现在收到错误消息:

    错误#16006-D:"C:/MyFirmware/workspace_v9/Angelia-Baremetal/DavisTalkSupport/Davistalk_Rx_0_5_5_38_RGZ.out (0)的 ABI 版本与"./tm4c1290ncpdt_startup_ccs.obj"(5)不兼容

    即使未创建.out 文件、我也会看到资源已添加到映射文件中、并创建了预期的起始符号、结束符号和大小符号。

     

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

    [引用用户="Edward Blair"]是否有人能告诉我要为 ARM 处理器使用什么机器代码、以便链接器接受二进制 blob?[/quot]

    此处列出了所有这些选项。  ARM 的值为40。

    [引用用户="Edward Blair">请同时告诉我此问题是否已在 ccs10中得到解决。 如果是、我将升级到它。

    不幸的是,它没有。

    谢谢、此致、

    乔治

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

    [引用 USER="Edward Blair">有人能告诉我 ARM 处理器要使用什么机器代码来使链接器接受二进制 blob 吗? 编译器/MSP432P401R 中有一些 ARM Cortex-M4处理器的更新示例:在编程期间将二进制对象加载到闪存中、以便 NVS 稍后读取

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

    我已经弄清楚了如何执行此操作、并将在下面提供一般性说明。 它们应该适用于任何任意二进制文件。

    第1步-准备您的二进制资源文件。

    您的操作方式超出了这些指令的范围。 最终得到的任何内容都将成为一个精确的图像
    复制到 ARM 处理器的程序闪存中。 在本示例中、它将名为 BinaryFile.bin

    步骤2 -使用 GCC objcopy 命令从二进制文件创建 ELF 文件

    arm-none-eabi-objcopy --input-target=binary -B arm --output-target=ELF32-littleum --rename 段.data=.image、alloc、load、readonly、data、contents BinaryFile.bin BinaryFile.out

    在这里、选项--input-target=binary 和--output-target=ELF32-littleum 指定了输入和输出文件格式。
    B arm 表示正在进行二进制到对象资源转换、并指定 ELF 文件的架构
    --rename 节.data=.image、alloc、load、readonly、data、contents 执行两项操作:

    默认情况下、创建的二进制对象将放置在名为.data 的段中。 使用此选项可以将新资源放置在单独的段中、因此不会将其与其他资源链接在一起。 在这种情况下、新段名为.image。
    添加段标志"alloc、load、readonly、data、contents"将使新段成为只读段、在最终程序映像中分配空间、并将二进制数据复制到最终可执行文件中。

    步骤3 -编辑.out 文件以获得正确的 ELF e_flags 值

    在二进制(十六进制)编辑器中打开 BinaryFile.out 文件。 将字节0x27的值从00更改为05。
    这将允许 CCS 链接器接受 ELF 文件、否则会生成错误。

    此步骤是唯一一个没有在任何地方真正记录的步骤。 数字5来自 CCS 错误消息。

    或者、按照 、 将--diag_warning=16006添加 到链接器选项中;在 CCS Build -> ARM Linker -> Advanced Options -> Diagnostics 下、将16006添加到"Treat diagnostic 作为警告(--diag_warning)"。 这会将诊断16006从链接器错误更改为警告、以允许程序链接。

    步骤4 -将.out 文件添加到您的项目中

    (这些是 ccs9的说明)
    将 BinaryFile.out 文件放在项目文件夹中。
    打开项目选项并导航到 CCS Build > File Search Path 控件
    在"Include library file or command file as input"下、添加 BinaryFile.out 文件。
    (提示、单击"Add..." 然后单击"Workspace..." 然后导航到该文件。 这将使用构建变量
    找到文件而不是绝对文件路径。)

    步骤5 -将新段添加到链接器命令文件中

    您需要将在步骤2中创建的新段添加到您的 LIKER 命令文件中、以便链接器知道将它们放置在存储器中的位置。 如果您使用的是默认链接器脚本、请将其复制到您的工程中、以便您可以对其进行编辑、并更改链接器工程设置中使用的链接器命令脚本。 然后将突出显示的行添加到"段"部分:

    部分
    {
    .intvecs:> 0x00000000
    .text:> FLASH
    .const:> FLASH
    .cinit:>闪存
    .pinit:> FLASH
    .image:> FLASH /*使用您的段名*/添加此行
    init_array:> FLASH
    
    .vtable:>0x20000000
    .data :> SRAM
    .bss:> SRAM
    .sysmem:> SRAM
    .stack:> SRAM
    }
    

    步骤6 -在代码中使用资源

    在步骤2中创建 ELF 文件时、会创建三个链接器符号、以便访问数据:
    binary_BinaryFile_bin_start (保存二进制资源的起始地址)
    binary_BinaryFile_bin_end   (保存二进制资源的结束地址)
    binary_BinaryFile_bin_size  (保存二进制资源的大小)

    start 和_end 值是可重定位的、因此最终链接过程将为这些变量提供所需的位置
    资源最终会生成。

    注意:变量名称基于步骤1中使用的二进制文件的名称。

    _二进制_ _start  等

    由于这些是由链接器生成的变量、因此它们的工作方式与常规 C 变量略有不同

    在头文件中或在文件范围内使用以下命令声明它们:

    extern const uint8_t *_binaryFile_RGZ_bin_start;
    extern const uint8_t *_binaryFile_RGZ_bin_end;
    extern const uint8_t *_binaryFile_bin_size; 

    使用它们的最简单方法是将值分配给常规 C 变量、如下所示:

    int size =&_BinaryFile_RGZ_bin_size;
    const uint8_t * ptr =&_BinaryFile_RGZ_bin_start; 

    现在、您可以执行以下操作:

    对于(i=0;i "%02x="" ",="" ptr[i]);="" }
    

    I hope this is helpful.

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

    [引用 USER="Edward Blair]这将允许 CCS 链接器接受 ELF 文件、否则会生成错误。我发现另一种变通办法是向 链接器选项添加--diag_warning=16006;在 CCS Build 下-> ARM Linker -> Advanced Options -> Diagnostics 将16006添加到"处理诊断" 作为警告(--diag_warning)"

    这是因为 armobjcopy 命令生成带有"0" ABI 版本的 ELF 输出文件、默认情况下、链接器认为该版本与 TI ARM 编译器生成的 ABI 版本"5"不兼容。

    上述设置将诊断16006从链接器错误更改为警告、以允许程序链接。  我无法找到如何使 armobjcopy 在生成的目标文件中插入一个 ABI 版本的"5"。

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

    我可以给...

    [引用用户="Edward Blair"]

    步骤3 -编辑.out 文件以获得正确的 ELF e_flags 值

    在二进制(十六进制)编辑器中打开 BinaryFile.out 文件。 将字节0x27的值从00更改为05。
    这将允许 CCS 链接器接受 ELF 文件、否则会生成错误。

    此步骤是唯一一个没有在任何地方真正记录的步骤。 数字5来自 CCS 错误消息。

    [/报价]

    所有最新的 ARM 编译器都符合 ARM 扩展应用二进制接口标准。  该页面包含大约20个文档的集合。  重点介绍题为 "ELF for the ARM Architecture (用于 ARM 架构的 ELF)"的视频。  获取相关的 PDF 文件并搜索  e_flags。  它显示了以下内容...

    谢谢、此致、

    乔治