打印
[ARM入门]

ARM的中断处理机制

[复制链接]
1147|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ilikedota|  楼主 | 2015-11-30 23:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 ilikedota 于 2015-11-30 23:41 编辑

1、新建了个ARM工程,打开启动代码文件,发现里面有一段IRQ_Handler     B       IRQ_Handler
FIQ_Handler     B       FIQ_Handler指令,这个不是个无条件跳转指令吗?这样跳转下去不就是个死循环吗?这个时怎么回事?我新建了个外部中断的历程,发现外部中断能进去啊,也执行了我的代码,这究竟时怎么回事,难道时对启动代码理解错了?2、ARM中断要保存现场,并切换到IRQ模式。既然要保存现场,肯定涉及到相关汇编指令对寄存器的操作,这些操作指令在哪里啊,我在启动代码里找了半天也没有找到啊,还是说这个保存的工作不需要什么汇编指令,ARM内核的硬件机制自动会去做这件事?那如果时ARM内核的硬件机制自动会去做,那为什么在使用ucos操作系统时,中断现场保存是要用户自己写汇编指令来实现呢?此外进入IRQ模式是不是当中断发生了,ARM内核自动从用户模式切换到IRQ模式啊?使用ucos好像也是要自己写汇编指令来现实,这究竟时怎么回事,搞得一头雾水,请各路高人帮忙分析分析,答疑解惑,小弟在此谢过了!!!

相关帖子

沙发
阿南| | 2015-12-1 08:59 | 只看该作者
楼主,把你的完整的中断向量表放出来,看一下。s3c2410的中断向量表入口是这样的:

        AREA    Init,CODE,READONLY
        ENTRY
        b        ResetHandler  
        b        HandlerUndef        ;handler for Undefined mode
        b        HandlerSWI        ;handler for SWI interrupt
        b        HandlerPabort        ;handler for PAbort
        b        HandlerDabort        ;handler for DAbort
        b        .                     ;reserved
        b        HandlerIRQ        ;handler for IRQ interrupt
        b        HandlerFIQ        ;handler for FIQ interrupt

使用特权

评论回复
板凳
ilikedota|  楼主 | 2015-12-1 15:30 | 只看该作者
阿南 发表于 2015-12-1 08:59
楼主,把你的完整的中断向量表放出来,看一下。s3c2410的中断向量表入口是这样的:

        AREA    Init,CODE,RE ...

你好,谢谢你肯关注我的问题,请教图片。

IMG_20151201_152104.jpg (439.12 KB )

IMG_20151201_152104.jpg

使用特权

评论回复
地板
阿南| | 2015-12-1 19:30 | 只看该作者
你这里更像是出现异常之后,原地等待。应该还能找到其它地方的中断向量表的

使用特权

评论回复
5
阿南| | 2015-12-1 19:31 | 只看该作者
如果是在集成开发环境下,看下对应的反汇编代码

使用特权

评论回复
6
ilikedota|  楼主 | 2015-12-1 23:25 | 只看该作者
本帖最后由 ilikedota 于 2015-12-1 23:27 编辑
阿南 发表于 2015-12-1 19:31
如果是在集成开发环境下,看下对应的反汇编代码

附件是启动代码的文件,请你帮忙看下,看看能够找出问题的症结,谢谢了

Startup.zip

3.54 KB

使用特权

评论回复
7
阿南| | 2015-12-2 09:55 | 只看该作者

                AREA    RESET, CODE, READONLY
                ARM


; Exception Vectors
;  Mapped to Address 0.
;  Absolute addressing mode must be used.
;  Dummy Handlers are implemented as infinite loops which can be modified.

Vectors         LDR     PC, Reset_Addr         
                LDR     PC, Undef_Addr
                LDR     PC, SWI_Addr
                LDR     PC, PAbt_Addr
                LDR     PC, DAbt_Addr
                NOP                            ; Reserved Vector
;               LDR     PC, IRQ_Addr
                LDR     PC, [PC, #-0x0FF0]     ; Vector from VicVectAddr
                LDR     PC, FIQ_Addr

Reset_Addr      DCD     Reset_Handler
Undef_Addr      DCD     Undef_Handler
SWI_Addr        DCD     SWI_Handler
PAbt_Addr       DCD     PAbt_Handler
DAbt_Addr       DCD     DAbt_Handler
                DCD     0                      ; Reserved Address
IRQ_Addr        DCD     IRQ_Handler
FIQ_Addr        DCD     FIQ_Handler

Undef_Handler   B       Undef_Handler
SWI_Handler     B       SWI_Handler
PAbt_Handler    B       PAbt_Handler
DAbt_Handler    B       DAbt_Handler
IRQ_Handler     B       IRQ_Handler
FIQ_Handler     B       FIQ_Handler

使用特权

评论回复
8
阿南| | 2015-12-2 10:21 | 只看该作者
楼主可以将上帖的代码分2部分,第1部分是实际上的中断向量表的开始,也是中断产生后跳转的地方:
Vectors         LDR     PC, Reset_Addr         
                LDR     PC, Undef_Addr
                LDR     PC, SWI_Addr
                LDR     PC, PAbt_Addr
                LDR     PC, DAbt_Addr
                NOP                            ; Reserved Vector
;               LDR     PC, IRQ_Addr
                LDR     PC, [PC, #-0x0FF0]     ; Vector from VicVectAddr
                LDR     PC, FIQ_Addr

这里给PC值完成跳转
Reset_Addr:复位后要执行的代码起始地址
IRQ_Addr:IRQ中断的入口地址
。。。。

接下来的第2部分,也就是楼主纠结的部分,那应该是
....DCD....
............
....B.....
..........

楼主可以单步调试一下这段代码,人为的产生一些中断,如IRQ

IRQ_Handler     B       IRQ_Handler

看IRQ中断是否在原地跑。

使用特权

评论回复
9
ilikedota|  楼主 | 2015-12-2 21:53 | 只看该作者
阿南 发表于 2015-12-2 10:21
楼主可以将上帖的代码分2部分,第1部分是实际上的中断向量表的开始,也是中断产生后跳转的地方:
Vectors ...

我的理解和你一样,只是我没有仿真器,做不了单步调试,不能一步一步去看实验现象。但是我的硬件有外部中断电路,我写了个工程试验过了,可以产生中断。我现在怀疑是不是编译器在这里做了手脚,只是我们不知道具体它是怎么做的。个人愚见,呵呵。

使用特权

评论回复
10
阿南| | 2015-12-3 10:02 | 只看该作者
ilikedota 发表于 2015-12-2 21:53
我的理解和你一样,只是我没有仿真器,做不了单步调试,不能一步一步去看实验现象。但是我的硬件有外部中 ...

您能实验就好办呀:P
将那段代码蔽避掉,再做中断实验,就可以知道那段代码是否有起作用。

使用特权

评论回复
11
阿南| | 2015-12-3 10:03 | 只看该作者
蔽避下面这两句:
IRQ_Handler     B       IRQ_Handler
FIQ_Handler     B       FIQ_Handler

使用特权

评论回复
12
houyue——| | 2015-12-3 11:16 | 只看该作者
Ucos貌试保存了2个,主栈一个,任务站一个,主的那个是你说的什么硬件自动的,任务的是自己写的。个见愚人。

使用特权

评论回复
13
leihen0525| | 2015-12-17 10:44 | 只看该作者
看来楼主还很年轻啊,这种做法是用来连接外部函数的,比如中断函数是有实体的,也就是你在外部定义了一样函数名的函数,那么编译器会把这个地址连接到外部那个函数,如果外部没有实体,那么不就报错了吗 ,所以就用假实体,

使用特权

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

本版积分规则

33

主题

98

帖子

3

粉丝