首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > 单片机 >

S3C2440中断的编写有关问题

2013-10-30 
S3C2440中断的编写问题void __irq Eint0_Isr(void)编写后出现这样的错误fun.h:9: error: syntax error be

S3C2440中断的编写问题

void __irq Eint0_Isr(void);

编写后出现这样的错误
fun.h:9: error: syntax error before "Eint0_Isr"

fun.h:9: warning: data definition has no type or storage class
查看了下这样的格式也是正确的啊,难道是编译器有问题?我是在linux下编写的
linux
[解决办法]
编译器不认识 “__irq”
[解决办法]
参考一下代码:

#define _ISR_STARTADDRESS 0x33ffff00
 
#define U32 unsigned int
 
#define pISR_EINT0            (*(unsigned *)(_ISR_STARTADDRESS+0x20))
#define pISR_EINT1            (*(unsigned *)(_ISR_STARTADDRESS+0x24))
#define pISR_EINT2            (*(unsigned *)(_ISR_STARTADDRESS+0x28))
#define pISR_EINT4_7  (*(unsigned *)(_ISR_STARTADDRESS+0x30))
 
#define rSRCPND     (*(volatile unsigned *)0x4a000000)      //Interrupt request status
#define rINTMSK     (*(volatile unsigned *)0x4a000008)       //Interrupt mask control
#define rINTPND     (*(volatile unsigned *)0x4a000010)       //Interrupt request status
 
#define rGPBCON    (*(volatile unsigned *)0x56000010) //Port B control
#define rGPBDAT    (*(volatile unsigned *)0x56000014) //Port B data
#define rGPBUP     (*(volatile unsigned *)0x56000018)  //Pull-up control B
 
#define rGPFCON    (*(volatile unsigned *)0x56000050) //Port F control
 
#define rEXTINT0   (*(volatile unsigned *)0x56000088)  //External interrupt control register 0
#define rEINTMASK  (*(volatile unsigned *)0x560000a4) //External interrupt mask
#define rEINTPEND  (*(volatile unsigned *)0x560000a8) //External interrupt pending
 
static void __irq Key1_ISR(void)   //EINT1
{
       int led;
       rSRCPND = rSRCPND 
[解决办法]
 (0x1<<1);
       rINTPND = rINTPND 
[解决办法]
 (0x1<<1);
       led = rGPBDAT & (0x1<<5);
       if (led ==0)
              rGPBDAT = rGPBDAT 
[解决办法]
 (0x1<<5);
       else
              rGPBDAT = rGPBDAT & ~(0x1<<5);
}
 
static void __irq Key2_ISR(void)   //EINT4
{
       int led;
       rSRCPND = rSRCPND 
[解决办法]
 (0x1<<4);
       rINTPND = rINTPND 
[解决办法]
 (0x1<<4);
       if(rEINTPEND&(1<<4))
       {
              rEINTPEND = rEINTPEND 
[解决办法]
 (0x1<<4);
              led = rGPBDAT & (0x1<<6);
              if (led ==0)
                     rGPBDAT = rGPBDAT 
[解决办法]
 (0x1<<6);
              else
                     rGPBDAT = rGPBDAT & ~(0x1<<6);
       }
}
 
static void __irq Key3_ISR(void)   //EINT2
{
       int led;


       rSRCPND = rSRCPND 
[解决办法]
 (0x1<<2);
       rINTPND = rINTPND 
[解决办法]
 (0x1<<2);
       led = rGPBDAT & (0x1<<7);
       if (led ==0)
              rGPBDAT = rGPBDAT 
[解决办法]
 (0x1<<7);
       else
              rGPBDAT = rGPBDAT & ~(0x1<<7);
}
 
void __irq Key4_ISR(void)   //EINT0
{
       int led;
       rSRCPND = rSRCPND 
[解决办法]
 0x1;
       rINTPND = rINTPND 
[解决办法]
 0x1;
       led = rGPBDAT & (0x1<<8);
       if (led ==0)
              rGPBDAT = rGPBDAT 
[解决办法]
 (0x1<<8);
       else
              rGPBDAT = rGPBDAT & ~(0x1<<8);
}
 


[解决办法]
应该 “换一个编译器”, 反正不能是 linux。
[解决办法]
2. GCC for AVR,对于中断函数支持两种关键字ISR与SIGNAL,其格式如下:
       ISR(vect)
       {
              ………
       }

SIGNAL(vect)
{
       ……..
}
其中的vect就是中断向量名,根据不同的型号的AVR单片机的不同的中断源都会有相对应的中断向量名,比如外部中断0对于ISR格式的中断向量名为INT0_vect,对SIGNAL则为SIG_INTERRUPT0。
[解决办法]
引用:
我用
“Code Warrior for Arm”
可以识别
__irq

主要是编译器不支持
[解决办法]
这个要换编译器吧
gcc不支持对C语言扩展的关键字
换成ADS
[解决办法]


linux下中断函数的定义可参考:
static irqreturn_t fmi_interrupt(int irq, void *devid)
[解决办法]
参考例子:裸机程序
定义中断服务程序:
void __irq Timer0Done(void)
{
    rSRCPND = BIT_TIMER0;       //Clear pending bit
    rINTPND = BIT_TIMER0;//Clear serve bit    
    variable0++;       
}
在实验主程序中指定中断入口函数:
pISR_TIMER0 = (int)Timer0Done; 

  以上可以在开发环境uVision4,工具链:MDK-ARM Ver 4.12 编译通过,并下载到三星2410/2440裸机开发板(内部驻有三星的VIVI引导程序)上运行。 老版本的编译环境 ADS1.2也没有任何问题。

热点排行