打印

请教裸奔2440 外部中断问题!!!!!!!!!!!!

[复制链接]
7455|24
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
itelectron|  楼主 | 2009-12-7 19:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近在在裸奔2440 其中用到了中断
我的 启动方式是 NAND   启动
那么一级中断向量 是固定的 是在前4K SRAM里.
(因为NAND启动ARM自动复制NAND前4K到 2440内部SRAM里 而且从SARM的0X00000000执行)
而我是用的MDK 环境 在0X30000000 RAM 里调试.
那中断来了肯定是现转到2440前4K的SRAM里.

我目前的方法是先把启动文件烧写到前4K  NAND里 然后在0X30000000 RAM 里调试.
可以实现中断.但是每改一次中断 就得烧写 一次NAND 很 麻烦!
请问 有没有什么办法直接 在RAM里调试中断.

第2个问题是  2级中断(外部中断)是根据基地址(_ISR_STARTADDRESS)+rINTOFFSET

请问这个基地址是不是可以随便定的???
还是必须想下面 那样定义?
#define _ISR_STARTADDRESS  0x33ffff00

相关帖子

沙发
itelectron|  楼主 | 2009-12-7 20:00 | 只看该作者
郁闷木有人 回答

#define _ISR_STARTADDRESS         0x33ffff00

IntVTAddress    EQU     0x33ffff20
HandleEINT0                  EQU    IntVTAddress
#define pISR_EINT0                (*(unsigned *)(_ISR_STARTADDRESS+0x20))
看了启动代码这个中断基地址是和 启动代码里的相对应的

使用特权

评论回复
板凳
liliang9554| | 2009-12-7 21:40 | 只看该作者
不懂:Q

使用特权

评论回复
地板
xinzha| | 2009-12-8 15:45 | 只看该作者
你在一级中断处理那里写成这样的格式
import int_handler
LDR PC, IRQ_Addr /*替换一级中断处理那句话*/
IRQ_Addr DCD int_handler, 类似于这样就可以不用改前面的,每次改中断程序修改int_handler就行了,这种方法不知道适合你不,试试看吧。

使用特权

评论回复
5
itelectron|  楼主 | 2009-12-8 17:28 | 只看该作者
xinzha发表于 2009-9-6 10:21 | 只看该作者 回复 引用 订阅 报告 收藏 分享 评分楼主: 探讨一下ARM以及RVDS的使用ARM, RVDS, 探讨本帖最后由 xinzha 于 2009-9-6 10:54 编辑

最近太闲,想给自己找点事做,开个贴跟大家交流一下ARM和RVDS的使用,共同进步一下,说的不对的地方请多多指教。
   ARM是个充满争议的架构,有人说它是RISC,因为它基本做到了指令等长以及指令周期可预期(不考虑ARM/THUMB混用),并且指令数目远远少于CISC,可反对者认为它只是个类RISC,因为它的桶形移位器的存在,并且现在已经添加了非常多的多媒体指令。无论如何,这是一款优秀的cpu,因为它占有率第一。不知道MIPS改变市场策略之后能不能对ARM形成一定的冲击。
   首先讨论一下Remap的问题,由于ARM上电启动后的中断向量地址表的位置不能改变,必须是在物理0x0地址,这就产生了一个问题,如果你的代码有一定的速度要求,需要启动后在RAM中运行,那每次中断产生都要去ROM或者FLASH中查找中断向量,会对系统性能有点小影响(当然如果你的代码允许全程运行在FLash中就无所谓)。为了应对这个问题,ARM公司推荐了一种做法,就是上电复位的时候0x0指向NV memory,而在复位后马上执行一个重映射的设置,执行之后NV memory的地址变成另外一个地址,比如说0x4000 0000,而此时RAM的首地址变成了0x0,只需把包含中断向量表的镜像拷贝到ram的起始地址并做相应配置,pc跳转到0x0开始执行,一个崭新的世界开始了。
   由上面的问题又产生了另外一个问题,复位时的物理0x0地址应该放什么?一般的做法是一块rom或者Nor flash,里面是预先烧好的bootloader,执行这个bootloader的代码将运行镜像拷贝到相应的ram中(如果代码就在nv memory里执行,咱就把这步省了),所以这个bootloader中要包含相应的驱动程序,来从主机或者本板上读取文件。而前两天一位大侠(貌似叫itelectron)告诉我有些芯片可以把不能直接寻址的nand中的前4k代码拷贝到ram中,让我如梦初醒,又见到了一个美丽新世界。这种做法既免除了地址重映射的麻烦,又可以节省nor或者rom的开销,人才啊!不过这种做法已经不属于arm架构范畴,完全是芯片厂商的自由发挥。

使用特权

评论回复
6
itelectron|  楼主 | 2009-12-8 17:39 | 只看该作者
偶看的例子中基本 是 用MMU 重新 影射的方法!

而前两天一位大侠(貌似叫itelectron)
惭愧 偶脸都红了!

使用特权

