读书人

S3C2440中断的编写有关问题

发布时间: 2013-10-30 12:56:21 作者: rapoo

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也没有任何问题。

读书人网 >单片机

热点推荐