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.

[参考译文] RTOS:使用 XDCTools 3.32、CCS 6.2和 RTOS 2.16.1.14时的 Tiva C 链接问题

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/566395/rtos-tiva-c-link-issue-using-xdctools-3-32-ccs-6-2-and-rtos-2-16-1-14

主题中讨论的其他器件:TM4C129ENCPDT

工具/软件:TI-RTOS

您好 Gurus、

我正在迁移在 Tiva C 系列 TM4C129ENCPDT 上运行的应用

现有工具:

  • CCS 5.5.0.00077编译器6.2.11
  • SYS/BIOS 6.37.5.35
  • XDCTools 3.25.6.96

迁移到:

  • CCS 6.2.0.00050编译器15.12.4.LTS
  • TI RTOS 2.16.1.14
  • XDCTools 3.32.01.22_core

迁移问题:

  • 使用编译器15.12.4.LTS 升级到 CCS 6.2可编译并正常运行。
  • 升级到 XDCTools 3.32.01.22_core 应用程序会编译但不会链接(请参阅下面的链接错误)
  • 编译过程会创建此文件 Debug/configPkg/linker.cmd
    • 此文件中的段定义不同于使用上一个工具链时的段定义
    • 如果我剪切并粘贴由上一个工具链生成的段定义、应用程序链接并运行正常、但此文件会在每次清理和编译时重新生成

链接器错误:

"configPkg/linker.cmd"、第131行:警告#10096-D:指定地址位于内存映射之外
错误#10264:默认内存范围与现有内存范围重叠 INTVECS
错误#10264:默认内存范围与现有内存范围重叠 APPHDR
错误#10264:默认内存范围与现有内存范围重叠闪存
错误#10264: 默认存储器范围与现有存储器范围重叠 VTABLE
错误#10264:默认存储器范围与现有存储器范围重叠 LOAD_TAG
错误#10264:默认存储器范围与现有存储器范围重叠 SRAM
错误#10010:链接过程中遇到错误;未构建"OurAppplications.out"

在我们的系统中、我们将闪存的第一个扇区用于自定义引导加载程序、允许我们进行现场固件升级和应用程序完整性检查。  因此、我们使用自定义 CMD 文件。  如果我们使用此文件的原始版本、则链接有效、但我们的应用程序不起作用、因为自定义引导加载程序希望代码位于闪存的第二个扇区。

我们的定制 CMD 文件:

/*********
*
*版权所有(c) 2013-2014 Texas Instruments Incorporated。 保留所有权利。
*软件许可协议
*
**德州仪器(TI)提供此软件仅供
*仅供 TI 的微控制器产品使用。 该软件归
* TI 和/或其供应商所有、受适用的版权
*法律保护。 您不能将此软件与"病毒"开源
*软件结合使用、以形成更大的程序。
*
*此软件按"原样"提供、且存在所有缺陷。
*任何明示、默示或法定的保证、包括但
不限于对适销性和适用性
*特定用途的默示保证均不适用于本软件。 在任何
*情况
下、TI 都不应对因任何原因造成的特殊、意外或必然*损害负责。
*
*这是 DK-TM4C129X 固件包版本2.1.0.12573的一部分。
*
* /--retain=g_pfnVectors


--retain=g_appHeader

/*以下命令行选项作为 CCS 项目的一部分进行设置。 */
/*如果您使用命令行进行构建,或者出于某种原因想要在
此处定义*/*,则可以根据需要取消注释并修改这些行。 */
/*如果您使用 CCS 进行编译、最好
在 CCS 工程中进行任何此类*///*修改并将此文件单独保留。 */
* //
/*--heap_size=0 */
*--stack_size=256 /*
--library=rtsv7M4_T_le_eabi.lib */

*应用程序的起始地址。 通常,中断向量*/
/*必须位于应用程序的开头。 //
#define APP_BASE 0x00010000
#define RAM_BASE 0x20000000

#define INTVECS_LENGTH 0x00000400
#define APPHDR_LENGTH 0x0000001A
#define FLASH_LENGTH 0x00100000 -(INTVECS_LENGTH + APPHDR_LENGTH)

#define VTABLE 0x00000400
#define LOAD_TAG_LENGTH 0x00000040
#define SRAM_BASE 0x0000.LENGTH 0x00040000 -(VTABLE + LOAD_TAG_LENGTH)

/*系统内存映射*/