评论回复
7
lelee007| | 2009-12-8 18:07 | 只看该作者
很简单啦

我前面做过一个裸奔的调试小平台

中断向量有两个位置可以放,好好看DATASHEET,可以放在起始为0的地方,也可以放在起始为0XFFFF0000的地方,这个配置一下协处理器里边的寄存器的就可以了,然后你可以通过MMU把0XFFFF0000映射到你SDRAM里边指定的地方,然后把VECTOR拷过去就行了

不过最好用二级向量表,实现中断向量的动态配置,不用每次都改向量表本身,只要给指针(指向向量表)赋值(实际中断服务函数名)就O了

今年7月份做的,本来想把一些外设驱动自己加进去,后来没时间就没搞了

使用特权

评论回复
8
lelee007| | 2009-12-8 18:14 | 只看该作者
我作的那个是这样的,程序不分前4K,所有的程序连接在一起(运行地址就一个起始处,后面的都顺序存放、运行),存储和运行地址都是0x30004000,中断向量表有两级,第二级接着第一级放,都在程序最开始出,reset:处放的是直接跳转到汇编代码开始处

K,不想解释了,开个帖子,代码放上来,有兴趣下下去研究,有注释,以前觉得没人需要这东西,只给过几个人看过,而且之前好像确实没人这样搞过

使用特权

评论回复
9
lelee007| | 2009-12-8 18:32 | 只看该作者
10
xinzha| | 2009-12-8 18:36 | 只看该作者
原理是一致的,都是把cpu的寻址指向一个不同的区域。

使用特权

评论回复
11
xinzha| | 2009-12-8 22:06 | 只看该作者
你转的那个介绍MMU的**很不错,是从硬件开发人员的角度去看的mmu。

使用特权

评论回复
12
itelectron|  楼主 | 2009-12-8 22:07 | 只看该作者
wince在异常时选择跳转到高向量地址0xFFFF0000处,此处放了VectorInstr........................
回复于:2009-03-16 18:02:00这个地址确认是:虚拟地址。为此我曾经专门请教过高人,不过到最后我还是没搞懂:-( 囧啊。


http://topic.csdn.net/u/20090316 ... 5-a7caf9ad1753.html

使用特权

评论回复
13
itelectron|  楼主 | 2009-12-8 22:08 | 只看该作者
中断向量有两个位置可以放,好好看DATASHEET,可以放在起始为0的地方,也可以放在起始为0XFFFF0000的地方
偶也感觉  0XFFFF0000 是虚拟地址!

使用特权

评论回复
14
lelee007| | 2009-12-9 08:49 | 只看该作者
就是虚拟地址的哇

不然你连续把0和0XFFFF0000填满,需要4G的SDRAM,再说,2440的SDRAM控制器也不支持这么大的空间

MMU配置一下,映射到当前SDRAM里边的一个页就是了

使用特权

评论回复
15
xinzha| | 2009-12-9 09:33 | 只看该作者
个人感觉不是虚拟地址,因为对于cpu来说,所发出的一切寻址指令都认为是实地址,只是后来经过了MMU,对于软件人员的角度来看产生了虚拟地址一说。
对于ARMv4以下的版本,这个地址固定为0;ARMv4及其以上的版本,ARM异常向量表的地址受协处理器CP15的c1寄存器(control register)中V位(bit[13])的控制,如果V=0,则异常向量表的地址为0x00000000~0x0000001C;如果V=1,则为:0xffff0000~0xffff001C。(详情请参考ARM Architecture Reference Manual)

使用特权

评论回复
16
lelee007| | 2009-12-9 10:02 | 只看该作者
带保护模式的CPU,CPU直接识别的地址,也就是CPU的逻辑地址,这实际上是CPU内部认为是那个地址,而且这个地址也会出现在CPU内部的地址总线

但是这个地址总线与最终访问存储器(SDRAM)的地址总线不是一回事

虚拟是相对最后访问实际的存储器而言,之所以叫虚拟是为了理解方便

虚拟地址在内核情景分析里边有讲,就可以当成逻辑地址,只要与物理地址区分开来就行

使用特权

评论回复
17
xinzha| | 2009-12-9 10:22 | 只看该作者
嗯,这是一个角度问题。不过0xffff0000这个中断地址,在arm v4以上,cp15:c1:v=1,并且没有配置mmu的系统上就是要求真实存在的。当然了,没有mmu是不可能跑起来wince的。

使用特权

评论回复
18
itelectron|  楼主 | 2009-12-9 18:24 | 只看该作者
谢谢 楼上 各位:handshake

使用特权

评论回复
19
五谷道场| | 2009-12-9 19:54 | 只看该作者
感觉说的好高深啊

使用特权

评论回复
20
itelectron|  楼主 | 2009-12-10 07:54 | 只看该作者
LS 去年偶和你有一样感觉:handshake

使用特权

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

本版积分规则

个人签名:MARK: zhi kan ji shu

274

主题

2762

帖子

8

粉丝