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.

[参考译文] TMS320F28386D:将 COFF 迁移到 EABI

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

https://e2e.ti.com/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1362194/tms320f28386d-migration-coff-to-eabi

器件型号:TMS320F28386D

我在处理 C6000架构项目时遇到问题。 具体来说、我收到以下错误:[E0200]无法解析该可重定位表达式;C6000 EABI 中不支持任意表达式的重定位支持。

错误消息继续显示、问题似乎与代码中的宏定义有关。 我查看过代码、但无法识别任何明显的问题、因此我将联系以查看是否有人以前遇到过类似的问题、并且知道如何解决。

如果有人对可能导致此错误的原因或如何进一步解决此错误有任何见解或建议、我将不胜感激。

非常感谢您提供任何帮助或建议。

POINT_RVI .macro
MPY P、AR0、#(__LnPgVI>>6)
添加 PL、#(0x03FF 和(flgBKB>>6))
按 PL
弹出 DP
.endme2e.ti.com/.../Nuovo-documento-di-testo-_2800_2_2900_.txt

谢谢你!"

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

    您可以使用 C2000编译器工具链。  此诊断...

    [E0200]无法解析此可重定位表达式;任意表达式的重定位支持在 C6000 EABI 中不可用。

    ...出现拼写错误。  它应该显示 C2000 EABI、而不是 C6000 EABI。

    像这样的表达

    [报价用户 id="545366" URL="~/support/microcontrollers/c2000-microcontrollers-group/c2000/f/c2000-microcontrollers-forum/1362194/tms320f28386d-migration-coff-to-eabi "]#(__LnPgVI>>6)[/QUOT]

    或此...

    #(0x03FF &(flgBKB>>6)

    C2000 EABI 不支持...  这是因为 __ LnPgVI FlgBKB 是可重定位的符号、其值在汇编时未知。  当可重定位的符号是类似较大表达式的一部分时、它称为可重定位的表达式。  这些表达式在较旧的 COFF ABI 中受支持、而在较新的 EABI 中不受支持。   

    我不确定修复该宏的最佳方法。  像这样计算进入 DP 的地址是不寻常的。  我将通知 C2000 CPU 专家有关该主题的信息。

    更笼统地说、 C2000从 COFF 迁移到 EABI 一文 可能会很有用。

    谢谢。此致、

    -George.

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

     感谢您发送编修。  我同意、用于计算 DP 中地址的宏方法是非常规的。  它用于循环8各个通道。

    下面我留下一个代码提取、其中针对8个通道验证了 VoBKBi 变量的过压。

    感谢您愿意通知专家。

    谢谢、此致、Marcos

    MOV AR0、#(nChReg-1)

    ***

    ***

    ***

    --- 过电压输出(IsrIst.6)----------------

    POINT_RVI
    CMP @VoBKBi、#VoutMax_h
    SB IIstb2_0、LT

    TSET @IsrIst,#6 ; Attiva 标志关键字
    LB IIstb2nd

    IIstb2_0 CMP @VoBKBi、#VoutMax_l
    Sb IIstb26.2、GT

    ;TBIT @flgBKB,#12 ; N. B:来达科迪采原创
    ;SB IIstb 二次、NTC

    TCLR @IsrIst,#6; Resetta 标记关键字

    Iistb2nd;NOP

    ;----------- 过电压 Vbus (IsrIst.5)---------------

    POINT_RVI
    NOP *、ARP2

    MOVL XAR2、#VoRLYi
    CMP *、#VbusMax_h
    SB IIstb1_0、LT

    TSET @IsrIst,#5; Attiva 标志关键字
    LB IIstb1nd

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

    添加了从变量定义中提取的内容。 我认为这些符号不可重定位 您认为什么?

    flgBKB .usect "。 Vipg1"、1;标志控制器
    _flgBKB .set flgBKB

    LnPgVI 在 cmd 内定义

    ****

    (续

    相关

    .TI.ramfunc
    {-l F2838x_C28x_FlashAPI.lib}

    } LOAD = FLASHD、
    RUN = RAMLS0_LS3
    Load_start (RamfuncsLoadStart)、
    Load_Size (RamfuncsLoadSize)、
    RUN_START (RamfuncsRunStart)、
    PAGE = 0、ALIGN (8)

    . isr_code:load = FLASHN、
    RUN = RAMGS8_GS9、
    Load_Start (ISRcodeLoadStart)
    Load_Size (ISRcodeLoadSize)、
    RUN_START (ISRcodeRunStart)、
    PAGE = 0、ALIGN (8)

    .reset :> RESET , PAGE = 0, TYPE = DSECT /*未使用,*/
    stack:> RAMstack、page = 1.
    .bss:> RAMbss、page = 1.
    bss:cio:> RAMbss、page = 1.
    .data :> RAMbss, page = 1.
    .sysmem :> RAMbss, page = 1.


    . RamShare0:> RAMGS0、PAGE = 1

    .reg1:> lx_reg1、page = 1
    .reg2:> lx_reg2、page = 1
    .reg3:> lx_reg3、page = 1
    .reg4:> lx_reg4、page = 1
    .reg5 :> lx_reg5, page = 1.
    .reg6:> lx_reg6、page = 1
    .reg7 :> lx_reg7, page = 1.
    . Vipg1 :> LxVipg1, page = 1.
    . Vipg2 :> LxVipg2, page = 1,{_LnPgVI=2*0x40;}
    . VIoth :> LxVIoth, page = 1.
    bfcom :> lx_oth, page = 1.

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

    尝试以下操作-将变量分配给存储器块时、创建一个 run_start ( )符号-类似于对 flashAPI 库执行的操作。 此符号定义为 extern、可在代码中使用。  

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

    Ciao Lori、您是否建议这样做?

    -e code_start /* Forza 入口点 su pcode */
    -stack 0x05F8 /*按堆栈 C ed asm */分配堆栈


    小程序

    第0页:

    begin:origin = 0x080000、length = 0x000002

    Check_1:origin = 0x080008、length = 0x000008
    Check_2:origin = 0x080010、length = 0x000008
    Check_3:origin = 0x080018、length = 0x000018

    /*RAMLS0:origin = 0x008000、length = 0x000800
    RAMLS1:origin = 0x008800、length = 0x000800
    RAMLS2:origin = 0x009000、length = 0x000800
    RAMLS3 : origin = 0x009800、length = 0x000800*/
    RAMLS0_LS3:origin = 0x008000、length = 0x002000

    RAMGS5:origin = 0x012000、length = 0x001000
    RAMGS6:origin = 0x013000、length = 0x001000
    RAMGS7:origin = 0x014000、length = 0x001000

    /*RAMGS8:origin = 0x015000、length = 0x001000
    RAMGS9:origin = 0x016000、length = 0x001000*/
    RAMGS8_GS9:origin = 0x015000、length = 0x001FF0

    复位:origin = 0x3FFFC0、length = 0x000002

    /*闪存扇区*/
    FLASHA : origin = 0x080030, length = 0x001FD0 /* check control sector */

    /*FLASHB:origin = 0x082000、length = 0x002000
    FLASHC:origin = 0x084000, length = 0x002000*/
    FLASHB_C:origin = 0x082000、length = 0x004000

    FLASHD:origin = 0x086000、length = 0x002000
    /*FLASHE:origin = 0x088000、length = 0x008000
    FLASHF:origin = 0x090000、length = 0x008000*/
    FLASHE_F:origin = 0x088000、length = 0x010000

    FLASHG:origin = 0x098000、length = 0x008000 /*片上闪存*/
    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 = 0x001FF0

    第1页:

    BOOT_RSVD:origin = 0x000002、length = 0x0001AF /* M0的一部分、引导 ROM 将使用此作为堆栈*/
    RAMM0free:origin = 0x0001B1、length = 0x00004F

    /*RAMM0:origin = 0x000200、length = 0x000200
    RAMM1:origin = 0x000400、length = 0x000400*/
    RAMstack:origin = 0x000200、length = 0x0005F8

    // RAMM1_RSVD:origin = 0x0007F8、length = 0x000008 /*根据 errata 公告"内存:预取超出有效内存"*/保留代码、请勿用于此代码

    RAMLS4:origin = 0x00A000、length = 0x000800
    RAMLS5:origin = 0x00A800、length = 0x000800

    /*RAMLS6:origin = 0x00B000、length = 0x000800
    RAMLS7:origin = 0x00B800、length = 0x000800
    RAMD0:origin = 0x00B000、length = 0x000800
    RAMD1:origin = 0x00B800、length = 0x000800*/
    RAMbss:origin = 0x00B000、length = 0x002000

    RAMGS0:origin = 0x00D000、length = 0x001000

    /*RAMGS1:origin = 0x00E000、length = 0x001000*/
    LX_REG1:origin = 0x00E000、length = 0x000040
    LX_REG2:origin = 0x00E040、length = 0x000040
    LX_REG3:origin = 0x00E080、length = 0x000040
    LX_REG4:origin = 0x00E0C0、length = 0x000040
    LX_REG5:origin = 0x00E100、length = 0x000040
    LX_REG6:origin = 0x00E140、length = 0x000040
    LX_REG7:origin = 0x00E180、length = 0x000040
    LxVIpg1:origin = 0x00E1C0、length = 0x000040
    LxVIpg2:origin = 0x00E200、length = 0x000040
    LxVIoth:origin = 0x00E240、length = 0x000380
    LX_OTH:origin = 0x00E5C0、length = 0x000A40

    RAMGS2 : origin = 0x00F000, length = 0x001000

    /*RAMGS3:origin = 0x010000、length = 0x001000*/
    LX_REG1_CPU2:origin = 0x010000、length = 0x000040
    LxVIpg1_CPU2:origin = 0x010040、length = 0x000040
    LxVIpg2_CPU2:origin = 0x010080、length = 0x000040
    LxVIoth_CPU2:origin = 0x0100C0、length = 0x000380
    LX_OTH_CPU2:origin = 0x010440、length = 0x000BC0


    /*RAMGS4:origin = 0x011000、length = 0x001000*/
    RAMGS4_1:origin = 0x011000、length = 0x000400
    RAMGS4_2:origin = 0x011400、length = 0x000400


    CPU1TOCPU2RAM:origin = 0x03A000、length = 0x000800
    CPU2TOCPU1RAM:origin = 0x03B000、length = 0x000800

    CPUTOCMRAM:origin = 0x039000、length = 0x000800
    CMTOCPURAM:origin = 0x038000、length = 0x000800
    }


    部分中)

    codestart :> beging, page = 0, align(8)

    codec_c :> check_1, page = 0, align(8)
    codec_asm :> check_2, page = 0, align(8)
    codec_text :> check_3, page = 0, align(8)

    .cinit :> FLASHB_C, page = 0, align(8)
    .init_array :> FLASHB_C, page = 0, align(8)

    .const:> FLASHB_C、PAGE = 0、ALIGN (8)

    .text:> FLASHE_F、page = 0、align (8)

    .switch :负载= FLASHD,
    RUN = RAMLS0_LS3
    Load_Start (SwitchLoadStart);
    Load_Size (SwitchLoadSize)、
    RUN_START (SwitchRunStart)、
    PAGE = 0、ALIGN (8)

    相关

    .TI.ramfunc
    {-l F2838x_C28x_FlashAPI.lib}

    } LOAD = FLASHD、
    RUN = RAMLS0_LS3
    Load_start (RamfuncsLoadStart)、
    Load_Size (RamfuncsLoadSize)、
    RUN_START (RamfuncsRunStart)、
    PAGE = 0、ALIGN (8)

    . isr_code:load = FLASHN、
    RUN = RAMGS8_GS9、
    Load_Start (ISRcodeLoadStart)
    Load_Size (ISRcodeLoadSize)、
    RUN_START (ISRcodeRunStart)、
    PAGE = 0、ALIGN (8)

    .reset :> RESET , PAGE = 0, TYPE = DSECT /*未使用,*/
    stack:> RAMstack、page = 1.
    .bss:> RAMbss、page = 1.
    bss:cio:> RAMbss、page = 1.
    .data :> RAMbss, page = 1.
    .sysmem :> RAMbss, page = 1.


    . RamShare0:> RAMGS0、PAGE = 1

    .reg1:> lx_reg1、page = 1
    .reg2:> lx_reg2、page = 1
    .reg3:> lx_reg3、page = 1
    .reg4:> lx_reg4、page = 1
    .reg5 :> lx_reg5, page = 1.
    .reg6:> lx_reg6、page = 1
    .reg7 :> lx_reg7, page = 1.
    . Vipg1 :> LxVipg1, page = 1.
    . Vipg2 :> LxVipg2, page = 1,{_LnPgVI=2*0x40;}, run_start (_LnPgVI)
    . VIoth :> LxVIoth, page = 1.
    bfcom :> lx_oth, page = 1.

    . RamShare1:> RAMGS2、PAGE = 1

    reg1_cpu2 :> lx_reg1_cpu2, page = 1.
    . Vipg2_CPU2:> LxVipg2_CPU2、page = 1
    bfcom_cpu2 :> lx_oth_cpu2, page = 1.

    MSGRAM_CPU1_TO_CPU2:> CPU1TOCPU2RAM、type=NOINIT
    MSGRAM_CPU2_TO_CPU1:>CPU2TOCPU1RAM、type=NOINIT
    MSGRAM_CPU_TO_CM:>CPUTOCMRAM、type=NOINIT
    MSGRAM_CM_TO_CPU :> CMTOCPURAM, type=NOINIT

    . DataLog1:> RAMGS4_1、page = 1、run_start (pLog)
    . DataLog2:> RAMGS4_2、page = 1.


    /*使用 IPC API 驱动程序时、需要以下部分的定义*/
    GROUP :> CPU1TOCPU2RAM, PAGE = 1.

    PUTBUFFER
    PUTWRITEIDX
    GETREADIDX
    }

    Group :> CPU2TOCPU1RAM, page = 1.

    GETBUFFER : type = DSECT
    GETWRITEIDX :类型= DSECT
    PUTREADIDX:类型= DSECT
    }


    }

    谢谢 Marcos

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

    尊敬的 Marcos:

    .reg1:> lx_reg1、page = 1
    .reg2:> lx_reg2、page = 1
    .reg3:> lx_reg3、page = 1
    .reg4:> lx_reg4、page = 1
    .reg5 :> lx_reg5, page = 1.
    .reg6:> lx_reg6、page = 1
    .reg7 :> lx_reg7, page = 1.
    . Vipg1 :> LxVipg1, page = 1.
    . Vipg2 :> LxVipg2, page = 1,{_LnPgVI=2*0x40;}, run_start (_LnPgVI)
    . VIoth :> LxVIoth, page = 1.
    bfcom :> lx_oth, page = 1.

    是的、我一直在思考这样的事情。 我不确定 {_LnPgVI=2*0x40;}是什么。 也许我误解了你想做什么?

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

    您好、Lori、 POINT_RVI 宏根据_LnPgVI 计算存储器地址、并根据 flgBKB 得出的值进行调整。 这用于将数据指针 DP 设置到存储器中的特定位置、其中的变量。 VIpg2部分位于。

    LnPgVI 的变化范围为0至8并对应于降压/升压通道数、而 flgBKB 是总结故障的标志。

    我尝试了定义.VIpg2 : > LxVIpg2, PAGE = 1, {__LnPgVI=0x80;}而不是.VIpg2 : > LxVIpg2, PAGE = 1, {__LnPgVI=2*0x40;}、并且__LnPgVI编译了变量、但flgBKB没有。 为什么 EABI 不认为它是绝对的? 此变量定义如下:

    flgBKB .usect "。 Vipg1"、1;标志控制器
    _flgBKB .set flgBKB ;

    部分 "。 VIpg2"


    ;SEZ。 第二个。 每个 BKB 页2

    Vbathf .usect "。 Vipg2"、1;tens. 电池 滤液
    _Vbathf .set Vbathf

    Ibathf .usect "。 Vipg2"、1;tens. 校正 滤液
    _Ibathf .set Ibathf

    VoBKBhf .usect "。 Vipg2"、1;tens. di uscita fillata
    _VoBKBhf .set VoBKBhf

    ILbkbhf .usect "。 VIpg2"、1;Corr. di uscita fillata
    _ILbkbhf .set ILbkbhf

    _Vbatlf .usect "。 Vipg2"、1;tens. 电池 滤液
    _Ibatlf .usect "。 Vipg2"、1;tens. 校正 滤液
    _VoBKBlf .usect "。 Vipg2"、1;tens. di uscita fillata
    _ILbkblf .usect "。 VIpg2"、1;Corr. di uscita fillata

    V3eBKB .usect "。 Vipg2", 2,1,1 ; P.I. terzo anello di tensione.
    V3e1BKB .set V3eBKB+1
    pV3BKB .usect "。 VIpg2"、2、1、1.
    SatV3max .usect "。 VIpg2"、2、1、1.
    SatV3min .usect "。 VIpg2"、2、1、1.

    Err3Imax .usect "。 VIpg2"、2、1、1.
    Err3Imin .usect "。 VIpg2"、2、1、1.

    I3eBKB .usect "。 Vipg2", 2,1,1 ; P.I. terzo anello di corrente.
    I3e1BKB .set I3eBKB+1
    pi3BKB .usect "。 Vipg2"、2、0、1
    SatI3max .usect "。 VIpg2"、2、1、1.
    SatI3min .usect "。 VIpg2"、2、1、1.

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

    输出段中是否有可用于确定 DP 的全局变量?

    在组装过程中、这只是 MOVW DP、#

    例如:  

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

    大家好、Gloria 、我们已将宏的两个变量定义为全局变量  

    .global _LnPgVI、flgBKB、_flgBKB

    --------------------------------------------------------

    flgBKB .usect "。 Vipg1"、1;标志控制器

    _flgBKB .set flgBKB

    --------------------------------------------------------

    POINT_RVI .macro
    MPY P、AR0、#(__LnPgVI>>6)
    添加 PL、#(0x03FF 和(flgBKB>>6))
    PUSH PL
    POP DP

    我已经意识到、为了定义您使用的.asg 的变量、这可以生成错误吗? 另一点、我了解到、对于 EABI 中的.asm、没有必要声明 undercor _。 是这样吗?

    在 C 语言中、我已将符号定义为

    extern uint flgBKB、 _LnPgVI ...这是错的?

    最棒的地方!Marcos

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

    我的汇编中的.asg 语句是替换项、使代码能够同时用于 EABI (变量上无下划线)和 COFF (变量上的下划线)。  它类似 C 语言中 的#define。如果我在 EABI 中编译、 _myVar 将被视为 myVar (有关更多信息、请访问 www.ti.com/lit/spru513)

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

    您好、Lori、 我通过按如下所示修改宏成功解决了问题。

    POINT_RVI .macro
    ;添加 PL,#(flgBKB);(0x0387)
    MPY P、AR0、#(_LnPgVI>>6)
    按 ACC
    MOV ACC、#flgBKB
    LSR AL、#6
    添加 PL、AL
    按 PL
    弹出 DP
    弹出 ACC
    .endm

    感谢您的帮助、它非常有用