打印

s3c44b0 中断问题

[复制链接]
2094|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
jplzl|  楼主 | 2010-11-11 20:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人刚学ARM,正在用的是公板s3c44b0
正在学习中断,遇到以下问题,望知道的给个答复,不胜感激!
1:测试外部中断EXTINT4/5/6/7,用非向量中断模式的话,第一次中断可以进,但第二次中断就进不了了。EXTINTPND,INTPND的相应位都显示有中断请求,但第二次就是不能跳到0x18处,自然也就不能再进中断服务程序; why?
2:把INTCON 改为0x05,即向量中断模式的话,其他设置不变,就出错,程序跑飞
3:向量中断与非向量中断要进入中断服务程序的话,在代码上有什么区别?是不是说只要把INTCON设置好就行?我一直不懂向量中断机制是怎么在启动代中直接跳入相应中断地址的.启动代码中三段相关代码如下:
AREA  Init,CODE,READONLY
__ENTRY
  b    ResetHandler
  b    HandlerUndef
  b    HandlerSWI
  b    HandlerPabort
  b    HandlerDabort
  b    .
  b    HandlerIRQ
  b    HandlerFIQ
  
VECTOR_BRANCH
  ldr   pc,=HandlerEINT0
  ldr   pc,=HandlerEINT1
  ldr   pc,=HandlerEINT2
  ldr   pc,=HandlerEINT3
  ldr   pc,=HandlerEINT4567
  ldr   pc,=HandlerTICK
  b    .
  b    .
  ldr   pc,=HandlerZDMA0
  ldr   pc,=HandlerZDMA1
  ldr   pc,=HandlerBDMA0
  ldr   pc,=HandlerBDMA1
  ldr   pc,=HandlerWDT
  ldr   pc,=HandlerUERR01
  b    .

HandlerFIQ HANDLER HandleFIQ
HandlerIRQ HANDLER HandleIRQ
HandlerUndef HANDLER HandleUndef
HandlerSWI HANDLER HandleSWI
HandlerDabort HANDLER HandleDabort
HandlerPabort HANDLER HandlePabort

IsrIRQ ;using I_ISPR register.
    sub     sp,sp,#4       ;reserved for PC
    stmfd   sp!,{r8-r9}   
;IMPORTANT CAUTION
;if I_ISPC isn't used properly, I_ISPR can be 0 in this routine.
    ldr     r9,=I_ISPR
    ldr     r9,[r9]
    mov     r8,#0x0
0
    movs    r9,r9,lsr #1
    bcs     %F1
    add     r8,r8,#4
    b     %B0
1
    ldr     r9,=HandleADC
    add     r9,r9,r8
    ldr     r9,[r9]
    str     r9,[sp,#8]
    ldmfd   sp!,{r8-r9,pc}

非向量中断机制跳入中断服务程序好理解:由b HandlerIRQ到HandlerIRQ HANDLER HandleIRQ 再到判断哪个中断发生了,即IsrIRQ,然后再跳入设定的中断服务程序地址

按照大多数资料的显示:向量中断进入中断服务程序地址的路径是:0x18处IRQ然后经硬件自动处理到lpc pc,=extint4567,只要在这extint4567对应的RAM地址处放上中断服务程序地址就行。可我就是没见过详细的向量中断模式进入中断服务程序的代码,这是为什么呢??就连我买板子附送的资料上都没有向量中断模式的例子,why??/
有没有能给个进入向量中断模式的详细的代码,有解释当然最好咯。

再次恳请了解,清楚的高人看在培养后人的份上给予解释啊~~~~~~

相关帖子

沙发
jplzl|  楼主 | 2010-11-11 20:49 | 只看该作者
在线等啊,没有解释又将是一个失眠夜啊:'(

使用特权

评论回复
板凳
xinzha| | 2010-11-11 22:02 | 只看该作者
你去找点VIC(vectored interrupt controller)的资料看看吧,这东西几句话也说不清楚。
简单说,异常是cpu响应自己的事件,中断是外部请求cpu响应(是否响应由cpu自己决定),异常的级别高于中断,通常非向量中断的方式是有一个全局的中断状态寄存器,此寄存器的每一位代表哪个外部模块发出了中断请求,一旦有某位置位,就会产生一个外部中断异常,如果cpu能够响应,就会去查询是哪个模块产生了中断,调用相应模块的中断服务例程。
中断向量系统实际上相当于一个中断响应加速器,vic模块根据自己定义的优先级别决定当前哪个中断是优先执行中断(如果有中断的话),将某一时刻的最高优先级中断的服务例程地址取到响应寄存器,并激起cpu的外部中断异常,此时cpu的中断异常服务程序就不用去判断哪个模块产生了中断,而只需要直接把vic中相应寄存器的值作为指针赋给pc直接跳过去就行了,也就是vic小弟把杂活都干了,cpu大哥直接干重要的事就可以了。

使用特权

评论回复
地板
jplzl|  楼主 | 2010-11-11 22:13 | 只看该作者
感觉全是理论性 缺少实际的代码,很难懂。
现在的状况是这样:INTPND=0x00200000显示有外部EXTINT4567中断请求,EXTINTPND=0x01显示有外部中断4(EXTINT4)请求,INTMSK=0x00000000,全部打开中断使能。但就是没发现进中断,程序跑飞了

使用特权

评论回复
5
xinzha| | 2010-11-11 22:21 | 只看该作者
ldmfd   sp!,{r8-r9,pc}

这句话没有把spsr恢复到cpsr,但是你贴的代码不全,不敢确切地说其他地方有没有。
当你觉得应该进中断而没有进的时候你要看看当前cpu的工作模式以及cpsr中的i位是否使能

使用特权

评论回复
6
xinzha| | 2010-11-11 22:32 | 只看该作者
如果想让这个函数恢复cpsr就要写成
ldmfd   sp!,{r8-r9,pc}^

使用特权

评论回复
7
jplzl|  楼主 | 2010-11-13 10:06 | 只看该作者
5# xinzha

我是用的ADS1.2调试的,怎么才能看的到cpsr中的i位呀?怎么才能看cpu的工作模式呢?我也是这样想的, 看是不是cpsr把i位置成了1 可能真是进了IRQ模式了

使用特权

评论回复
8
jplzl|  楼主 | 2010-11-13 10:26 | 只看该作者
没有用啊,ldmfd   sp!,{r8-r9,pc}^改成这样发现cpsr 还是在IRQ模式下  我的板子装了uboot和uclinux 程序一开始运行就是cpsr在svc模式 spsr在usr模式

使用特权

评论回复
9
jplzl|  楼主 | 2010-11-13 10:47 | 只看该作者
截了两张图看一下啊 程序开始运行前的C:\Documents and Settings\Administrator\桌面\1.jpg
还一张是运行后的,跑飞的C:\Documents and Settings\Administrator\桌面\2.jpg

使用特权

评论回复
10
xinzha| | 2010-11-13 12:37 | 只看该作者
图都看不到,cpsr如果在irq模式下,那就是进不了中断了,除非你做了中断嵌套。

使用特权

评论回复
11
xh717| | 2010-12-1 18:44 | 只看该作者
第一次能进,第二次进不成,是不是你在第一次中断后,没有将I—ISPC相应位清除啊。???

使用特权

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

本版积分规则

40

主题

229

帖子

2

粉丝