打印

S3C2440中断过程的理解(TQ2440开发板)

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

开发板是TQ2440,分析用到的启动代码就是开发板带的(好像大家的都差不多吧),看来很多天的启动代码,终于有点头绪了,下面具体说一下,欢迎大家指出错误
1、发生中断后,CPU会跳到程序地址的开头部分相应的中断向量处,比如发生外部中断0,程序跳到0x18处,此处放了一句跳转指令 b HandlerIRQ,程序就寻找标号HandlerIRQ
2、启动代码中有一句 HandlerIRQ HANDLER HandleIRQ,刚才的程序就跳到这里,这是一个宏,宏的具体内容就自己分析吧,宏有一项任务,就是讲PC指针指向HandleIRQ(注意:不是HandlerIRQ)标号的地址处;
3、在程序跳入Main()函数之前,有这么几句程序:ldr r0,=HandleIRQ,ldr r1,=IsrIRQ,str r1,[r0];这几句的意思是将标号IsrIRQ的地址放进标号HandleIRQ地址的内容中,上一步PC指针指向HandleIRQ其实就是PC指针指向IsrIRQ
4、IsrIRQ的内容核心是计算中断服务的地址,PC=|HandleEINT0+INTOFFSET*4|,怎么解释呢?启动代码的后面开辟了一片数据存储区AREA RamData, DATA, READWRITE,从地址 _ISR_STARTADDRESS(具体地址数据在option.inc文件开头定义)处开始,每4个字节为一个单位,依次存放的是异常的服务程序入口地址,是地址啊!找找咱们的IRQ中断,是从地址 _ISR_STARTADDRESS+0x20开始的,这个地址存放的是HandleEINT0。
5、前面说跳到中断服务程序要用PC=|HandleEINT0+INTOFFSET*4|。INTOFFSET是一个寄存器,里面每个位指示了相应的IRQ中断是否发生。奇怪了,我都知道存放IRQ中断的启示地址了,要这个INTOFFSET寄存器干嘛,你还*4?刚才说了HandleEINT0的地址就是IRQ开始的地址,这样加上一个偏移量就能找到所有的IRQ地址了,我们其实需要的是INTOFFSET里面的数据,就知道那个IRQ中断发生了,你可以看看数据手册这个寄存器每个位的定义和数据区每个IRQ的定义,他们是一一对应的关系。比如说EINT3中断发生了,INTOFFSET中的值是0x08,然后*4,等于0x32,HandleEINT0+INTOFFSET*4就等于_ISR_STARTADDRESS+0x20+0x32,他的值就是HandleEINT3,里面存放的是EINT3的中断服务函数。这种寻找地址的方法只是其中一种,还有其他的方法。
6、如何将中断服务函数的地址放进前面说的那个数据区的地址内呢?在Keyscan.c里面有一句pISR_EINT0 = pISR_EINT1 = pISR_EINT2 = pISR_EINT4_7 = (U32)Key_ISR;我们只看pISR_EINT0 = (U32)Key_ISR;其中(U32)Key_ISR是中断服务程序的入口地址,把这个入口地址放入标号pISR_EINT0 中,标号pISR_EINT0 又是神马?在2440addr.h有一句程序#define pISR_EINT0 (*(unsigned *)(_ISR_STARTADDRESS+0x20)),其实就是讲Key_ISR的入口放入那个地址中,那个地址是不是很眼熟啊,哈哈!

其实还有些问题没完全搞懂,INTOFFSET是不是每次只有一位会被置1,而且是中断优先级较高的??吐槽一下TQ2440开发板带的教程写的真乱,很多连注释都没有。

不知道你看懂了没,要是没看懂,你得反思你得理解能力了,我得反思我的表达能力了!有问题要经常谷歌百度啊!

相关帖子

沙发
阿南| | 2012-12-13 11:41 | 只看该作者
恩,不错,楼主有前途

使用特权

评论回复
板凳
阿南| | 2012-12-13 11:45 | 只看该作者
INTOFFSET是不是每次只有一位会被置1,而且是中断优先级较高的??
这个可以实践测试一下,比如开两个定时器,让他们都产生中断,然后设一个断点,再查看INTOFFSET值就可以确认了。

使用特权

评论回复
地板
sunhaojie|  楼主 | 2012-12-13 14:30 | 只看该作者
阿南 发表于 2012-12-13 11:41
恩,不错,楼主有前途

