搜索
bottom↓
回复: 0

关于arm中断流程的一些问题

[复制链接]

出0入0汤圆

发表于 2011-9-16 11:12:04 | 显示全部楼层 |阅读模式
最近有种感觉,就是对arm/linux的学习必须以经典源码为主要资料,以前是东看西看,想找到现成的、别人总结好的心得,但是效果不是很理想,欲速则不达。这两天细致研究了下arm的中断系统(本人认为对一款处理器的使用难点在于其中断和存储器系统的理解),一个中断到底是如何一步一步的执行呢,这是困扰我们新手的一个问题。
切入正题,以三星2410为例。
    对于中断管理,2410的硬件包括arm核本身的中断管理部分和集成的中断管理器(片内外设),前者对于所有的arm芯片相同,后者具有芯片特殊性,这导致了arm启动代码中关于中断部分不一致。
    以定时器中断为例,我们作为用户需要完成的任务:1定时器的初始化,各种寄存器赋值2使能中断(cpsr和中断控制器),然后将服务程序地址赋给pISR_TIMER1(为什么赋给它,后面讨论)3当然是编写具体的中断服务程序。其他启动代码帮助我们完成了。程序执行过程中,中断发生了,我们看看处理器如何找到我们的服务程序的(这不是天然的,是经过n道工序,没有无缘无故的爱)。
        (1),中断发生,arm跳到0x0000 0018执行此处指令,这是硬件决定的。这里放置了一个跳转指令:b        HandlerIRQ        ;handler for IRQ interrupt
        (2)继续找,HandlerFIQ      HANDLER HandleFIQ,这是什么呢,他是一个宏,我把它翻译过来:
HandlerFIQ
        sub        sp,sp,#4        ;decrement sp(to store jump address)
        stmfd        sp!,{r0}        ;PUSH the work register to stack(lr does t push because it return to original address)
        ldr     r0,= HandleFIQ;load the address of HandleXXX to r0
        ldr     r0,[r0]         ;load the contents(service routine start address) of HandleXXX
        str     r0,[sp,#4]      ;store the contents(ISR) of HandleXXX to stack
        ldmfd   sp!,{r0,pc}     ;POP the work register and pc(jump to ISR)
有兴趣的可以看下,它最终将pc赋值HandleFIQ的值
(3)那么HandleFIQ那里储存了什么呢?arm在启动时做了这样的赋值
ldr        r0,=HandleIRQ             
ldr        r1,=IsrIRQ          
str        r1,[r0]
可见现在(2)中pc值为IsrIRQ所代表的地址。
(4)现在来到了IsrIRQ。详细看下:
IsrIRQ
        sub        sp,sp,#4       ;reserved for PC
        stmfd        sp!,{r8-r9}

        ldr        r9,=INTOFFSET
        ldr        r9,[r9]
        ldr        r8,=HandleEINT0
        add        r8,r8,r9,lsl #2
        ldr        r8,[r8]
        str        r8,[sp,#8]
        ldmfd        sp!,{r8-r9,pc}
这段代码,首先计算服务程序的地址,然后跳过去。但是INTOFFSET和 HandleEINT0两个东西然人费解。INTOFFSET寄存器的功能则很简单,它的作用只是用于表明哪个中断正在被处理。下面是该寄存器各位详细功能列表

HandleEINT0其实就是中断是量表的首地址(区分于arm的异常向量表),而上面所说的pISR_TIMER1就是有中断向量表得到的存放实际的中断处理函数的地址
#define pISR_TIMER1         (*(unsigned *)(_ISR_STARTADDRESS+0x4c))
其实这个地址就应该是add        r8,r8,r9,lsl #2中最终得到的r8。
其实感觉pISR_TIMER1也可以通过INTOFFSET和HandleEINT0来得到,前面的表述更为通用。


以上为个人见解,希望大家共同讨论。

阿莫论坛20周年了!感谢大家的支持与爱护!!

你熬了10碗粥,别人一桶水倒进去,淘走90碗,剩下10碗给你,你看似没亏,其实你那10碗已经没有之前的裹腹了,人家的一桶水换90碗,继续卖。说白了,通货膨胀就是,你的钱是挣来的,他的钱是印来的,掺和在一起,你的钱就贬值了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-10-3 10:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表