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 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 规则:
链接器脚本由 TI 自动生成、因此我不知道为什么只有这些器件具有此特定错误。
我将向他们报告这一点、希望尽快解决。
此致、