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.

[参考译文] 编译器/CC430F6137:无法再使用 eabi/ELF 输出格式将变量放置到特定的存储器位置

Guru**** 2503135 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/745418/compiler-cc430f6137-cannot-place-variable-to-specific-memory-location-anymore-with-eabi-elf-output-format

器件型号:CC430F6137

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

我需要对使用 MSP430 TI 4.4.5编译器的旧工程进行一些更改、并显示警告消息。  

警告#10204-D:无法将索引库"libmath.a"解析为兼容的

然后、我将构建输出格式更改为 ELF 以解决此警告消息。 完成此操作后、我意识到链接器不再将以下变量放置到特定的存储器位置。 如果我将输出改回传统 COFF、它会起作用。 我想什么了吗?

#pragma DATA_SECTION (Image_boot、".memlocation")
const unsigned char Image_boot[1024]={
#include "boot_sym.dAT"
};


谢谢、

Jonathan

 

 

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

    对于这个问题...

    [引用 user="Jonathan Cheng26"]警告#10204-D:无法将索引库"libmath.a"解析为兼容的

    我怀疑链接器尝试构建缺少的 RTS 库、此步骤失败。  为了了解发生了什么、我需要确切地了解如何调用链接器以及生成的所有诊断。  请从 CCS 中的"Console"(而非"Problems")视图复制-n-paste 文件。

    对于这个问题...

    [引用 user="Jonathan Cheng26"]我意识到链接器不再将以下变量放置到特定的存储器位置

    链接器命令文件中必须有特定的语法、将输出段.memlocation 分配到特定的存储器位置。  请将链接器命令文件附加到下一个帖子。  由于论坛仅接受几种不同类型的文件、因此请在其中添加文件扩展名".txt"。

    谢谢、此致、

    乔治

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

    尊敬的乔治:

    正如问题中提到的、我已经解决了以下警告消息。  


    警告#10204-D:无法将索引库"libmath.a"解析为兼容的
    备注#10372-D:(ULP 4.1)在此项目中检测到未初始化的端口 C。
      建议初始化所有未使用的端口以消除浪费的电流
      引脚上的功耗。
      库
    '完成的构建目标:bed_tag.out'

    基本上、TI CGT 4.4.5数学库是 ELF 格式。 因此、我需要将输出格式从传统 COFF 更改为 eabi (ELF)。 一旦我这么做、就没有更多的警告消息了。


    备注#10372-D:(ULP 4.1)在此项目中检测到未初始化的端口 C。
      建议初始化所有未使用的端口以消除浪费的电流
      引脚上的功耗。
    '完成的构建目标:bed_tag.out'

    但我的问题是、一旦我使用 ELF 格式、引导加载程序部分就不再存在了。 它以前用于 COFF 格式。

    输出格式传统 COFF
     
    存储器配置
            名称           源   长度     使用    未使用  的属性   填充
    ------------  ----  ------  ----  ----  --------  
     SFR                  00000000  00000010 00000000 00000010 RWIX
     外设_8位     00000010  000000f0 00000000 000000f0 RWIX
     外设_16BIT    00000100  00000100 00000000 00000100 RWIX
     INFOD                00001800  00000080 00000000 00000080 RWIX
     INFOC                00001880  00000080 00000000 00000080 RWIX
     INFOB                00001900  00000080 00000000 00000080 RWIX
     INFOA                00001980  00000080 00000000 00000080 RWIX
     RAM                  00001c00  00000ffe 00000ff8 00000006 RWIX
     闪存                00008000  00007a00 00007a00 00000000 RWIX FFFF
     引导加载程序           0000fa00  00000400 00000400 00000000 RWIX

    引导加载程序
    *         0   0000fa00   00000400     
                     0000fa00   00000400    main.obj (.bootloader)

    输出格式 eabi (ELF)
    存储器配置
            名称           源   长度     使用    未使用  的属性   填充
    ------------  ----  ------  ----  ----  --------  
     SFR                  00000000  00000010 00000000 00000010 RWIX
     外设_8位     00000010  000000f0 00000000 000000f0 RWIX
     外设_16BIT    00000100  00000100 00000000 00000100 RWIX
     INFOD                00001800  00000080 00000000 00000080 RWIX
     INFOC                00001880  00000080 00000000 00000080 RWIX
     INFOB                00001900  00000080 00000000 00000080 RWIX
     INFOA                00001980  00000080 00000000 00000080 RWIX
     RAM                  00001c00  00000ffe 00000df3 0000020b RWIX
     闪存                00008000  00007a00 00007a00 00000000 RWIX FFFF
     引导加载程序           0000fa00  00000400 00000000 00000400 RWIX

    代码中使用了.bootloader 段

    #pragma DATA_SECTION (Image_boot、".bootloader")
    const unsigned char Image_boot[1024]={
    #include "boot_sym.dAT"
    };

    我已经附加了用于定义存储器部分的链接器 cmd 文件。 如前所述、链接器 cmd 文件和代码没有变化。 但在使用 ELF 输出格式时、.bootloader 段是空的。

    谢谢、

    -Jonathan

    e2e.ti.com/.../lnk_5F00_cc430f6137_5F00_cmd.txt

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

    [引用 user="Jonathan Cheng26"]但在使用 ELF 输出格式时.bootloader 段不为空。[/quot]

    添加此 pragma ...

    #pragma RETAIN (Image_boot) 

    您的程序不得对数组 Image_boot 进行任何读取或写入。  在 EABI 中、链接器会删除从未引用的数据对象(实际上已被遗漏)。  这是 EABI 下链接器的默认行为。  在旧的 COFFABI 下、默认行为相反。  除非采取特殊步骤、否则从未引用的数据对象仍是程序的一部分。  

    我很抱歉不能尽快确认这一点。  

    谢谢、此致、

    乔治