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.

[参考译文] TMS320F28377D:在 RAM 中运行

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1396931/tms320f28377d-run-in-ram

器件型号:TMS320F28377D

工具与软件:

大家好

我需要一些关于在 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}引起的问题。 感谢您的大力支持。 祝你度过美好的一天!