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.

[参考译文] MSP430-GCC-opensource:最新6.1.x (GCC 7.3.2.154)在 MSP430F5438A 上不起作用。

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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/814202/msp430-gcc-opensource-the-latest-6-1-1-x-gcc-7-3-2-154-not-working-on-msp430f5438a

器件型号:MSP430-GCC-opensource
主题中讨论的其他器件:MSP430F5419A

您好!

我使用了 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'时、错误会得到解决。

    我附加了映射文件的链接。

    而不使用 data-region=

    使用_data-region=任意一个

    我对 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