首页 | 新闻 | 新品 | 文库 | 方案 | 视频 | 下载 | 商城 | 开发板 | 数据中心 | 座谈新版 | 培训 | 工具 | 博客 | 论坛 | 百科 | GEC | 活动 | 主题月 | 电子展
返回列表 回复 发帖

S3C2440中断代码的深层次分析(4)

S3C2440中断代码的深层次分析(4)

// Interrupt vector(中断向量)
#define pISR_EINT0
(*(unsigned *)(_ISR_STARTADDRESS+0x20))

#define pISR_EINT1
(*(unsigned *)(_ISR_STARTADDRESS+0x24))

#define pISR_EINT2
(*(unsigned *)(_ISR_STARTADDRESS+0x28))

#define pISR_EINT3
(*(unsigned *)(_ISR_STARTADDRESS+0x2c))

#define pISR_EINT4_7
(*(unsigned *)(_ISR_STARTADDRESS+0x30))


#define pISR_SPI1
(*(unsigned *)(_ISR_STARTADDRESS+0x94))

#define pISR_RTC
(*(unsigned *)(_ISR_STARTADDRESS+0x98))

#define pISR_ADC
(*(unsigned *)(_ISR_STARTADDRESS+0x9c))

从上面的代码中我们可以知道pISR_EINT0之类的实质上就是一个地址,如果我们在这个地址中填充处理函数的地址值也就形成了函数指针,实际上只需要将函数名赋值给对应的中断向量即可。这样也就找到了适当的处理方式.基本的形式如下所示:

Void main()

{


pISR_EINT0 = (U32)Button_ISR;

While(1)
{

}
}
/*中断服务函数*/
static void _irq Button_ISR(void)
{


}
几个分析的比较清晰的网址可以去看看:
http://blog.sina.com.cn/s/blog_8c134b590100yke9.html
http://hi.baidu.com/%C9%B3%BC%D3%BB%C6%BD%F0%CA%A5%B6%B7%CA%BF/blog/item/fbc56f137f475a085baf5334.html

总结:


问题?在其中的代码中,我并没有看到返回地址的操作问题,我找了很多的代码,但是好像都不是特别的准确。也就是没有找到对应的
subs pc, lr, =0x04操作。


代码中经典的片段就是如何实现了代码的跳转问题:
sub sp,sp, #0x04;为保存PC值预留空间
stmfd
sp!,{r0};
保存需要使用到的寄存器值,需要使用多少,就压多少的堆栈

…//使用r0进行相关的操作
ldr r0,[r0];
str r0, [sp,#0x04]; //这个操作类似于函数调用中的问题
ldmfd sp!,{r0, pc};//出栈操作,实现了对PC值的赋值
继承事业,薪火相传
返回列表