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.
工具与软件:
大家好
我需要一些关于在 ram 中运行的应用程序代码的帮助
在我使用以下类型在 ram 中运行代码之前、一切都好、编译没有错误。 在我做以下操作后:
(__LW_AT__1)我添加我的第一个 App1.obj(.text)、编译成功、没有错误。
(__LW_AT__2)我添加我的第二个,它的名称为 App2.obj). text(,错误发生,就是
重新定义:xxxx 最初在" ";在"App2.obj"中重新定义、其中 xxxx 是 App2中定义的函数名称或变量名、它们都是私有变量。
.TI.ramfunc:{App1.obj (.text)、
app2.obj(.text)}
负载= FLASHH、
RUN = RAMS2_6、
Load_start (_RamfuncsLoadStart)、
Load_Size (_RamfuncsLoadSize)、
Load_End (_RamfuncsLoadEnd)、
RUN_START (_RamfuncsRunStart)、
RUN_SIZE (_RamfuncsRunSize)、
RUN_END (_RamfuncsRunEnd)、
那么、为什么会发生这种情况?只有在将 cmd 文件更改为在 RAM 中运行代码后、错误才会出现、您能帮助我解决这个问题吗?
您好!
我已将该线程提请编译器专家进行进一步分析。
谢谢
Ki
谢谢你的答复, 这个问题困扰我很多。
请搜索文章 链接器命令文件入门 、找到标题为" 在一个地址加载、从另一个地址运行"的部分。 在链接器命令文件中更改这些行...
[报价用户 id="282384" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1396931/tms320f28377d-run-in-ram "].TI.ramfunc:{App1.obj (.text)、
app2.obj(.text)}
负载= FLASHH、
RUN = RAMS2_6、
Load_start (_RamfuncsLoadStart)、
Load_Size (_RamfuncsLoadSize)、
Load_End (_RamfuncsLoadEnd)、
RUN_START (_RamfuncsRunStart)、
RUN_SIZE (_RamfuncsRunSize)、
RUN_END (_RamfuncsRunEnd)、
[报价]...相似的例子在文章。 此外、应用 ramfunc 所有函数的"Resource Variant"属性 .TI.ramfunc Output section。 有关详细信息、 请在 C28x 编译器手册中搜索 短语 ramfunc 属性。
谢谢。此致、
-George.
您好、George
感谢您提供的信息。 令我困惑的是、如果添加了其他 app_x.obj (.text)、则不会出现错误、只有在我添加 app_2.obj (.text)后、编译才会错误。
下面是详细信息:
(1) 添加了其他 app_x.obj (.text)、无错误:
(2) 添加第2个.obj (.text)后、 会出现错误
那么, 两个.c 文件之间有什么区别 ,这可能导致这个错误? 您对我有什么快速找到问题的建议吗?
谢谢。
类型的应用 -- opt_level=4. . 这也称为链接时优化(LTO)。 LTO 包括将程序的大多数部分重新编译成单个临时目标文件。 此临时文件具有名称 具有这些错误消息。 由于使用 LTO、 请勿引用链接器命令文件中的特定目标文件。 否则、您最终可以重新定义相同的函数和数据、从而导致这些构建错误。
两个.c 文件之间有什么区别 会导致此错误?
我不确定、但我认为有一个文件不是使用构建的 -- opt_level=4. 、因此它定义的任何函数或数据都不会出现在中 . 因此、该文件出现在链接器命令文件中并不会导致任何重新定义错误。
该修复程序与我在上一篇文章中所描述的相同。 更改链接器命令文件以引用任何目标文件。 以在输出段中找到所需的函数 .TI.ramfunc 、应用 ramfunc 属性。
谢谢。此致、
-George.
您好、George
感谢您的建议。 使用 CODE_SECTION 代替上述方法 是 有效的。 但是、对于-opt_level、也会报告相同的错误、如果您对此有任何想法、请联系我。
还有一个问题、 运行代码的 RAM 区域是否应该 是连续的? 我可以在不同的 RAM 区域中运行代码吗、例如 我尝试过的 RAMLS0_LS3和 RAMLS5、它似乎无效。
谢谢。 祝你度过美好的一天!
使用 code_section 代替上述方法 是 有效的。
我不知道您的意思。
关闭-opt_level 也报告相同的错误
我感到困惑。 发生了什么错误? 请显示一个示例。 请复制并粘贴关联命令、系统响应等的文本 请勿使用屏幕截图。
运行代码的 RAM 区域是否应该是 连续的? 我可以在不同的 RAM 区域中运行代码吗、比如 我尝试过的 RAMLS0_LS3和 RAMLS5、它似乎无效。[/QUOT]请查看 此论坛帖子是否 有帮助。
谢谢。此致、
-George.
您好、George
我不确定您的意思。
我的意思是使用 #pragma CODE_SECTION (App_Unit 44xxxx、".TI.ramfunc")、没有错误报告。 "4.12.54" App_Unit 是 属于"4.38c" App_Unit 文件的函数。 我认为这种方法是您所建议的方法。
我很困惑。 发生了什么错误? 请显示一个示例。 请复制并粘贴关联命令、系统响应等的文本 请勿使用屏幕截图。
小程序
{
第0页:/*程序内存*/
begin:origin = 0x084000, length = 0x000002
RAMD0_1:origin = 0x00B000、length = 0x001000 /* boot code */
RAMLS0:origin = 0x008000、length = 0x000800 /* CLA code */
RAMLS2_5:origin = 0x009000、length = 0x002000 /* CPU1 code */
复位:origin = 0x3FFFC0、length = 0x000002
/*闪存扇区*/
FLASHA_B:origin = 0x080000、length = 0x004000 /* boot */
FLASHC_G:origin = 0x084002、length = 0x01BFFE /* app *
FLASHH:origin = 0x0A0000、length = 0x008000 /*片上闪存*/
FLASH:origin = 0x0A8000、length = 0x008000 /*片上闪存*/
FLASHJ:origin = 0x0B0000、length = 0x008000 /*片上闪存*/
FLASHK:origin = 0x0B8000、length = 0x002000 /*片上闪存*/
FLASHL:origin = 0x0BA000、length = 0x002000 /*片上闪存*/
FLASHM:origin = 0x0BC000、length = 0x002000 /*片上闪存*/
FLASHn:origin = 0x0BE000、length = 0x001FFE /*片上闪存*/
第1页:
BOOT_RSVD:origin = 0x000002、length = 0x000120 /*作为 M0的一部分、引导 ROM 将使用此值用于 STACK */
RAMM0_1:origin = 0x000126、length = 0x0006D9 /*引导数据*/
RAMLS1:origin = 0x008800、length = 0x000800 /* CLA data */
RAMGS0_6:origin = 0x00C000、length = 0x007000 /* CPU1 DATA */
RAMGS7:origin = 0x013000、length = 0x001000 /* CPU1 CPU2共享数据、CPU1可以读写、CPU2只能读*/
RAMGS8_15:origin = 0x014000、length = 0x008000 /* CPU2 data */
CPU2TOCPU1RAM (R):origin = 0x03F800、length = 0x000400 /* CPU1仅读取*/
CPU1TOCPU2RAM:origin = 0x03FC00、length = 0x000400
CLA1_MSGRAMLOW:origin = 0x001480、length = 0x000080
CLA1_MSGRAMHIGH:origin = 0x001500、length = 0x000080
}
部分中)
{
/*分配方案领域:*/
.cinit :> FLASHC_G page = 0, align(4)
.pinit :> FLASHC_G PAGE = 0, ALIGN (4)
.text:>> FLASHC_G、page = 0、align (4)
codestart :> begin page = 0, align(4)
/*分配未初始化的数据段:*/
stack:> RAMM0_1页面= 1.
.ebss :>> RAMGS0_6, page = 1.
.esysmem :> RAMGS0_6 page = 1.
/*初始化段进入闪存*/
econst:> FLASHC_G PAGE = 0、ALIGN (4)
.switch:> FLASHC_G PAGE = 0、ALIGN (4)
.reset :> RESET , PAGE = 0, TYPE = DSECT /*未使用*/
secureFlashFuncs:>FLASHC_G page = 0、align (4)
FPUmathTables :> FLASHC_G, page = 0, align (4)
CLADATA :> RAMLS1, page = 1.
Cla1ToCpuMsgRAM:>CLA1_MSGRAMLOW、page = 1
CpuToCla1MsgRAM:>CLA1_MSGRAMHIGH、page = 1.
组:> RAMGS7,页面= 1.
{
ADC_RAM /* AD 数据共享 RAM */
}
/* CLA 特定部分*/
Cla1Prog:负载= FLASHC_G、
RUN = RAMLS0、
Load_start (_Cla1funcsLoadStart)、
Load_End (_Cla1funcsLoadEnd)、
RUN_START (_Cla1funcsRunStart)、
Load_Size (_Cla1funcsLoadSize)、
PAGE = 0、ALIGN (4)
#ifdef __TI_Compiler_version__
#if __TI_Compiler_version__>= 15009000
.TI.ramfunc:
{App_Unit 4.12.4.obj (.text)}//不应启用、否则会出现错误。
//但是,如果其他.c 文件被放置在这里,没有错误。
负载= FLASHC_G、
运行= RAMLS2_5、
Load_start (_RamfuncsLoadStart)、
Load_Size (_RamfuncsLoadSize)、
Load_End (_RamfuncsLoadEnd)、
RUN_START (_RamfuncsRunStart)、
RUN_SIZE (_RamfuncsRunSize)、
RUN_END (_RamfuncsRunEnd)、
PAGE = 0、ALIGN (4)
#else
ramfuncs:load = FLASHCDEFG、
运行= RAMLS2_5、
Load_start (_RamfuncsLoadStart)、
Load_Size (_RamfuncsLoadSize)、
Load_End (_RamfuncsLoadEnd)、
RUN_START (_RamfuncsRunStart)、
RUN_SIZE (_RamfuncsRunSize)、
RUN_END (_RamfuncsRunEnd)、
PAGE = 0、ALIGN (4)
#endif
#endif
/*使用 IPC API 驱动程序时、需要以下部分的定义*/
GROUP :> CPU1TOCPU2RAM, PAGE = 1.
{
}
Group :> CPU2TOCPU1RAM, page = 1.
{
}
#ifdef CLA_C
/* CLA C 编译程序段*/
//
//必须分配给 CLA 具有写入访问权限的内存
//
CLAscratch:
{*。obj (CLAscratch)
. += CLA_SCRATCHPAD_SIZE;
*.obj (CLAscratch_end)}> RAMLS1, page = 1.
scratchpad :> RAMLS1, page = 1.
bss_cla :> RAMLS1, page = 1.
.const_cla:load = FLASHC_G、
RUN = RAMLS1、
RUN_START (_Cla1ConstRunStart)、
Load_start (_Cla1ConstLoadStart)、
Load_Size (_Cla1ConstLoadSize)、
PAGE = 1、ALIGN (4)
#endif //cla_C
//------------------ //
以上是 主 CMD 文件、报告错误如下:
#10056符号"_App_xxx"重新定义:最初在" ";在" App_Unit 050.obj"中重新定义
off -opt_level 也报告相同的错误
您说这些错误 可能与优化有关、因此 我关闭了该选项、同样的事情也会发生。
感谢您的答复和耐心。
我的意思是使用#pragma code_section (App_Unit aultxxxx、".TI.ramfunc")、无错误报告。 "4.12.54" App_Unit 是 属于"4.38c" App_Unit 文件的函数。 我认为这种方法是您所建议的方法。 [报价]我不建议使用 #pragma CODE_SECTION . 我建议使用 ramfunc 属性。 使用最显著的影响 ramfunc 受影响的函数被分配给 .TI.ramfunc . 但其他事情也会发生。
即使您禁用了优化、您仍会看到此诊断...
[报价 userid="282384" url="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1396931/tms320f28377d-run-in-ram/5361339 #5361339"]#10056符号"_App_xxx"重新定义:最初在" ";在 App_Unit 307.obj 中重新定义[/报价]请将您的 CCS 工程置于发生这种情况的状态。 接下来、 重建整个项目。 方法之一是右键点击工程名称并选择 重新编译工程 . 然后将"Console"(不是问题)视图的内容保存到文本文件。 使用命名的图标 复制构建日志 (较早版本的 CCS)或 将构建日志保存到文件中 (CCS 的较新版本)。 为日志文件命名时、请确保使用文件扩展名.txt。 请 在下一篇文章中附加该文本文件。
谢谢。此致、
-George.
您好、George
我使用 ramfunc 属性 、它也起作用。 影响 #pragma CODE_SECTION 或者 ramfunc 属性是有效的。 因此、我决定忽略 CMD 文件中引用{.txt}引起的问题。 感谢您的大力支持。 祝你度过美好的一天!