一起学mini2440裸机开发(十)mini2440外部中断实验
来标志寄存器INTPND的那种类型发生了。寄存器INTOFFSET的各位定义如图8所示,当清除寄存器SRCPND和寄存器INTPND中相应的中断标志位后,寄存器INTOFFSET的值自动清零。
例如,若外部中断0发生且没有被屏蔽,则寄存器INTOFFSET的值为0;若定时器0中断发生且没有被屏蔽,则寄存器INTOFFSET的值为10。
__irq关键字:在isrservice.c中中断响应函数为void __irq IRQ_Handler(void),其中IRQ_Handler为函数名,这里名字不能变,因为在你的S3C2440.s代码中有这样一句话,
当发生IRQ中断时,程序跳转到标号IRQ_Handler处去执行,这里的标号就是咱们的中断服务函数的名字。
关键字__irq必须得加上,注意它和ADS中的不同点是,MDK中irq前边加俩个"_",ADS中前边只有一个“_”。
__irq关键字主要有以下作用:
①中断发生后,自动保存所有需要保存的寄存器
②中断返回时,自动计算中断返回地址,并自动将IRQ模式下寄存器SPSR_irq的值恢复到寄存器CPSR(中断进入什么模式,则将该模式下寄存器SPSR的值恢复到CPSR中)。
关于中断,还有几个问题咱们需要思考,下面我仅列出来,就不再说了,时间有限:
①当中断发生后,程序是如何跳转到中断处理函数呢?
②执行完中断处理函数后,如何返回到原来被打断的地方接着执行呢?
③ARM处理器的流水线结构对中断返回地址的计算有什么影响呢?
④ARM7处理器是3级流水线结构,ARM9处理器是5级流水线结构,为什么中断返回地址的计算会相同呢?
⑤ARM处理器有7种工作模式,发生中断后,处理器进入什么工作模式呢?
⑥发生中断后,哪些事情是AMR处理器自动完成的呢?哪些事情是需要编程实现的呢?
理解了这些问题,相信你对中断的掌握又会上升到一个高度呢!
mini2440外部中 相关文章:
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)
- Linux嵌入式系统开发平台选型探讨(11-09)
- Windows CE 进程、线程和内存管理(二)(11-09)