MEMORY
{
/*存储在内部闪存中并从内部闪存执行的应用程序*/
INTVECS (RX):origin = APP_base, length = intvecs_length
APPHDR (RX):origin = APP_BASE + INTVECS_LENGTH, length = APPHDR_length
闪存(RX):origin = APP_base + INTVECS_length + APPHDR_length、 length = flash_length

/*应用程序使用内部 RAM 进行数据*/
VTABLE (rwx):origin = RAM_base, length = VTABLE 长度
load_tag (rwx):origin = RAM_base + VTable_length, length = load_tag_length
SRAM (RWX):origin = RAM_base + VTABLE + length + load_tag_length、length = SRAM_length
}

//内存

中的段分配*/ SECTIONS
{
codestart:> INTVECS
.intvecs:> intvecs{__intvecs_start =.;}
.appheader:> APPHDR
.text:> FLASH
.const:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH

.vtable:> VTABLE
load_tag_section:> load_tag
.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM
.stack:> SRAM
.taskStack:> SRAM
}

__STACK_TOP =__STACK + 1536;

原始 CMD 文件:  

/*********
*
*德州仪器 TM4C129ENCPDT 的默认链接器命令文件
*
这源自 TivaWare 库的修订版12770。
*
* /

--retain=g_pfnVectors


内存
{
闪存(RX):origin = 0x00000000,length = 0x00100000
SRAM (rwx):origin = 0x20000000,length = 0x00040000
}//

以下命令行选项是作为 CCS 项目的一部分设置的。 */
/*如果您使用命令行进行构建,或者出于某种原因想要在
此处定义*/*,则可以根据需要取消注释并修改这些行。 */
/*如果您使用 CCS 进行编译、最好
在 CCS 工程中进行任何此类*///*修改并将此文件单独保留。 */
* //
/*--heap_size=0 */
*--stack_size=256 /*
--library=rtsv7M4_T_le_eabi.lib

内存中的*//*段分配*/

