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.
我在处理 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
感谢您的帮助、它非常有用