免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1151 | 回复: 0
打印 上一主题 下一主题

arm boot interrupt [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-04-27 16:39 |只看该作者 |倒序浏览
最近项目刚了结,是关于adi blackfin平台的,资料还没有整理好,由于比较着急,所以也没有时间写出来。这几天可以轻松点啦。所以把以前的arm板拿出来,琢磨琢磨。今天理解2440的启动部分了,有很多不解的地方。上网也查询了好多资料,还是很有收获的。主要来说说ARM BOOT的启动时候的关于中断向量的一点理解。

;=======================================================================================
;下面这个宏是用于第一次查表过程的实现中断向量的重定向,如果你比较细心的话就是发现
;在_ISR_STARTADDRESS=0x33FF_FF00里定义的第一级中断向量表是采用型如Handle***的方式的.
;而在程序的ENTRY处(程序开始处)采用的是b Handler***的方式.
;在这里Handler***就是通过HANDLER这个宏和Handle***进立联系的.
;这种方式的优点就是正真定义的向量数据在内存空间里,而不是在ENTRY处的ROM(FLASH)空间里,
;这样,我们就可以在程序里灵活的改动向量的数据了.
;========================================================================================

                MACRO
$HandlerLabel HANDLER $HandleLabel

$HandlerLabel
        sub        sp,sp,#4        ;减少sp(用于存放转跳地址)
        stmfd        sp!,{r0}        ;把工作寄存器压入栈(lr does not push because it return to original address)
        ldr     r0,=$HandleLabel;将HandleXXX的址址放入r0
        ldr     r0,[r0]         ;把HandleXXX所指向的内容(也就是中断程序的入口)放入r0
        str     r0,[sp,#4]      ;把中断服务程序(ISR)压入栈
        ldmfd   sp!,{r0,pc}     ;用出栈的方式恢复r0的原值和为pc设定新值(也就完成了到ISR的转跳)
        MEND

===================================================================

b        ResetHandler        ;设成FALSE的话就来到这了,转跳到复位程序入口
        b        HandlerUndef        ;转跳到Undefined mode程序入口
        b        HandlerSWI        ;转跳到SWI 中断程序入口
        b        HandlerPabort        ;转跳到PAbort(指令异常)程序入口
        b        HandlerDabort        ;转跳到DAbort(数据异常)程序入口
        b        .                ;保留
        b        HandlerIRQ        ;转跳到IRQ 中断程序入口
        b        HandlerFIQ        ;转跳到FIQ 中断程序入口
=================================================================


HandleReset         #   4
HandleUndef         #   4
HandleSWI                #   4
HandlePabort    #   4
HandleDabort    #   4
HandleReserved  #   4

关于以上三部分,我是这样理解的,不知道是否正确,只是希望大家共同学习。

b HandlerUndef  ,我认为类似B要跳转的这个函数是需要我们自己来写的。而我们要实现的中断函数的首地址放在哪呢?放在HandleUndef(注意没有“r”)定义的地方,一般在sdram的高地址。而执行 b HandlerUndef命令,就跳到我们定义的中断函数了。为什么呢?原因应该就是关于那个很烦人的宏定义。也就是以下这段:
MACRO
$HandlerLabel HANDLER $HandleLabel
$HandlerLabel
sub sp,sp,#4 ;减少sp(用于存放转跳地址)
stmfd sp!,{r0} ;把工作寄存器压入栈(lr does not push because it return to original address)
ldr     r0,=$HandleLabel;将HandleXXX的址址放入r0
ldr     r0,[r0] ;把HandleXXX所指向的内容(也就是中断程序的入口)放入r0
str     r0,[sp,#4]      ;把中断服务程序(ISR)压入栈
ldmfd   sp!,{r0,pc}     ;用出栈的方式恢复r0的原值和为pc设定新值(也就完成了到ISR的转跳)
MEND

具体怎么跳,我也说不清楚,但是就是找到函数了。

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/95243/showart_1912155.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP