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.

[参考译文] 编译器/TMS320F28023:链接器帮助-需要将特定的.obj 文件放置在不同的闪存扇区中

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/696890/compiler-tms320f28023-linker-help---need-to-place-specific-obj-files-in-different-flash-sectors

器件型号:TMS320F28023

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

您好!

我正在使用由前一位工程师创建的链接器 cmd 文件、并准备加快内存分配。  该 Piccolo 具有4个闪存扇区。  当前、所有工作代码都链接到 FLASHB_C (在第0页上)、这是一个由两个闪存扇区组成的联合体。  扇区 FLASHA 当前用于引导加载程序、但 FLASHB_C 的利用率超过90%、因此我想将一些不变的函数与引导加载程序一起放在 FLASHA (位于第1页)中、以释放代码空间并降低利用率。  当前链接器文件包括以下内容:

Flash28_API:
{
-lFlash2802x_API_V200.lib (.econst)
-lFlash2802x_API_V200.lib (.text)

} 负载= FLASHB_C、
运行= PRAML0、
Load_start (_Flash28_API_LoadStart)、
Load_End (_Flash28_API_LoadEnd)、
RUN_START (_Flash28_API_RunStart)、
PAGE = 0
.cinit :> FLASHB_C PAGE = 0.Pinit
:> FLASHB_C、 PAGE = 0.text
:> FLASHB_C PAGE = 0
codestart :>开始 PAGE = 0
ramfuncs :LOAD = FLASHB_C、
运行= PRAML0、
load_start (_RamfuncsLoadStart)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
PAGE = 0

csmpasswds :>csm_PWL_P0 page = 0
csm_rsvd :>csm_RSVD page = 0 

修改链接器文件仍然是一项非常新的工作。  我看到所有.text 被抛出到 FLASHB_C 中  我想选择.obj、例如 FlashCal.obj、进入 FLASHA、但当我尝试手动添加它时、.map 文件不会更改、我看到 FlashCal.obj 位于 FLASHb_C 内 我是否需要单独分配所有 file.obj (.text)> FLASH 才能分离单个.obj?

我仍在学习此文件中的重要内容。  让我知道您需要从 cmd 文件中获得哪些其他信息(我可能无法发布整个文件)。

感谢所有的帮助!

杰克逊

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

    有关链接器命令文件的一些一般背景信息、请参阅文章 链接器命令文件入门。  您或许能够从中单独找出解决方案。

    [引用 user="Jackson Thomas"]我想使用引导加载程序将一些未更改的函数放入 FLASHA (位于第1页)中[/quot]

    这是一个合理的想法。  除了一件事。  是否确定 FLASHA 位于第1页?  我会在第0页看到它、如 FLASHB_C  我不知道为什么会出现在第1页上。  我们可能需要让一些 C28x 器件专家参与解决此问题。

    谢谢、此致、

    乔治

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

    谢谢 George、

    它确实位于内存部分的第1页上。

    内存
    {
    PAGE 0:/*程序内存*/
    /*内存(RAM/FLASH/OTP)块可移动到第1页进行数据分配*/
    
    PRAML0 :origin = 0x008000、length = 0x000800 /*片上 RAM 块 L0 */
    OTP :origin = 0x3D7800,length = 0x000400 /*片上 OTP */
    APP_SIGN:origin = 0x3F5FF6,length = 0x000002,fill = 0xA5A5 /* FLASHC 的一部分。 用于存储应用程序签名。 //
    CKSM_RSVD:origin = 0x3F5FF8,length = 0x000006 /* FLASHC 的一部分。 用于存储应用程序校验和。 */
    开始 :origin = 0x3F5FFE,length = 0x000002 /* FLASHC 的一部分。 用于"引导至闪存"引导加载程序模式。 */
    FLASHB_C:origin = 0x3F2000,length = 0x003FEE /*根据芯片勘误咨询、片上闪存扇区 b 和 c 0x3F5FEF 至0x3F5FF6未使用。
     有关更多详细信息、请参阅 www.ti.com/.../sprz292l.pdf。 *
    / FLASHD :origin = 0x3F0000、length = 0x002000 //片上闪存*/
    csm_RSVD:origin = 0x3F7F80,length = 0x000076 /* FLASHA 的一部分。 当 CSM 正在使用时、使用所有0x0000进行编程。 //
    csm_PWL_P0:origin = 0x3F7FF8,length = 0x000008 /* FLASHA 的一部分。 FLASHA */
    
    IQTABLES 中的 CSM 密码位置:origin = 0x3FE000,length = 0x000B50 /*引导 ROM 中的 IQMath 表*/
    IQTABLES2:origin = 0x3FEB50,length = 0x00008C /*引导 ROM 中的 IQMath 表*/
    IQTABLES3:origin = 0x3FEBDC,length = 0x0000AA/*引导 ROM 中的 IQMath 表*/
    
    ROM :origin = 0x3FF27C、length = 0x000D44 /*引导 ROM */
    重置 :origin = 0x3FFFC0,length = 0x000002 引导 ROM 的/*部分*/
    向量 :origin = 0x3FFFC2,length = 0x00003E /*引导 ROM 的一部分*/*
    FLASHB :origin = 0x3F4000,length = 0x002000 */*片上闪存*/*
    FLASHC :origin = 0x3F2000,length = 0x002000 */*片上闪存*/
    
    page 1:/* Data Memory */
    /*内存(RAM/FLASK/OTP)块可被移动至 PAGE0以进行程序分配*/
    /*寄存器保留在第1页上 //
    
    boot_RSVD:origin = 0x000000,length = 0x000050 // M0的一部分,引导 ROM 将此用于栈*/
    RAMM0 :origin = 0x000050、length = 0x0003B0 /*片上 RAM 块 M0 */
    RAMM1 :origin = 0x000400、length = 0x000400 /*片上 RAM 块 M1 */
    DRAML0 :origin = 0x008800,length = 0x000800 /*片上 RAM 块 L0 */
    FLASHA :origin = 0x3F6000,length = 0x001F80 /*片上闪存*/
    } 

    我知道、外壳代码将指示它也应该位于第0页上。 我不知道为什么它被放置在第1页上。  如果我们尝试拆分代码放置、这是否是一个问题?

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

    这些页面是旧设备的剩余页面、您可以随意在页面之间移动存储器或将所有内容放在第0页上。

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

    谢谢、我已经解决了。  将这两个段组合到同一页后、我能够将.obj 文件移动到另一个扇区。

    我最后在内存部分将 FLASHA 分为两部分、将 FLASHA 和 FLASHA_2各分配给扇区 A 的一半内存   

    FLASHA :origin = 0x3F6000,length = 0x001000 /*片上闪存*/
    FLASHA_2:origin = 0x3F7000,length = 0x000F80/* FlashA*/中的额外代码空间 

    然后、我创建了一个名为 Section_Extra 闪存的新段、在这里放置了我要移动的.obj 文件、并将其余.text 分配给之前放置在其所在位置的 FLASHA_C。  我不确定这一新段最终是否必要、但这是我唯一能够编译代码的方法。

    SECTION _Extra:
    {
    file1.obj (.text)
    file2.obj (.text)
    file3.obj (.text)
    File4.obj (.text)
    }> FLASHA_2、page = 0
    
    .text :> FLASHB_C PAGE = 0 

    现在、我可以在映射文件中看到所有4个文件都位于 Section_Extra 闪存中、并放置在存储器位置0x3F7xxx 中。  这在我定义了一个新的段名后非常简单、否则任何内容都不会改变存储器位置。

    谢谢