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:GCC 9.2.0.50 msp430fr5994.ld .lowtext bugfix

Guru**** 657500 points
Other Parts Discussed in Thread: MSP430FR5994, MSP430FR2476, MSP430FR2676, MSP430FR50431, MSP430FR5043, MSP430FR5962, MSP430FR5964, MSP430FR5992, MSP430FR59941, MSP430FR6005, MSP430FR6007, MSP430FR6035, MSP430FR60371, MSP430FR6037, MSP430FR60431, MSP430FR6043, MSP430FR6045, MSP430FR60471, MSP430FR6047
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/939422/msp430-gcc-opensource-gcc-9-2-0-50-msp430fr5994-ld-lowtext-bugfix

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

您好!

这个使用 MSP430 GCC 9.2.0.50 (在 CCS Cloud 和我们的计算机上)为 MSP430FR5994编译的最小示例
无法使 LED 闪烁。

#include 

int main (void)
{
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
P1DIR |= BIT0;
PM5CTL0 &=~LOCKLPM5;

TA4CTL = MC_STOP | TACLR;
TA4CCR0 = 31250;//每秒4次
TA4CCTL0 = CCIE;// TA4CCR0中断被启用
TA4CTL = tassel_SMCLK | ID_8 | MC_UP;// SMCLK/8、向上计数模式
_enable_interrupt ();
执行{}while (1);
返回0;
}

void __interrupt_vec (TIMER4_A0_vector)
Timer4_A0_ISR (void){
P1OUT ^= BIT0;
} 

与 include/目录中的其他链接器脚本进行比较后、默认链接器脚本 msp430fr5994.ld 被认为是原因、
因为中断例程被放置在".lowtext"段中、然后进入 RAM 中的某个位置、但预计位于 FRAM 中。

建议的修复似乎会将".lowtext"放置在正确的存储器部分中。

--- msp430-gcc-9.2.0.50/include/msp430fr5994.ld
++ fixed_msp430fr5994.ld
@@-415,29+415,29 @@
.low-text:
{
。 =对齐(2);
*(.lower.text.*.lower.text)
}> FRAM

.text:
{
提供(_start =.);

。 =对齐(2);
保留(*(sort (.crt_*)))

。 = align (2);
-*(.low.text。*.low.text)
+ Keep (*(.lowtext))

。 =对齐(2);
*(.text .stub .text。*.GNU.linkone.t*.text:*)
/*请参阅.rodata 部分中有关我们没有此行的原因的注释:

*(.ise.text.*.oe.text)

*

保留(*(.text.*个性*))
/*.GNU.warning 段由 ELF32.em 专门处理。 *
*(.GNU.warning)
*(.interp .hash .dynsym .dynstr .GNU.version*)
提供(__etext =.); 

对此有任何反馈吗?
此致
Petr

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

    您好!

    感谢您的报告。

    当使用-mlarge 标志来选择大内存模型时、编译器会将 ISR 放入.lowtext 段中、以确保它们始终位于较低的内存中、因此具有适合矢量表中16位插槽的地址。

    实际上、FR5994链接器脚本中缺少与.lowtext 段匹配的规则。 您的修补程序修复了这一点、并将.lowtext 放置在始终位于较低存储器中的段中。

    实际上、以下器件的链接器脚本中缺少.lowtext 规则:

    • MSP430fr2476
    • MSP430fr2676
    • MSP430fr50431
    • MSP430fr5043
    • MSP430fr5962
    • MSP430fr5964
    • msp430fr5992
    • msp430fr59941
    • MSP430fr5994
    • MSP430fr6005
    • MSP430fr6007
    • MSP430fr6035
    • MSP430fr60371
    • MSP430fr6037
    • MSP430fr60431
    • MSP430fr6043
    • MSP430fr6045
    • MSP430fr60471
    • MSP430fr6047

    链接器脚本由 TI 自动生成、因此我不知道为什么只有这些器件具有此特定错误。

    我将向他们报告这一点、希望尽快解决。

    此致、