打印

arm的中断处理程序

[复制链接]
1530|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
箫笑|  楼主 | 2009-1-17 21:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
之前用惯了C51,用interrupt很方便,初初使用arm,不知道该怎么写了,

看了别人汇编写的bootloader,发现它在SDRAM里做了一个中断地址表,然后获取中断处理程序的地址值写到这个地址表里,通过跳转来完成。

如:
    ldr r0, =HandleIRQ        ;Setup IRQ handler
    ldr r1, =IsrService 
    str r1, [r0]  

    MAP     _ISR_STARTADDRESS  
HandleUndef    #    4
HandleSWI        #    4
HandlePabort    #    4
HandleDabort    #    4
HandleIRQ        #    4
HandleFIQ        #    4

HandleADC        #    4
HandleRTC        #    4
HandleUTXD1    #    4
     ......

如果我是用C写的中断处理程序,也是要通过这种方式把它的地址值放到上面的表里吗?但是C写的处理函数怎么能得到它的地址所在呢?而且每个用到的中断都要如此设置一次??

相关帖子

沙发
阿南| | 2009-1-17 21:37 | 只看该作者

楼主可以先一个C语言的中断服务程序看看

而且还要去分析一下启动代码中的中断处理过程
做了这两个工作,差不多对ARM的中断就理解了

使用特权

评论回复
板凳
tc9148| | 2009-1-17 23:27 | 只看该作者

我的理解

SDRAM中的中断表是虚拟的,flash中的中断响应后,就跳到这个虚拟的中断表执行相应程序,

使用特权

评论回复
地板
ehoosee| | 2009-1-26 10:05 | 只看该作者

你的例程是对的

然后再在C语言里把函数内容定义好就行了。

使用特权

评论回复
5
箫笑|  楼主 | 2009-2-2 17:59 | 只看该作者

这个基本明白了

MAP那些个地址表是留着四个字节空间用来保存相应的中断处理地址的。
在芯片的C语言头文件里将这些地址像定义寄存器一样给它一个名字,在中断初始化的地方把真正的处理函数地址填进这个地址表里去就行了。

有个觉得不方便的是,在汇编文件里用EQU指定开始地址_ISR_STARTADDRESS符号,而在C语言里要用define,必须得保证两个地方的_ISR_STARTADDRESS是同一个值。
想知道在汇编文件里EQU给定的_ISR_STARTADDRESS符号怎样能在C语言里使用吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

78

主题

368

帖子

0

粉丝