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.

[参考译文] 编译器:TI ARM C/C++编译器5.1 v 6

Guru**** 2562120 points


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

https://e2e.ti.com/support/tools/code-composer-studio-group/ccs/f/code-composer-studio-forum/590173/compiler-ti-arm-c-c-compiler-v5-1-6

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

问题:

根据我们的要求删除库时,我们收到以下错误消息(我们不应使用这些库)。 是否有任何链接器标志将清除此标志。 我可以在代码中定义函数,但不执行任何操作,但我正在查找类似于 --cinit_compress=off的链接器选项  ,该选项关闭 __TI_decpress_rle24。

未定义          首次引用
符号                  在文件中
-------------------                --------
__TI_decpress_none

编译器信息:

TI ARM C/C++编译器5.1 v版本6
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W

TI ARM C/C++ Parv 5.1 Tm6
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM EABI C/C++解析器5.1 Tm6.
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM C/C++文件合并5.1 v.6
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM C/C++优化器5.1 v版本6
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM C/C++ Codegen 5.1 v版本6
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM汇编器v 5.1 Tm6.
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM嵌入式实用程序v 5.1 Tm6.
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM C Source Interlister v 5.1 6
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM LINKER 5.1 Tm6.
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM Absolute Lister 5.1 六号
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM带实用程序v 5.1 Tm6.
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM XREF Utility v 5.1 Tm6.
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM C++ demangler 5.1 v版本6.
工具版权所有(c) 1996-2014 Texas2014 Texas Instruments Incorporated
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM十六进制转换器v 5.1 Tm6.
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM名称实用程序v 5.1 Tm6.
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM对象文件显示v 5.1 Tm6.
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W
TI ARM Archiver 5.1 6
内部版本号1OE9R-KDADEMDK-RTARQ-war-ZAZE_V_R_W

命令:

$(ARMCL)$(LFLAGS)--cinit_compression=off --output_file=$(out_file)$(S_OBJ_FILES)$(OBJ_FILES)$(ASM_OBJ_FILES)$(CMD_FILE)

其中 $(LFLAGS):=-mv7R4 --code_state=32 --float_support=VFPv3D16 --abi=eabi -Ooff --diag_warning=225 --display_error_number --enum_type=packed --preproc_with _compile --preproc_dependency --gen_aux_user_info

错误消息:

链接>
警告#1.0208万-D:自动RTS选择:尝试自动链接
索引库"libc.a"失败;找不到文件
"OPS.cmd",第112行:警告#1.0068万-D:没有匹配的部分
警告#1.0062万-D:未定义入口点符号"_c_int00"

未定义的第一个引用
文件中的符号
------------------- --------
__TI_decpress_none

错误#1.0234万-D:仍存在未解析的符号
警告#1.0202万-D:未找到合适的入口点;设置为0
错误#1.001万:链接时遇到错误;"./Release/exe/OPS.out不是
已构建

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

    要理解我的建议,我需要提供一点背景知识。  整个解释假定您使用较新的EABI,而不是较旧的TI_ARM9_ABI。  

    data部分包含已显式初始化的全局变量和静态变量。  虽然这些变量是在main启动之前初始化的,但它们在整个执行过程中并不是恒定的。  他们可以更改值。  如何设置初始值?

    这取决于您是使用--rom_model还是--ram_model。  您的选项不显式显示--rom_model或--ram_model。  但是,由于代码引用了__TI_decomppress_none符号 ,我可以告诉您使用--rom_model。  

    使用--rom_model时,以下是初始化的工作方式。  每个目标文件中的.data输入部分都是一个已初始化的部分。  每个符号对应一个内存位,其中包含一个值。  链接器将所有.data输入部分组合到一个也名为.data的输出部分。  但它从初始化的部分更改为未初始化的部分。  初始化值被放置在另一个名为.cinit的已初始化输出部分中。  要节省内存,压缩.cinit部分。  使用选项--cinit_compression=off禁用此压缩。  但.cinit部分仍然存在。  在运行时,启动代码执行两项操作。  它会解压缩.cinit (但不会在您的情况下)并将初始化值从.cinit复制到.ddata。  在您的特定情况下, 启动代码使用例程__TI_decomppress_none。

    当使用--ram_model时,以下是初始化的工作方式。  data部分仍为已初始化的部分。  系统必须能够将该.data部分加载到系统运行时可以写入的内存中。  特别是,您不能简单地将.data刻录到闪存中。

    因此,如果在您的情况下实际可行,避免整个压缩序列的一种方法是从--rom_model更改为--ram_model。

    谢谢,此致,

    -George

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

    谢谢George。 是的,我们正在使用--rom_model。

    根据 您的建议将--rom_model更改为--rom_model。 软件已成功编译和链接。 但是,当我使用--rom_model时,二进制文件的大小是131 MB ,而相同的二进制文件大小是148 KB。 最后,它添加了所有零。  在这两种情况下,.out文件 大小 相同(843 KB)。  我们使用  以下bat/命令   从.out文件生成二进制(.bin)文件。  

    C:/TI/Ccsv6/utils/tiobj2bin/tiobj2bin.bat ./Release/exe/OPS.out ./Release/exe/OPS.bin C:5.1 /TI/Ccsv6/tools/compiler/arm_ccsv6.6/bin/armofd.exe C:5.1 /TI/Ccsv6/tools/compiler/arm_ccobutils.6/binarmhex.exe C:/tibin/ccobjutils/mkhex4bin.exe

    这些文件是使用--ram_model选项生成的:

    这些文件是使用--rom_model选项生成的:

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    在EABI中,链接程序创建表以引导时将某些部分归零。 它取决于库函数来执行归零。 通过禁止使用库,您必须放弃这种加载时占用空间优化,因此必须在引导时间之前将内存归零初始化。 也就是说,零将显示在“二进制”文件中。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Jagadish Pal 说:
    当我使用--rom_model时,二进制文件的大小是131 MB ,而相同的二进制文件大小是148 KB。

    此二进制文件的大小由提供

    最高初始化地址-最低初始化地址

    由于使用--ram_model,.data节从未初始化的节更改为已初始化的节。  它的地址可能离其他初始化的部分很远。  更改分区分配到内存的方式以使所有初始化的分区(包括.data)紧密地在一起是否可行?

    谢谢,此致,

    -George

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

    但是,当我使用--ROM_model时,二进制文件的大小是131 MB ,而相同的二进制文件大小是148 KB。

    您使用的是什么设备?

    根据您的命令行,我猜是Hercules设备。 Hercules设备可以有闪存和RAM 128 MB 的开头,在使用--ram_model时,它们可以解释二进制文件的大小。

    对于基于闪存的设备,使用--ram_model不适合从闪存引导,因为启动时需要闪存中的启动代码才能将初始化数据从闪存复制到RAM。

    我认为您需要:

    a)保留--rom_model,但添加启动代码,将数据段从闪存复制到RAM。

    b)更改代码以删除初始化的变量,删除数据部分,然后根据需要添加代码以初始化变量。