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-RTOS
您好 Gurus、
我正在迁移在 Tiva C 系列 TM4C129ENCPDT 上运行的应用
现有工具:
迁移到:
迁移问题:
链接器错误:
"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 文件中定义的段与之前的版本相匹配。
谢谢你。
拉斐尔