调试LPC2300单片机时出现"error: L6236E: No section matches selector - no section to be FIRST/LAST."

问题1描述:

在将SmartARM2300单片机开发板的程序源码搬到keil,建立工程后,编译第一次遇到问题是

“error:  #147-D: declaration is incompatible with "void CANIntPrg(void)__irq" (declared at line 185 of "can\LPC2300CAN.h")”

经查找解决方法时参考:

armcc的编译器的C对ANSI C的关键字做了些扩展。
比如__irq 是用来声明IRQ和FIQ中断处理函数用的,可以自动返回原来的现场。__asm用来嵌入汇编代码等。

  __irq为一个标识,用来表示一个函数是否为中断函数。对于不同的编译器,__irq在函数名中的位置不一样,例如:


  ADS编译器中 : void __irq IRQ_Eint0(void);
  Keil编译器中 : void IRQ_Eint0(void) __irq;


它所完成的任务是标识该函数为中断函数,在编译器编译是调用此函数时,先保护函数入口现场,然后执行中断函数,函数执行完毕,恢复中断现场,这整个过程不需要用户重新编写代码来完成,由编译器自动完成。因而这也给不具备中断嵌套功能的ARM系统带来了问题,若使用 __irq 时有中断嵌套产生,这现场保护就会混乱。因此自己编写中断入口现场保护代码,并不使用 __irq 标识符号,就是这个原因。
 总结如下:
 1、若不想自己编写中断入口现场保护代码,而且使用中无中断嵌套,在中断函数中用 __irq 来标识我们的中断函数,否则出错;
 2、若程序中要使用中断嵌套,对于无中断嵌套功能的ARM来说,一定要自己编写中断入口现场保护代码,而且不能用 __irq 标识我们的中断函数,否则出错。

问题2描述:

在解决上面问题后,编译keil工程,出现错误:

“error: L6236E: No section matches selector - no section to be FIRST/LAST.”

经过查询:https://blog.csdn.net/electrocrazy/article/details/79638705

上面的那一句   *.o (RESET, +First)就表明了启动代码的首次执行地址。具体来说就是表明了RO执行域名称为ER_ROM1 ,

开始地址为0x00000000 ,长度为0x00200000,首次执行的地址为RESET标号所表示的地址。

问题解决方案:

得知是因为启动文件错误导致,将keil工程创建时加载的启动文件添加到工程目录下,在次编译即可编译通过。


 

猜你喜欢

转载自blog.csdn.net/qq_28643619/article/details/88783323