段
{
.intvecs:> 0x00000000
.text:> FLASH
.const:> FLASH
.cinit:>闪存
.pinit:> FLASH
init_array:> FLASH

.vtable:>0x20000000
.data :> SRAM
.bss:> SRAM
.sysmem:> SRAM
.stack:> SRAM
}

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

    您好、Rafael、

    BIOS 用户指南中的第7.2和7.3节(例如:C:\ti_tirtos_tivac_2_16_01_14\products\BIOS_6_45_02_31\docs\BIOS_User_Guide.pdf)介绍了内存映射和用于修改映射、创建自定义平台或提供补充链接器命令文件(只能对自动生成的命令文件进行一个补充)的选项。  您是否见过这些内容?

    我的第一个想法是… 由于您的自定义链接器命令文件使用多个定义、因此最简单的选择是仅提供您自己的链接器命令文件、并指示 XDC 不生成任何段定义的文件。  但我认为没有办法这样做。  下一个选项似乎是创建一个具有最小段定义的自定义平台、然后提供您的自定义链接器命令文件来补充这一点。

    我将于明天上午与一位专家核实,以了解他对…的建议  

    此致、
    Scott

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

    您好、Scott。

    请记住、代码在 CCS v5上工作。

    这意味着问题似乎是工具问题、而不是自定义链接器等问题

    BR

    安德斯兰热

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

    Anders、您好!

    谢谢,我不认为这是 CCS 问题,我看到“使用编译器升级到 CCS 6.2”。 编译后运行正常。  我认为问题是由于更新的 XDC 工具中平台附带的链接器命令文件发生了变化。  当应用之前在 CCS v5上运行时、使用的是旧版 XDC 工具。  

    此致、
    Scott

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

    您好、Rafael、

    您能否检查您的新项目使用的平台?  因为,您为 configPkg/linker.cmd 显示的内容意味着项目使用特定平台,而不是 Tiva“通用”平台- 它不包括段规范中的所有内存段(它们是冲突的)。   

    如果右键单击项目、单击"常规"、然后单击 RTSC 选项卡、您会看到什么适用于平台?

    要使用通用平台、您应具有 ti.platforms.tiva、后跟器件型号:

     

    如果您使用通用平台、您应该能够轻松修改项目中的器件链接器命令文件(不会重新生成)、或者添加您自己的补充命令文件。

    如果您之前未使用 ti.platforms.tiva、您能否报告您使用的平台?

    谢谢、
    Scott

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

    您好、Scott、

    此项目上的平台设置与您的上图相同:ti.platforms.tiva:TM4C129ENCPDT

    这与我们之前使用的工具链相同。

    当我们使用 XDCTools 3.25..6.96和 SYS/BIOS 6.37.5.35以及我们的自定义 CMD 文件(如上原始过帐中所示)时、configPkg\linker.cmd 的内容如下所示(减去所有注释):

    l"C:\MyProjPath\Debug\configPkg\package\ccfg\app_pem4f.oem4f"
    -l"C:\MyProjPath\src\SYSBIOS\SysBIOS.aem4f"
    -l"ti\xdctools_3_mcrets\cmbr\ts5_remotes\cmbr\ts56\ts\cmbr\tsprintran\ts\cmbr\ts\cmbr\ts\cmts\cmbr\ts56\ts\cmts\cmts\cmbr\ts56\f_remts\cmbr\ts\cmbr\ts\cmbr\ts\cmbr\ts\cmts56\ts\cmts\cmts\cmts\cmts\cmts\cmts\cmts\cmts\cmts\cmts\cmates\cmbr\ts\cmts\cmts\cmts\cmts\cmates\cm
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    bootVecs:load > intvecs
    vecs:load > 0x20000000
    .resetVecs:load > intvecs
    
    
    
    xdc.meta:类型= COPY
    xdc.noload:类型=副本
    }
    

    如果我将项目设置更改为使用 XDCTools 3.2.1.22_Core 和 TI-RTOS for TivaC 2.16.1.14并进行编译、则 configPkg\linker.cmd 的内容如下所示:

    l"C:\MyProjectPath\Debug\configPkg\package\ccfg\app_pem4f.oem4f"
    -l"C:\MyProjectPath\src\SYSBIOS\SysBIOS.aem4f"
    -l"ti\tirtos_tiva_2_14\tisvac_rts\cl_rts14_rts\cl_rts\cl_rts46\tiv_rts\cl_rts\cl_rts14_rts\cl_rts\cl_rts\cl_rts\cl_rts46\tiv_rts\cl_rts\cm64_rts\cl\ts\cl_rts\cl_rts\cl_rts\cl_rts\cl_rts\cl_rts\cl_rts\cl_rts\cl_rts\cm64_rts\cmware\ts\cl_rts\cl_rts\cl.rts\cm64_rts\cmcontent\cm64_rts\cs\cl\ts\c
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    ------ 此行不同
    
    的 XDC_Runtime_Startup__EXECFXN__C = 1;
    XDC_Runtime_Startup__RESETFXN_C = 1;
    
    
    段
    {
    bootVecs:type = DSECT ---- 这条线是不同的
    .resetVecs:load > 0x0 ---- 这条线是不同的
    vecs:load > 0x20000000
    
    
    
    xdc.meta:类型= COPY
    xdc.noload:类型=副本
    }
    

    如果我替换段定义中的前3行以使用之前设置中的行、则编译、链接和运行正常。

    我们一直在使用自定义 CMD 文件(我假设这是您所称的补充 CMD 文件) 、对吗?

    为了避免冲突、我需要在我们的补充 CMD 文件中更改什么、或者我需要更改哪些其他设置、以便自动生成的 linker.cmd 与旧格式相匹配?

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

    您好、Rafael、

    好的、感谢您提供更多详细信息。  我不知道为什么这三行不同会产生您最初报告的错误。

    如何将您的"自定义 CMD"包含在工程编译中?  您是否将其直接放入了项目中?

    您的项目中是否有任何其他.cmd 文件?

    而且,在您的原始错误中,它会显示“configPkg/linker.cmd line 131:warning…”  第131行是什么?  能否附加 configPkg\linker.cmd?

    谢谢、
    Scott

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

    在此进一步讨论此问题,我们认为这条线正是问题的根源:

       resetVecs:load > 0x0

    当链接器看到存储器映射之外的位置(自定义 CMD 定义在零处没有任何内容)时,它将尝试通过拉入默认存储器映射来恢复,以尝试解析地址。  这种情况似乎正在发生并导致碰撞。

    在旧的 cmd 文件.resetVecs 中、转至 INTVECS、这是您已放置在自定义 CMD 中的。

    “resetVecs”的放置由 Hwi 模块控制。  您可以显式地将其放置、并将几行添加到.cfg 文件中。  有关类似问题的讨论、请参阅此帖子、.cfg 代码片段: e2e.ti.com/.../1727177

    希望这次能做到这一点!

    此致、
    Scott

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

    Scott、
    我按照上述帖子的建议在我们的 CFG 脚本中添加了以下2行、这解决了链接问题。

    VAR HwiM3 = xdc.useModule('ti.sysbios.family.arm.m3.Hwi');
    HwiM3.resetVectorAddress ="intvecs";
    

    现在、自动生成的 Debug\configPkg\linker.cmd 文件中定义的段与之前的版本相匹配。

    谢谢你。
    拉斐尔