哈哈,版主现身了!第一次穿裤子啊!写的虽然不是太好,但是绝对原创的,以后会发更多的原创帖子。再次感谢阿南版主!

使用特权

评论回复
5
阿南| | 2012-12-13 14:35 | 只看该作者
呵呵,给好帖加精是我的职责,所以不用感谢。

使用特权

评论回复
6
zh5202| | 2012-12-13 16:37 | 只看该作者
好像我没有见到过你所说的什么启动代码,不知道你的启动代码是什么样的启动代码?是基于ADS下的,还是KEIL下的?还是在LINXU中编译的?
最好把你的启动代码也贴出来,大家结合一起分析。

使用特权

评论回复
7
sunhaojie|  楼主 | 2012-12-13 17:00 | 只看该作者
zh5202 发表于 2012-12-13 16:37
好像我没有见到过你所说的什么启动代码,不知道你的启动代码是什么样的启动代码?是基于ADS下的,还是KEIL ...

我用的是TQ2440开发板,启动代码是开发板带的,基于ADS1.2,应该是修改别人的。现在还没啃透,只是把中断这块看透了。我想把启动代码掌握后将程序移植到MDK里面

使用特权

评论回复
8
zh5202| | 2012-12-13 17:12 | 只看该作者
sunhaojie 发表于 2012-12-13 17:00
我用的是TQ2440开发板,启动代码是开发板带的,基于ADS1.2,应该是修改别人的。现在还没啃透,只是把中断 ...

我手头没有TQ2440的板子,可以贴出启动代码么?

使用特权

评论回复
9
1638574407| | 2012-12-13 17:41 | 只看该作者

使用特权

评论回复
10
zmj2008| | 2012-12-13 18:06 | 只看该作者
mark一下吧,

使用特权

评论回复
11
sgj245609615| | 2012-12-14 07:06 | 只看该作者
学习一下

使用特权

评论回复
12
anvy178| | 2012-12-14 10:02 | 只看该作者
不错 精神可嘉啊

使用特权

评论回复
13
sunhaojie|  楼主 | 2012-12-14 10:03 | 只看该作者
zh5202 发表于 2012-12-13 17:12
我手头没有TQ2440的板子,可以贴出启动代码么?

这是天嵌开发板带的程序,他的所有程序都是有一个程序通过注释掉其他内容来实现的 1.4(20100207).rar (3.78 MB)

使用特权

评论回复
14
zh5202| | 2012-12-14 13:23 | 只看该作者
sunhaojie 发表于 2012-12-14 10:03
这是天嵌开发板带的程序,他的所有程序都是有一个程序通过注释掉其他内容来实现的 ...

嗯,多谢了

使用特权

评论回复
15
现在努力吧| | 2012-12-14 14:39 | 只看该作者
来学习学习

使用特权

评论回复
16
yanjinbin| | 2012-12-14 18:33 | 只看该作者
其实还有些问题没完全搞懂,INTOFFSET是不是每次只有一位会被置1,而且是中断优先级较高的??

INTOFFSET是个当前触发中断偏移值。
如果你设置中断位为IRQ模式,触发一个中断进入IRQ模式后,就会屏蔽后来的中断触发。
如果当前中断正在处理,此时如果有其他中断发生,会置位中断挂起位而不会进入中断。
当然如果你第一个中断处理时候够长,期间触发了一个以上中断,这时候等当前中断处理完毕后,就会对比两个待触发中断优先级,优先级高的
就先触发。

使用特权

评论回复
17
sunhaojie|  楼主 | 2012-12-14 20:14 | 只看该作者
yanjinbin 发表于 2012-12-14 18:33
其实还有些问题没完全搞懂,INTOFFSET是不是每次只有一位会被置1,而且是中断优先级较高的??

INTOFFSET ...

谢谢你的回答,你应该比较懂arm吧,你看看我对中断的理解有什么不对的地方没

使用特权

评论回复
18
ytfdhb| | 2012-12-16 12:40 | 只看该作者
不错

使用特权

评论回复
19
petermeng_01| | 2012-12-17 09:39 | 只看该作者
不错,之前买了一个这个调试板,正准备用,谢谢楼主的说明!

使用特权

评论回复
20
W_Controller| | 2012-12-18 09:07 | 只看该作者
顶一下楼主;这几天从公司申请买了TQ2440的开发板,希望多多交流:)

使用特权

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

本版积分规则

个人签名:孤独是一种气质

17

主题

129

帖子

2

粉丝