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.
您好!
我使用了 MSP-elf-gcc-5.0.0.0。 我尝试将工具链更新到最新的6.1.1.0 (GCC 7.3.2.154)。
当我将 gcc 与-O2选项一起使用时、编译和链接都有效。 但代码会重复暂停和看门狗复位。
当我使用 gcc with -O1选项时、链接失败、并显示以下消息:
/Users/jsjeong/Work/nol.a-sdk-core/nola-sdk/make/../ti-msp430f5438a/libcoxos.a (digital-io.o): 在 函数 中`digitalWriteInternal': digital-io.cpp:(.ise.text.digitalWriteInternal+0x9e): 重定位 被截断 以适合: R_MSP430X_ABS16 (针对 /Users/jsjeong/Work/nol.a-sdk-core/nola-sdk/make/../ti-msp430f5438a/libcoxos.a 中.rodata.pinInf o 段定义的符号` `pinInfo'):R_intnature.inc.intrab.text 段:R_intrunchinc.inc.inc.intrun.text:R+trunchina.un.text: /Users/jsjeong/Work/nol.a-sdk-core/nola-sdk/make/../ti-msp430f5438a/libcoxos.a Rf (针对.inc.intrun.inc.inc.inc.intrun.f.inc.inc.intrun.inc.inc.inc.inc.inc.inc.intrun.text 段被截断
我不知道为什么 pinInfo 结构被截断。 我同时使用-mcode-section=和-mdata-section=。
在 pinInfo 声明中添加了__attribute__((SECTION (FAR_ROM)))后,上述错误会得到解决,并且链接成功,但代码会重复停止,并像使用-O2的结果一样重置看门狗。
因此、我尝试降级到6.0.1.0 (GCC 7.3.1.24)、然后我的代码正常工作。
请检查一下。
谢谢、
Jongsoo
您好!
在构建应用程序代码和要链接的库代码时、您是否使用了"-mlarg"标志(以启用大内存模型)?
由于-mcode/data-region=任一选项都允许将代码和数据放置在上部存储器中(位于或高于地址0x10000)、因此 汇编器在默认小型存储器模型中生成的16位重定位类型(例如 R_MSP430X_ABS16)将不会到达上部存储器。 传递-mlarge 时、汇编器将使用20位重定位来重定位数据、数据可以到达上部存储器。
我怀疑您仅在7.3.2.154中看到此错误、因为与7.3.1.24相比、此版本的程序略大、因此需要使用上部存储器。 使用7.3.1.24时、-mdata-region=不会产生任何影响、因为整个程序都位于较低的存储器中、因此无需将任何内容放置在地址0x10000以上。
如果这确实是您的问题(-mcode/data-region=不使用-mlarge 时使用)、则我们实际上会添加警告以帮助用户在下一版本的工具链中诊断此问题。
此致、
您好!
感谢你的答复。
我在我的应用程序代码、库代码以及链接上使用了'-mlarg'标志。
当我将 GCC 7.3.1.24用于基于 MSP430F5419A 的目标板时、我发现了另一个类似的情况。
链接错误消息几乎相同。 但是、当我仅删除'-mdata-region=oeoe'时、错误会得到解决。
我附加了映射文件的链接。
我对 MSP430-gcc 的重新定位过程不了解。 我只是想编译器和链接器会智能地将文本和数据拆分为较低和较高的 ROM。 但是、由于我遇到的情况以及"-mcode/data-region"选项的存在、我认为 MSP430开发人员应该知道哪些类型的数据应该放置在较低的位置、哪些类型的数据应该放置在较低的位置、哪些类型的数据不应该放置在较低的位置、或者至少不应该放置在其他位置。 是否有任何技术文档? SLAU646非常粗略、需要深入研究。
谢谢你。
Jongsoo
[引用用户="Jongsoo Jeong"]
我在我的应用程序代码、库代码以及链接上使用了'-mlarg'标志。
[/报价]
好的、感谢您对此进行澄清。
在这种情况下,当在"digitalWriteInternal()函数中操作"pinInfo"时,编译器可能会生成 MSP430指令而不是 MSP430X 指令。 这将导致汇编器使用该16位重定位、该重定位不会到达上部存储器。
您是否能够提供"digitalWriteInternal"函数的源代码?
我想检查汇编文件中的重定位、看看是否有任何16位应该为20位的重定位。 然后、编译器生成的汇编代码可以提供有关正在发生的情况的线索。
[引述]
我对 MSP430-gcc 的重新定位过程不了解。 我只是想编译器和链接器会智能地将文本和数据拆分为较低和较高的 ROM。 但是、由于我遇到的情况以及"-mcode/data-region"选项的存在、我认为 MSP430开发人员应该知道哪些类型的数据应该放置在较低的位置、哪些类型的数据应该放置在较低的位置、哪些类型的数据不应该放置在较低的位置、或者至少不应该放置在其他位置。 是否有任何技术文档? SLAU646非常粗略、需要深入研究。
[/报价]
使用-mlarge 进行编译时、MSP430-elf-gcc 将在处理全局数据时始终生成 MSP430X 指令。 这意味着在所有情况下、汇编器也应生成扩展的20位重定位。 这使得链接器能够安全地将数据放置在上部/下部存储器的任何位置、而无需担心重新定位溢出。
下周左右、我们将发布 MSP430-gcc 的新版本、同时还更新了 slau646、以更好地描述 mcode/data-region=分离功能的工作方式。
此致、
感谢您的支持。
您是否能够提供"digitalWriteInternal"函数的源代码?
当然。 它非常简单。
define PxIN (p)(->baseRegister + 0x00) #define PxOUT (p)->baseRegister + 0x02 )#define PxDIR (p)->baseSEL + 0x04) #define PxREN (p)-> baseool 寄存器+ 0x06)#define PxIES (p) (0x1p)+ define PxIE (0x1p)+ 0x1p (base1p)+ define (r=(0x1p)+(qeCAP (0x1p)+ 0x1p (r+ 0x1p)+(qeCAP (0x1p)+ 0x1p (rn)+ define PxeCAP (0x1p)+ 0x1p (r=(r=(r+)+ 0x1p (qeCAP (0x1p)+)+ 0x1p (0x1p)+(0x1p (r+)+)+(qeCAP (rint (0x1p)+)+ { if (pin < 0){ 返回 false; } volatile uint8_t *SEL = PxSEL (&pinInfo[PIN]); volatile uint8_t * out = PxOUT (&pinInfo[PIN]); bitClear (*SEL、pinInfo[PIN].Pin); bitWrite (*OUT、pinInfo[PIN].Pin、 值); 返回 true; }
'pinInfo'是结构的常量数组、定义如下:
struct msp430_io{ uint8_t pin; uint8_t * baseRegister; INT8_t portCallbackIndex; INT8_t adcChannel; INT8_t analogWriteChannel; MSP430AnalotWrite_t analogWriteType; };
我想检查汇编文件中的重定位、看看是否有任何16位应该为20位的重定位。 然后、编译器生成的汇编代码可以提供有关正在发生的情况的线索。
好的。 这是该函数的汇编。 以下是编译器使用"-g"选项生成的列表文件。
411.LFE244: 412.SIZE引脚模式内部、引脚模式内部 413.section.ote.text.digitalWriteInternal、"ax"、@progbits 414平衡2 415.globaldigitalWriteInternal 416.typedigitalWriteInternal、@函数 417digitalWriteInternal: 418LFB245: 92:/Users/jsjeong/Work/nol.a-sdk-core/src/arch/msp430x5xx/digital-io.cpp **** if (引脚< 0){ 419.loc 1 92 0 420;函数421的开始 ; framesize_regs: 24422 ; framesize_nizels: 4 423; framesize_outgoing: 0 424.;帧大小: 28 425 ; elim ap -> fp 28 426; elim fp -> sp 4 427;已保存寄存器: R4 R6 R7 R8 R9 R10 428LVL29: 429;启动 prologueue 430 0000 4A14PUSHM.A#5、R10 431.LCFI4: 432 0002 0414PUSHM.A#1、R4 433LCFI5: 434 0004 B100 0400Suba#4、R1 435LCFI6: 436;序言结束 437 0008 4018 8C11SXTXR12 438 000c 094DMOV.WR13、R9 93:/Users/jsjeong/Work/nol.a-sdk-core/src/arch/msp430x5xx/digital-io.cpp **** 返回 false; 439.loc 1 93 0 440 000e 4C93 0038CMP.B#0、R12{JL.L19 97:/Users/jsjeong/Work/nol.a-sdk-core/src/arch/msp430x5xx/digital-io.cpp **** volatile uint8_t * out = PxOUT (&pinInfo[引脚]); 441.loc 1 97 0 442 0012 0A4CMOV.WR12、R10 443 0014 8400 0000MOVA#pinInfo、R4 444 0018 074CMOV.WR12、R7 445 001A 470E 470DRLAM.A #4、R7{RRAM.A #4、R7 446 001e CC07MOVAR7、R12 447LVL30: 448 0020 EC07ADDAR7、R12 449 0022 C60CMOVAR12、R6 450 0024 E607ADDAR7、R6 451 0026 0746 0018MOV.WR6、R7{MOVX.AR6、R8{RPT#16{RRAX.AR8;在 R6中将指针符号扩展到 R7:R8 451 4846 0F18 451 4811 452 0030 0757 0868RLA.WR7{RLC.WR8}RLA.WR7{RLC.WR8 452 0757 0868 453 0038 8147 0000MOV.WR7、@R1 454 003c 8148 0200MOV.WR8、2 (R1) 455 0040 0801MOVA@R1、R8 456 0042 E804ADDAR4、R8 457 0044 3808 0200MOVA2 (R8)、R8 458.LVL31: 100:/Users/jsjeong/Work/nol.a-sdk-core/src/arch/msp430x5xx/digital-io.cpp **** bitWrite (* out、pinInfo[pin].pin、value); 459.loc 1 100 0 460 0048 5748 0A00MOV.B10 (R8)、R7 461 004C 0018 6451ADDX.A@R1、R4 462 0050 6E44MOV.B@R4、R14 463 0052 5C43MOV.B#1、R12 464 0054 4D43MOV.B#0、R13 465LVL32: 466 0056 0F43MOV.W#0、R15 467 0058 B013 0000Calla#_mspabi_slll 468LVL33: 469 005C 47CCBIC.BR12、R7 470 005e C847 0A00MOV.BR7、10 (R8) 101:/Users/jsjeong/Work/nol.a-sdk-core/src/arch/msp430x5xx/digital-io.cpp ****返回 true; 471.loc 1 101 0 472 0062 0993 0020CMP.W#0、R9{JNE.l20 101:/Users/jsjeong/Work/nol.a-sdk-core/src/arch/msp430x5xx/digital-io.cpp ****返回 true; 473.loc 1 101 0 IT_STMT 0鉴频器2 474 0066 5948 0200MOV.B2 (R8)、R9 475LVL34: 476 006a 4A0E 4A0DRLAM.A #4、R10{RRAM.A #4、R10 477LVL35: 478 006E CC0AMOVAR10、R12 479 0070 EC0AADDAR10、R12 480 0072 EA0CADDAR12、R10 481 0074 0018 4B4AMOVX.AR10、R11{MOV.WR10、R10{RPT#16{RRAX.AR11;在 R10中将指针符号扩展到 R10:R11 481 0A4A 0F18 481 4B11 482 007e 0E4AMOV.WR10、R14 483 0080 0F4BMOV.WR11、R15 484 0082 0E5E 0F6FRLA.WR14{RLC.WR15{RLA.WR14{RLC.WR15 484 0E5E 0F6F 485 008A 814E 0000MOV.WR14、@R1 486 008E 814F 0200MOV.WR15、2 (R1) 487 0092 0F01MOVA@R1、R15 488 0094 4018 5E4FMOVX.BpinInfo (R15)、R14 488 0000 489 009A 5C43MOV.B#1、R12 490 009C 4D43MOV.B#0、R13 491 009e 0F43MOV.W#0、R15 492 00A0 B013 0000CALLA#_mspabi_slll 493LVL36: 494 00a4 49CCBIC.BR12、R9 495 00a6 C849 0200MOV.BR9、2 (R8) 102:/Users/jsjeong/Work/nol.a-sdk-core/src/arch/msp430x5xx/digital-io.cpp **** 496. .loc 1 102 0 IT_STMT 1鉴别器2 497 00aa 5C43MOV.B#1、R12 498LVL37: 499.l17: 103:/Users/jsjeong/Work/nol.a-sdk-core/src/arch/msp430x5xx/digital-io.cpp **** 500.loc 1 103 0 501;结束开始 502 00ac A100 0400Adda#4, R1 503 00b0 0416POPM.A#1、R4 504 00b2 4616POPM.A#5、R10 505 00b4 1001Reta 506LVL38: 507.l20: 101:/Users/jsjeong/Work/nol.a-sdk-core/src/arch/msp430x5xx/digital-io.cpp ****返回 true; 508.loc 1 101 0鉴频器1 509 00b6 5948 0200MOV.B2 (R8)、R9 510LVL39: 511 00ba 0A46 0018MOV.WR6、R10{MOVX.AR6、R11{RPT#16{RRAX.AR11;在 R6中将指针符号扩展到 R10:R11 511 4B46 0F18 511. 4B11 512 00c4 0D01MOVA@R1、R13 513 00c6 4018 5E4DMOVX.BpinInfo (R13)、R14 513 0000 514 00cc 5C43MOV.B#1、R12 515 00ce 4D43MOV.B#0、R13 516 00d0 0F43MOV.W#0、R15 517 00d2 B013 0000CALLA#_mspabi_slll 518LVL40: 519 00d6 4CD9BIS.BR9、R12 520 00d8 C84C 0200MOV.BR12、2 (R8) 102:/Users/jsjeong/Work/nol.a-sdk-core/src/arch/msp430x5xx/digital-io.cpp ****} 521.loc 1 102 0鉴别器1 522 00dc 5C43MOV.B#1、R12 523 00de 8000 0000BRA#.L17 524LVL41: 525.l19: 94:/Users/jsjeong/Work/nol.a-sdk-core/src/arch/msp430x5xx/digital-io.cpp ****} 526.loc 1 94 0 527 00e2 4C43MOV.B#0、R12 528 00e4 8000 0000BRA#.L17
我希望这些有助于澄清问题所在。
谢谢你。
Jongsoo
您好!
感谢您提供更多信息。 不幸的是、这还不足以让我重现问题。
它看起来像 bitClear ()和 bitWrite ()内联到 digitalWriteInternal()中,因此在代码中编译时的函数比我能够复制的函数复杂得多。
因此、为了能够准确再现"digita-io.o"、我还需要以下内容:
- bitClear 和 bitWrite 的来源
-"MSP430AnalotWrite_t"的 typedef
- MSP430-elf-gcc 的完整命令行调用、用于构建"digita-io.o"
我还会根据您到目前为止发布的内容提出一些其他问题。
在原始帖子中、错误消息列出了 digitalWriteInternal 函数中偏移量0x9E 和0xC8处 pinInfo 的溢出重定位。 我注意到、在对您发布的函数进行反汇编时、pinInfo 重定位的偏移略有不同-偏移量为0x98和0xCA。
您能否发布有关您为此汇编代码获取的重定位溢出的确切错误消息。
在 digitalWriteInternal+0x94/0xC6处进行反汇编时、"MOVX"已用于处理 pinInfo、汇编器应将该 pinInfo 使用20位重定位类型。 当我汇编"MOVX.B pinInfo (R15)、R14"时、R_MSP430X_ABS20_EXT_SRC 重定位用于重定位 pinInfo。 同时、您会得到 R_MSP430X_ABS16重定位。
查看包含溢出重定位的目标文件中的 ELF 数据也很有用。
您还能布置 "msp430-elf-readelf -AW digite-io.o"或"msp430-elf-readelf -AW libcos.a"的输出。
希望一旦我们能够诊断您在-O1看到的重定位溢出、您就会更容易理解为什么您可能会在-O2获得停止/看门狗复位代码。
谢谢、此致、
您好!
bitClear 和 bitWrite 的源
它们的宏定义如下
#define bitClear (v、n) ((v)&=~位(n) )#define bitWrite (v、n、b)(((b)? bitSet (v、n):bitClear (v、n))
"MSP430AnalotWrite_t"的 typedef
typedef 枚举{ MSP430_AW_NA、 MSP430_AW_PWM、 MSP430_AW_DAC 、}MSP430AnalotWrite_t;
MSP430-elf-gcc 的完整命令行调用、用于构建"digita-io.o"
msp430-elf-g++-std=GNU++14 -fno-exceptions -fno-rti -fno-threadsafe-statics -c -mmcu=msp430f5419a -mhwmmmmmmmmmmmmmmmmmmmult=f5series -mlarge -mcode-region=mdata-region=-o1 -fdata-sections -flata-sections -mwa-s=-flu_-l54d_sections -mcpp-m.dl430wa_s=-m_s=ning_d.dl_sections - -i{...} digital-io.cpp -o digita-io.o
在上面的命令中、我将所有-D 和-i 标志缩写为'-D{...}' 和'-i{...}'。
您能否发布有关您为此汇编代码获取的重定位溢出的确切错误消息。
很抱歉让您感到困惑。 由于 我和我的同事正在修复源代码、因此会出现一些不匹配的结果。 这是确切的输出错误消息。
/home/jsjeong/work/nol.a-sdk-core/nola-sdk/make/../plm100/libcoxos.a (digital-io.o):在函数中`digitalWriteInternal': digital-io.cpp:(.ise.text.digitalWriteInternal+0x9e):将被截断的重定位为适合:R_MSP430X_ABS16与/home/jsjeong/work/nol.a-sdk-core/nola-sdk/make/../plm100/Platform.o digitature.io.Info.inInfo 中定义的 symbol ` `pinInfo.inInfo.pinInfo 段进行比较:(.truncion_mepit_rtinx.8 /home/jsjeong/work/nol.a-sdk-core/nola-sdk/make/../plm100/Platform.o)
您还能布置 "msp430-elf-readelf -AW digite-io.o"或"msp430-elf-readelf -AW libcos.a"的输出。
以下是 "msp430-elf-readelf -AW digite-io.o"的输出:
ELF 接头: 魔术:7F 45 4c 46 01 01 ff 00 00 00 00 00 00 00 00 00 类: ELF32 数据: 二进制补码、小端字节序 版本: 1 (当前) OS/ABI: 独立应用 程序 ABI 版本: 0 类型: Rel (可重定位文件) 机器: 德州仪器 MSP430微控制 器版本: 0x1 入口点地址: 0x0 程序头开始: 0 (文件中的字节) 段头开始: 6412 (字节到文件) 标志: 0x2D:架构变体: 此标头的 MSP430X 大小: 52 (字节) 大小的程序头文件: 0 (字节) 程序头文件数量: 0 段头的大小: 40 (字节) 段标头数量: 25 段标头字符串表索引:22 段标头: [nr]名称 类型 地址 关尺寸 ES Flg Lk INF AL [0] null 00000000 000000 000000 00 00 0 0 0 0 [1].text 程序 00000000 000034 000000 00 00 00 Ax 0 1 [2] 程序 00000000 000034 000000 00 00 WA 0 1 [3].bss NOBITS 00000000 000034 000000 00 00 WA 0 1 [4].ox.text_ZL14setupInterrupthi PROGBITS 00000000 000034 000128 00 Ax 0 2 [2] [5].rela.text_ZL14setupInterrupthi RELA 00000000 001148 000090 0c I 23 4 4 [6].NOT.text.pinModeInternal PROGBITS 00000000 00015c 0002c2 00 Ax 0 2 [7].rela.ote.text.pinModeInternal RELA 00000000 0011d8 000150 0c I 23 6 4 [4][8].isole.text.digitalWriteInternal PROGBITS 00000000 00041e 0000e6 00 AX 0 2 [9].rela.text.digitalWriteInternal RELA 00000000 001328 000078 0c I 23 8 4 [10].ise.text.digitalToggleInternal PROGBITS 00000000 000504 0000a0 00 Ax 0 2 [11] .rela.text.digitalToggleInternal RELA 00000000 0013a0 00003c 0c I 23 10 4 [12].any.text.digitalReadInternal PROGBITS 00000000 0005a4 000060 00 Ax 0 2 [13] .rela.text.digitalReadInternal RELA 00000000 0013dc 000030 0c I 23 12 4 [14].NOT.text_Z23attachInterruptInternalaPFvEib PROGBITS 00000000 000604 000172 00 Ax 0 2 [15] .rela.text._Z23attachInterruptInternalaPFvEib RELA 00000000 00140c 0000fc 0c I 23 14 4 [16].NOT.text_Z23attachInterruptInternalaPFvPvES_IB PROGBITS 00000000 000776 000192 00 Ax 0 2 [17].rela.ane.text._Z23attachInterruptInternalaPFvPvES_IB RELA 00000000 001508 000114 0c I 23 16 4 [18].NOT.text_Z23attachInterruptInternalaPFvR19gpio_interrupt_infoEPvib PROGBITS 00000000 000908 0001ac 00 Ax 0 0 2 [19].rela.ote.text._Z23attachInterruptInternalpfvR19gpio_interrupt_infoEPvib RELA 00000000 00161c 00012c 0c I 23 18 4 [20].comment 程序 00000000 000ab4 00003b 01 MS 0 1 [21].MSP430.attributes MSP430_attributes 00000000 000aef 000017 00 0 0 1 [22].shstrtab STRTAB 00000000 001748 0001c3 00 0 0 1 [23].symtab SYMTAB 00000000 000b08 000420 10. 24 51 4 [24].strtab STRTAB 00000000 000f28 00021e 00 0 0 1 标志键: W (写入)、A (alloc)、X (执行)、M (合并)、S (字符串) I (信息)、L (链接顺序)、G (组)、T (TLS)、E (排除)、 X (未知) O (需要额外的操作系统处理) o (特定于操作系统)、p (特定于处理器) 此文件中没有段组。 此文件中没有程序头文件。 偏移量0x1148处的重定位段'.rela.ote.text_ZL14setupInterrupthi'包含12个条目: offset 信息类型 对称 值符号的名称+添加端 0000000a 0000350b R_MSP430X_ABS20_ADR_SR 00000000 pinInfo + 0 00000050 0000360c R_MSP430X_ABS20_ADR_DS 00000000 __mspabi_slli + 0 00000068 0000360c R_MSP430X_ABS20_DS_ADR_000000013_MSP430_sli_0_msp713_mspi_msp430x_mspi_mspx_msp76. 000000c4 .L5 + 0 0000007c 00000f13 R_MSP430X_10_PCREL 00000120 .L1 + 0 000000b0 00003508 R_MSP430X_ABS20_EXT_SR 00000000 pinInfo + 0 000000b6 0000360c R_MSP430X_ABS20_ADR_DS 00000000 __mspabi_slli + 0 000000c0 0000100b R_MSP430X_ABS20_ADR_00000008 _ABS20_CC_00000008 _INTR_MSP430_INTR_00000008_INDS_INTR_INTR_IND 0000800_INTR_INTR_INTR_00800_INTR_0008_INTR_INTR_INTR_IND 00800_INTR_0008_INTR_INTR_INTR_INTR_IND 0000_INTR_INTR_INTR_INTR_INTR_INTR_IND 0000_INTR_100_INTR_INTR_INTR_IND 00000008_INTR_INTR_ _mspabi_slli + 0 重定位段'.rela.text.pinModeInternal'(偏移量0x11d8)包含28个条目: 偏移量 信息类型 对称 值符号的名称+添加 端0000000e 00001113 R_MSP430X_10_PCREL 000002b2 .L13 + 0 00000012 0000350b R_MSP430X_ABS20_ADR_SR 00000000 pinInfo + 0 00000060 0000380c R_MSP430X_ABS20_ADR_DS 00000000 __mspabi_slll + 0 0000006c 00001213 R_MSP430X_10_PCREL 0000019c .l8 + 0 00000072 00001313 R_MSP430X_10_PCREL 0000011c .l15 + 0 00000076 00001413 R_MSP430X_10_PCREL 00000218 .L11 + 0 0000007c 00001513 R_MSP430X_10_PCREL 00000082 .L1^B1 + 0 0000007e 0000160b R_MSP430X_ABS20_ADR_SR 000002bc .L14 + 0 00000086 0000350b R_MSP430X_ABS20_ADR_SR 00000000信息+ 0 000000c4 0000380c R_MSP430X_ABS20_ADR_00000007_MSP430_100_100_MSP430_ADR_00000007_MSP430_100_100_100_100_MSP430DS_100_100_100_100_100_0_MSP430_sp_100_000_MSP430_100_100_100_100_0_MSP430_MSP430_MSP430_100_100_100_MSP430DS_100_100_100_100_100_100_100_100_sp_0_MSP430_100_100_100_100_100_100_0_100_100_100_100_100_0_100_100_100_100_100_100_100_100_100_100_0_ 000002bc .l14 + 0 00000124 0000350b R_MSP430X_ABS20_ADR_SR 00000000 pinInfo + 0 00000162 0000380c R_MSP430X_ABS20_ADR_DS 00000000 _mspabi_slll + 0 0000018c 0000380c R_MSP430X_ABS20_MSP430_ADR_000000020_MSP430DS_10000020_MSP430DS_100_100_100_100_100_100_00020_MSP430DS_100_100_100_100_100_0_sp_100_100_100_100_100_0_100_100_100_100_0_sp_sp_sp_100_100_100_0_sp_100_00020 _mspabi_slll + 0 00000214 0000170b R_MSP430X_ABS20_ADR_SR 000002b4 .L7 + 0 0000021c 0000350b R_MSP430X_ABS20_SR 00000000 pinInfo + 0 0000025a 0000380c R_MSP430X_ABS20_ADR_00000007_MSP430DS_000007_000007_MSP430DS_100_000007_100_000007_100_sp_0_MSP430_0020_ADR_000007_000007_MSP430DS_100_100_100_100_000004 + 0 偏移量0x1328处的重定位段'.rela.ise.text.digitalWriteInternal'包含10个条目: 偏移量 信息类型 对称 Value Symbol 的名称+ addend 00000010 00001813 R_MSP430X_10_PCREL 000000e0 .l19 + 0 00000014 0000350b R_MSP430X_ABS20_ADR_SR 00000000 pinInfo + 0 0000000000380c R_MSP430X_ABS20_ADR_DS 00000000 __mspabi_slll + 0 00000068 00001913 R_MSP430X_10_PCREL 000000bc .l20 + 0 0000009e 0000350f R_MSP430X_ABS16 00000000 pinInfo + 0 000000a6 0000380c R_MSP430X_ABS20_ADR_DS 00000000 __mspabi_slll + 0 000000c8 0000350f R_MSP430X_ABS16 00000000 pinInfo + 0 000000d0 0000380c R_MSP430X_ABS20_ADR_DS 00000000 __mspabi_slll + 0 000000dc 00001a0b R_MSP430X_ABS20_adration_SR digitalb2.L17 + 0 000000e2 00001a0b R_MSP430X_ABS20_ADR__related_SR 以 0开头包含偏移量0x00002'.LS_0_intrab.text 段。0_offset_offset_remed.trination_remed.r.r.r.rentries 0_trines1.001.001.001.002.r.r. 信息类型 对称 Value Symbol 的名称+ addend 00000010 00001b13 R_MSP430X_10_PCREL 000000l.L23 + 0 00000012 0000350b R_MSP430X_ABS20_ADR_SR 00000000 pinInfo + 0 00000060 0000380c R_MSP430X_ABS20_ADR_DS 00000000 __mspabi_slll + 0 00000082 0000Readc R_MSP430X_ABS20_ADR_D_DS_00000000 _ msp4r_delit_0_msp2c.h 段中的偏移量+ 0_msp4_msp_msp4r_mspb 0_msp_mr_msp_msp4r_msp_msp_msp_mspr_msp_mspr_msp4r_madr_msp_msp_mspr_mspb 信息类型 对称 值符号的名称+添加 端0000000c 00001d13 R_MSP430X_10_PCREL 000000ib .l26 + 0 0000000e 0000350b R_MSP430X_ABS20_ADR_SR 00000000 pinInfo + 0 0000004c 00003c0c R_MSP430X_ABS20_ADR_DS 00000000 __mspabi_srai + 0 0000005c 00001e0b R_MSP430X_ABS20_ADR_DS 0000.interrupt.h 条目 在0x514000_R-232_R-23.000_Rpru_R-23.a 段中包含偏移量、且偏移量为0、且地址为0_interrupt.inrupt.inc.h 信息类型 对称 Value Symbol 的名称+ addend 00000014 00001f13 R_MSP430X_10_PCREL 0000015a .l30 + 0 00000044 0000350b R_MSP430X_ABS20_ADR_SR 00000000 pinInfo + 0 00000052 00002013 R_MSP430X_10_PCREL 00000162 .L31 + 0 0000005e 00002113 R_MSP430X_10_PCREL 0000016a .L32 + 0 00000076 00003e0c R_MSP430X_ABS20_ADR_DS 00000000 __mspabi_slLL_3 + 0 00000080 00003f09 R_MSP430X_ABS20_EXT_DS 00000000回调+ 3 00000092 00003e0c R_MSP430X_ABS20_MSP430_EXT_DS 00000008回 调+3 00000X .L33 + 0 000000ac 0000060c R_MSP430X_ABS20_ADR_DS 00000000 _ZL14setupInterrupthi + 0 000000de 0000350b R_MSP430X_ABS20_SR 00000000信息+ 0 00000100 00003e0c R_MSP430X_ABS20_ADR_00000009_0_MSP430_3000000_0_MSP430DS_100_100_100_0009_ADR_0009_0_100_100_0009_0_100_0_100_100_0_0_100_100_0_100_ABS000_0_0_0_100_100_0_000_0_100_0_100_ABS0000_000_0_0_000_ADR_000_100_000_0_0_000_0_0_100_100_0_ADR_000_0_000_100_100_0_000_000_0_0_100_000_0_0_100_100_0_0_ _mspabi_slLL_3 + 0 00000144 00003f09 R_MSP430X_ABS20_EXT_DS 00000000端口回调+ 4 00000156 0000230b R_MSP430X_ABS20_rupt_SR 240000000000aa .L29 + 0 0000015e 0000240b R_MSP430X_ABS20_ADR 00020_ABS20_RESR 内部 条目+ MSP430S2400020_100_R0_INESR 0_INESR 0_INESR 0_INESR 0_INS2400020_INESR 0_INESR 0_INESR 0_10020_INESR 0_INESR 0_INESR 0_INESR 0_INESR 0_INESR 0_INESR 0_INESR 0_INESR INESR 0_INESR INESR 0_INESR INESR INESR INESR IN 信息类型 对称 Value Symbol 的名称+ addend 00000014 00002513 R_MSP430X_10_PCREL 0000017a .L37 + 0 00000044 0000350b R_MSP430X_ABS20_ADR_SR 00000000 pinInfo + 0 00000052 00002613 R_MSP430X_10_PCREL 00000182 .l38 + 0 0000005e 00002713 R_MSP430X_10_PCREL 0000018a .L39 + 0 00000076 00003e0c R_MSP430X_ABS20_ADR_DS 00000000 __mspabi_slLL_3 + 0 00000080 00003f09 R_MSP430X_ABS20_EXT_DS 00000000回调+ 3 00000092 00003e0c R_MSP430X_ABS20_MSP430_EXT_DS 00000008回 调+ MSP430_300009_0_0_MSP430_DP300009_0_0_DP430_TR_0000_0_0_DP300009_0_0_DP430X_DP_0000_0_0_TR_DP300009_0_0000_0_0_0_DP430_TR_0000_0_DPW_DP 00000174 .L40 + 0 000000ac 0000060c R_MSP430X_ABS20_ADR_DS 00000000 _ZL14setupInterrupthi + 0 000000de 0000350b R_MSP430X_ABS20_SR 00000000信息+ 0 00000100 00003e0c R_MSP430X_ABS20_ADR_00000000_0_MSP430_100_0000_MSP430_ADR_0000_100_100_0009_0_100_0_MSP430_0009_ADR_100_100_0_100_0_100_0_100_0_000_0_100_100_0_000_0_100_0_000_0_100_0_ABS000_0_0_0_0_ABS000_0_0_100_0_000_0_0_000_0_000_000_ADR_100_0_0_0_100_000_0_100_000_0_0_0_000_000_ADR_100_100_0_0_000 _mspabi_slLL_3 + 0 00000148 00003f09 R_MSP430X_ABS20_EXT_DS 00000000回调+ 4 0000015a 00003e0c R_MSP430X_ABS20_ADR_DS 00000000 _ MSP430X_ABS20_ABS0003 + 0 00000164 ADR_0000020_ABS00020_0_MSP430_ABS00020 + MSP430S00020 + 0 重定位段'.rela.ote.text._Z23attachInterruptInternalaPFvR19gpio_interrupt_infoEPvib'、偏移量0x161c 包含25个条目: 偏移量 信息类型 对称 Value Symbol 的名称+ addend 00000014 00002b13 R_MSP430X_10_PCREL 00000194 .l44 + 0 00000044 0000350b R_MSP430X_ABS20_ADR_SR 00000000 pinInfo + 0 00000052 00002c13 R_MSP430X_10_PCREL 0000019c .l45 + 0 0000005e 00002d13 R_MSP430X_10_PCREL 000001a4 .L46 + 0 00000076 00003e0c R_MSP430X_ABS20_ADR_DS 00000000 __mspabi_slLL_3 + 0 00000080 00003f09 R_MSP430X_ABS20_EXT_DS 00000000 Callback + 3 00000092 00003e0c R_MSP430X_ABS20_REDP_00009_0_DP430_0000_0_0_MSP430_SC_300009_0_0_0_MSP430_RE_SC_TR_300000009_DP_300000_0_0_300009_0_0_0_MSP430_TR_000_000_000_000_DP_000_300009_DP_000_000_000_000_0008 0000018e .L47 + 0 000000ac 0000060c R_MSP430X_ABS20_ADR_DS 00000000 _ZL14setupInterrupthi + 0 000000da 0000350b R_MSP430X_ABS20_SR 00000000信息+ 0 000000fc 00003e0c R_MSP430X_ABS20_ADR_00000000_0_MSP430_0000_0_MSP430_SC_100_0_0000_ABS0000_0_0_100_0_0_0_ABS000_0_0_0_ABS0000_0_0_0_0_0_ABS000_0_0_0_000_0_ABS000_0_0_0_0_ABS000_0_0_0_0_ADR_0000_0_0_000_ADR_0000_0_100_0_0_0_0_0_000_ABS000TR_AB_0_0_0_0_000_0_ADR_0000_100_0_0_AB _mspabi_slLL_3 + 0 00000144 00003f09 R_MSP430X_ABS20_EXT_DS 00000000回调+ 4 00000158 00003e0c R_MSP430X_ABS20_DS 00000000 _ MSP430X_ABS20_DS_ABS0003 + 0 00000162 00003f0_ABS20_ABS00020 + MSP430ADR_000020_ABS00020_ABS00020 + 0 000001a0 0000300b R_MSP430X_ABS20_ADR_SR 00000186 .L41 + 0 000001a8 0000300b R_MSP430X_ABS20_ADR_SR 00000186 .L41 + 0 机器类型德州仪器 MSP430微控制器的非线段解码目前不受支持。 符号表".symtab"包含66个条目: num: value size Type Bind Vis NDX 名称 0:00000000 0 NOTYPE 本地默认值 UND 1:00000000 0文件本地默认 abs digital-io.cpp 2:00000000 0段本地默认值1 3:00000000 0段本地默认值2. 4:00000000 0段本地默认值3. 5:00000000 0段本地默认值4. 6:00000000 296 FUNC 局部默认值4_ZL14setupInterrupthi 7:00000000 0段本地默认值6. 8:00000000 0段本地默认值8. 9:00000000 0段本地默认值10. 10:00000000 0段本地默认值12. 11:00000000 0段本地默认值14. 12:00000000 0段本地默认值16. 13:00000000 0段本地默认值为18 14:000000c4 0 NOTYPE 本地默认值4.L5 15:00000120 0 NOTYPE 本地默认值4 .L1 16:000000dc 0 NOTYPE 本地默认值4 .L3 17:000002b2 0 NOTYPE 本地默认值6 .l13 18:0000019c 0 NOTYPE 本地默认值6 .l8 19:0000011c 0 NOTYPE 本地默认值6 .l15 20:00000218 0 NOTYPE 本地默认值6 .l11 21:00000082 0 NOTYPE 本地默认值6.L1^B1 22:000002bc. 0 NOTYPE 本地默认值6 .l14 23:000002b4 0 NOTYPE 本地默认值6 .l7 24:000000e0 0 NOTYPE 本地默认值8 .l19 25:000000bc. 0 NOTYPE 本地默认值8 .l20 26:000000b2 0 NOTYPE 本地默认值8 .l17 27:0000009a 0 NOTYPE 本地默认值10 .l23 28:0000008e 0 NOTYPE 本地默认值10 .l22 29:0000005a 0 NOTYPE 本地默认值12.L26 30:00000052 0 NOTYPE 本地默认值12 .l24 31:0000015a 0 NOTYPE 本地默认值14 .l30 32:00000162 0 NOTYPE 本地默认值14 .l31 33:0000016a 0 NOTYPE 本地默认值14 .l32 34:00000154 0 NOTYPE 本地默认值14 .l33 35:000000aa 0 NOTYPE 本地默认值14 .l29 36:0000014c 0 NOTYPE 本地默认值14 .l27 37:0000017a 0 NOTYPE 本地默认值16 .l37 38:00000182 0 NOTYPE 本地默认值16 .l38 39:0000018a 0 NOTYPE 本地默认值16 .l39 40:00000174 0 NOTYPE 本地默认值16 .l40 41:000000aa 0 NOTYPE 本地默认值16 .l36 42:0000016c 0 NOTYPE 本地默认值16 .l34 43:00000194 0 NOTYPE 本地默认值18 .l44 44:0000019c 0 NOTYPE 本地默认值18 .l45 45:000001a4 0 NOTYPE 本地默认值18 .l46 46:0000018e 0 NOTYPE 本地默认值18 .l47 47:000000aa 0 NOTYPE 本地默认值18 .l43 48:00000186 0 NOTYPE 本地默认值18 .l41 49:00000000 0段本地默认值20 50:00000000 0段本地默认值21. 51:00000000 0 NOTYPE 全局默认值 und __crt0_move_highdata 52:00000000 0 NOTYPE 全局默认值 und __crt0_init_highbss 53:00000000 0 NOTYPE 全局默认值和 pinInfo 54:00000000 0 NOTYPE 全局默认值 und __mspabi_slli 55:00000000 706 FUNC 全局默认值6 pinModeInternal 56:00000000 0 NOTYPE 全局默认值 und __mspabi_slll 57:00000000 230 FUNC 全局默认8 digitalWriteInternal 58:00000000 160 FUNC 全局默认值10 digitalToggleInternal 59:00000000 96 FUNC 全局默认值12 digitalReadInternal 60:00000000 0 NOTYPE 全局默认值 und __mspabi_srai 61:00000000 370 FUNC 全局默认值14 _Z23attachInterruptInternalaPFvEib 62:00000000 0 NOTYPE 全局默认值 und __mspabi_slLL_3. 63:00000000 0 NOTYPE 全局默认值和端口回调 64:00000000 402 FUNC 全局默认值16 _Z23attachInterruptInternalaPFvPvES_IB 65:00000000 428 FUNC 全局默认值18_Z23attachInterruptInternalaPFvR19gpio_interrupt_infoEPvib 在此文件中找不到版本信息。 属性部分:mspabi 文件属性 Tag_Isa:MSP430X Tag_Code_Model:Large Tag_Data_Model:Large
这里是"msp430-elf-readelf -AW libcoxos.a"输出的下载链接。
https://www.dropbox.com/s/tzcypi4y58zumkf/libcoxos.a-readelf.txt?dl=0
我希望这些对您进行诊断有所帮助。
谢谢你。
Jongsoo
您好!
感谢您提供更多信息。
显然、编译器/汇编器存在问题、因为我可以在 所有其他20位重定位中看到 pinInfo 的 R_MSP430X_ABS16重定位、这看起来是错误的。
但是、即使您提供了进一步的源代码和 GCC 调用、我也无法复制它。 我不得不推导"bit(n)和"bitSet(v, n)"的定义,但这些定义是直接的,我不认为这些是差异的原因。
请查看以下调用和源代码、看看您是否可以填补空白、以便重现问题。
/home/jozef/msp430-gcc-7.3.2.154_linux64/bin/msp430-elf-g +-std=GNU+14 -fno-exceptions -fno-rti -fno-threadsafe-statics -fdata-sections -ffunion-SECTIONS -Wall -wa、-ahlms=digit-io.cp.lst -D_MSP430F5419A_-c -mmio=msp430f5419cu=mcu -region -mcu -mf=mcu -mcu -w4=mcu -mf5419=mcu -region -mf=mcu -mcu -mcu -mcu -mcu -mcu -m digital-io.cpp
#include #include #define PxIN (p)->baseRegister + 0x00) #define PxOUT (p)->baseRegister + 0x02 )#define PxDIR (p)->baseSEL + 0x04) #define PxREN (p)->baseRegister + 0x06)#define PxIES (p)( px08 )+#define Pxe=(px (s)+(s)+ define Px1p (s (s)+(s)+(q1p)+(s (s)+ define Px1p (s (s)+(s)+ 0xpx (s (s)+)(s (s (s)+)+ define Px1p (s (s (s)+)+ 0xpx (s (s (s)+)+)(s (s (s (s)+)+)(#define Px1p (s (s ((1 << n) )#define bitSet (v、n) ((v)|=位(n) )#define bitClear (v、n) ((v)&=~位(n) )#define bitWrite (v、n、b)(((b)? bitClar (v、n):bitClear (v、n) typedef 枚举{ MSP430_AW_NA、 MSP430_AW_PWM、 MSP430_AW_DAC 、}MSP430AnalotWrite_t; struct MSP430_IO{ uint8_t 引脚; uint8_t base*寄存器; INT8_t portCallbackIndex; INT8_t 通道 INT8_t_INT8;t_INT8通道 Writeot MSP430AnalotWrite_t analogWriteType; }; volatile extern const struct MSP430_IO pinInfo[10]; bool digitalWriteInternal (INT8_t pin、int value){ if (pin < 0){ 返回 false; } volatile uint8_t *SEL = PxSEL (&pinInfo[PIN]); volatile uint8_t * out = PxOUT (&pinInfo[PIN]); bitClear (*SEL、pinInfo[PIN].Pin); bitWrite (*OUT、pinInfo[PIN].Pin、 值); 返回 true; }
/home/jozef/msp430-gcc-7.3.2.154_linux64/bin/msp430-elf-readelf -RW digital-io.o 重定位段'.rela.isoe.text._Z20digitalWriteInternalai'(偏移量0x318)包含10个条目: 偏移量 信息类型 对称 值符号的名称+添加 端0000000e 00000613 R_MSP430X_10_PCREL 00000114 .L4 + 0 00000012 00000e0b R_MSP430X_ABS20_ADR_SR 00000000 pinInfo + 0 00000078 00000f0c R_MSP430X_ABS20_ADR_DS 00000000 __mspabi_slli + 0 00000084 00000713 R_MSP430X_10_PCREL 000000d4 .L5 + 0 000000b4 00000e08 R_MSP430X_ABS20_EXT_SR 00000000 pinInfo + 0 //要重现问题,必须在此处 输入 R_MSP430X_ABS16 000000c0 00000f0c R_MSP430X_ABS20_DS 00000000 __mspabi_000008_mspx_msp430_r_0_mspx_msp0_msp0_msp430_mspx_r_mspx_msp0_mspx_msp0_msp430_mspx_mspx_r_mspx_msp0_mspx_msp0_msp0_msp430_mspx_mspx_r_mspx_mspx_msp0_msp0_ + 0 00000110 0000080b R_MSP430X_ABS20_ADR_SR 000000cc .L2 + 0 00000116 0000080b R_MSP430X_ABS20_ADR_SR 000000cc .L2 + 0
因此、正如上述注释所述、我需要能够重新生成 digit-io.o 中 pinInfo 的 R_MSP430X_ABS16重定位、以跟踪问题的原因。
再次感谢您提供详细信息、
您好!
感谢您的支持。
根据您的代码、我将一些点固定为等式、如下所示:
#include #include #define PxIN (p)->baseRegister + 0x00) #define PxOUT (p)->baseRegister + 0x02 )#define PxDIR (p)->baseSEL + 0x04) #define PxREN (p)->baseRegister + 0x06)#define PxIES (p)( px08 )+#define Pxe=(px (s)+(s)+ define Px1p (s (s)+(s)+(q1p)+(s (s)+ define Px1p (s (s)+(s)+ 0xpx (s (s)+)(s (s (s)+)+ define Px1p (s (s (s)+)+ 0xpx (s (s (s)+)+)(s (s (s (s)+)+)(#define Px1p (s (s (1ul <<(n)) //从您的:(1 << n) #define bitSet (v、n) ((v)|=位(n) )#define bitClear (v、n) ((v)&=~位(n) )#define bitWrite (v、n、b)(((b)? bitClar (v、n):bitClear (v、n) typedef 枚举{ MSP430_AW_NA、 MSP430_AW_PWM、 MSP430_AW_DAC 、}MSP430AnalotWrite_t; struct MSP430_IO{ uint8_t 引脚; uint8_t base*寄存器; INT8_t portCallbackIndex; INT8_t 通道 INT8_t_INT8;t_INT8通道 Writeot MSP430AnalotWrite_t analogWriteType; }; extern const 结构 MSP430_IO pinInfo[];//从您的中删除'volatil'和数组长度。 bool digitalWriteInternal (INT8_t pin、int 值){ if (pin < 0){ 返回 false; } volatile uint8_t *SEL = PxSEL (&pinInfo[PIN]); volatile uint8_t * out = PxOUT (&pinInfo[PIN]); bitClear (*SEL、pinInfo[PIN].Pin); bitWrite (*OUT、pinInfo[PIN].Pin、 值); 返回 true; }
$ MSP430-elf-readelf -RW digital-io.o 重定位段'.rela.ise.text._Z20digitalWriteInternalai'(偏移量为0x2e4)包含10个条目: 偏移量 信息类型 对称 Value Symbol 的名称+ addend 00000010 00000613 R_MSP430X_10_PCREL 000000e0 .L4 + 0 00000014 00000e0b R_MSP430X_ABS20_ADR_SR 00000000 pinInfo + 0 0000005c 00000f0c R_MSP430X_ABS20_ADR_DS 00000000 __mspabi_slll + 0 00000068 00000713 R_MSP430X_10_PCREL 000000bc .L5 + 0 0000009e 00000e0f R_MSP430X_ABS16 00000000 pinInfo + 0 000000a6 00000f0c R_MSP430X_ABS20_ADR_DS 00000000 _mspabi_slll + 0 000000c8 00000e0f R_MSP430X_ABS16 00000000 pinInfo + 0 000000d0 00000f0c R_MSP430X_ABS20_ADR_DS 00000000 __mspabi_slll + 0 000000dc 0000080b R_MSP430X_ABS20_SR 000000b2 .L2 + 0 000000e2 0000080b R_MSP430X_ABS20_ADR_000000b2 + 0 000000b2
我所说的几点对我来说是很小的。 太奇怪了…… 正如我之前建议的那样、获得有关重定位类型的详细信息以及编译器有关这些类型的策略将会非常好。
此外、我发现 MSP-gcc-7.3.1.24会生成如下所示的重定位条目:
$ MSP430-gcc-7.3.1.24/bin/MSP430-elf-readelf -RW digital-io.o 重定位段'.rela.ise.text._Z20digitalWriteInternalai'(偏移量为0x2e8)包含10个条目: 偏移量 信息类型 对称 Value Symbol 的名称+ addend 00000010 00000613 R_MSP430X_10_PCREL 000000e2 .L4 + 0 00000014 00000e0b R_MSP430X_ABS20_ADR_SR 00000000 pinInfo + 0 00000058 00000f0c R_MSP430X_ABS20_ADR_DS 00000000 __mspabi_slll + 0 00000064 00000713 R_MSP430X_10_PCREL 000000b6 .L5 + 0 00000094 00000e08 R_MSP430X_ABS20_EXT_SR 00000000 pinInfo + 0 000000a0 00000f0c R_MSP430X_ABS20_ADR_DS 00000000 _mspabi_slll + 0 000000c6 00000e08 R_MSP430X_ABS20_ADR_0000000_0_AMB_0_MSP430_AMB_0_0_AMB_AMR 0000_AMB_0_AMB_AMR 0000_0_AMB_0_AMB_AMR 0000000_0_AMB_0_AMR 0000_AMB_AMB_0_AMR 0000_AMR 0000_0_AMB_AMR 0000_AMB_0_AMB_AMR 00000002 + MSP430_AMR 00000002 IN_AMB_AMB_AMR 0000_0002
谢谢你。
Jongsoo
感谢您提供了固定源代码、我现在重现了问题。
我很高兴地报告、这在新发布的 MSP430-GCC 8.2.0.52中已修复。 此版本的工具链现在作为 Code Composer Studio 中的更新提供、 应在几周内直接从 TI.com 上的 MSP430-GCC 网站下载。
[引述]
我所说的几点对我来说是很小的。 [/报价]
关键部分是位(n)定义中从"1 << n"更改为"1ul << n"。 前者移动16位值、后者移动32位值。 将一个8位值扩展为一个32位值的代码生成为0不使用 MSP430X 指令:
MOV.B pinInfo (R8)、R14{和#0xff、R14{CLR R15 //错误
MOVX.B pinInfo (R8)、R14{和#0xff、R14{CLR R15 //正确
由于汇编器看到 MSP430结构"MOV"、因此为 pinInfo 生成了一个16位重定位。 使用 MOVX、它会生成20位重定位。
[引述]太奇怪了... 正如我之前所建议的、获得有关重定位类型和编译器策略的详细信息将会非常好。
您可以在以下 TI MSPABI 文档中阅读有关重定位类型的信息: MSP430嵌入式应用二进制接口
此致、
您好!
我很高兴这个错误已经修复、修补的 GCC 将很快发布。
感谢您的关注和支持。
Jongsoo