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.

[参考译文] TMS320F28069F:如何解决在 cmd 文件的 codestart 中添加 align (4)时出现的链接器错误

Guru**** 2543550 points


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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/782167/tms320f28069f-how-to-resolve-linker-error-for-adding-align-4-at-codestart-in-cmd-file

器件型号:TMS320F28069F

尊敬的 TI 成员

我已按如下方式修改 F28069F.cmd 文件

SECTIONS
{

//*分配程序区域:*/
.cinit :> FLASHA_B,PAGE = 0,ALIGN (4)
.pinit :> FLASHA_B,PAGE = 0,ALIGN (4)
.text :> FLASHA_B,PAGE = 0,ALIGN (4)
codestart :>开始, PAGE = 0、align (4)
ramfuncs :load = FLASHF,/* FLASHD -> FLASHF */
运行= RAML0_1、
load_start (_RamfuncsLoadStart)、
load_end (_RamfuncsLoadEnd)、
run_start (_RamfuncsRunStart)、
PAGE = 0、ALIGN (4) 

然后 、我遇到了如下链接器错误

"./F28069F.cmd"、第126行:错误#10099-D:程序将不可用
存储器。 对齐/分块的放置在" codestart"段中失败
大小为0x2、第0页。 可用存储器范围:
开始大小:0x2未使用:0x2最大孔:0x2

通过从 codestart 行中删除 align (4)、可以消除此错误、

但我必须在 codestart 的行末添加 align (4)、以满足调试工具的要求  

请告诉我如何避免链接器错误吗?

提前感谢。

此致、

Hae Ryong

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

    您正在使用的起始段的起始地址是什么? 它是否与4个字节对齐?
    在本例中、codestart 大小和 begin 内存段大小均为0x2。 因此、如果我们的"开始存储器"段不以4字节对齐的地址开头、链接器将无法分配这些段。

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

    感谢您的快速响应。

    请查看地图文件中的以下内容
    ===========================
    存储器配置

    名称 原点长度 已使用 未使用的属性填充
    ------------ ---- ------ ---- ---- --------
    第0页:
    RAML0_1 00008000 00002000 00000f58 000010a8 RWIX
    OTP 003d7800 00000400 00000000 00000400 RWIX
    FLASHH 003d8000 00004000 00000000 00004000 RWIX
    FLASHG 003dc000 00004000 00000000 00004000 RWIX
    FLASHF 003e0000 00004000 00000f58 000030a8 RWIX
    FLASHA_B 003e4000 00013f80 0000a15f 00009e21 RWIX
    CSM_RSVD 003f7f80 00000076 00000000 00000076 RWIX
    开始 003f7ff6 00000002 00000002 00000000 RWIX
    CSM_PWL_P0 003f7ff8 00000008 00000000 00000008 RWIX
    FPUTABLES 003fd590 000006a0 00000000 000006a0 RWIX
    IQTABLES 003fdc30 00000b50 00000b50 00000000 RWIX
    IQTABLES2 003fe780 0000008c 00000000 0000008c RWIX
    IQTABLES3 003fe80c 000000aa 00000000 000000aa RWIX
    ROM 003ff3b0 00000c10 00000000 00000c10 RWIX
    复位 003fffc0 00000002 00000000 00000002 RWIX
    矢量 003fffc2 0000003e 00000000 0000003e RWIX
    ===========================

    BEGIN 似乎不是4字节对齐,如何更改它?

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

    我不认为更改起始地址是一个好主意。 我认为引导加载程序正在使用该地址引导至闪存模式。
    为什么要为 CODE_START 区域设置 ALIGN (4)?

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

    您好!

    我正在尝试使用 easyDSP、这是 F280x 处理器的强大调试工具。

    但是、它需要按如下方式进行操作

    是否有任何解决方法?

    此致、

    Hae Ryong

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

    您可以从上一节借用2个字节。  CSM_RSVD 始终是此处的保留块。 您可以进行修改、如下所示:

    csm_RSVD:origin = 0x3F7F80,length = 0x000074 // FLASHA 的一部分。
    开始      :origin = 0x3F7FF4,length = 0x000004 // FLASHA 的一部分。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!
    没有直接的方法来完全满足您的要求。 但您可以采用这种方法、

    除了我在上一帖子中提到的更改之外、您还需要在下面进行更改。

    在 F2838x_CodeStartBranch.asm 文件中、请进行此更改、

    .sect "codestart"
    长整型0xFFFFFFFF
    code_start:
    LB _c_int00 ;分支到 RTS 库中启动。_asm
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    感谢您的反馈。

    我已经尝试直接修改起始地址、它不起作用、器件不启动。

    关于您的第二个建议、由于我的芯片组是 F28069F、我的 CodeStartBranch.asm 文件如下所示

    .sect "codestart"
    
    code_start:
    如果 WD_DISABLE = 1
    LB wd_disable ;分支到看门狗禁用代码
    其他
    LB _c_int00 ;分支到 RTS 库中 boot.asm 的启动
    endif
    
    ;end codestart 段 

    您是否会再次对该代码库应用您的建议?

    感谢您的善意帮助。

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

    是的! 我的设备可以通过您的第1次和第2次修改启动。

    我可以问您添加了'.long 0xFFFFFFFFF'的含义吗?


    此致、
    Hae Ryong
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    正如前面提到的 Veena 0x003f7ff6是闪存引导模式的起始地址、我们无法更改它、因为它是引导 ROM 中的硬编码。
    为了满足您对齐的要求、我建议使用4个字和前2个字中的虚拟数据、实际代码从0x003f7ff6开始。

    因此'.long 0xFFFFFFFFF'只是一个填充前2个字的虚拟数据。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、我明白了。

    感谢你的帮助。