14172|92

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

2440 eboot 中断向量表 问题,请高手帮忙解答 [复制链接]

问题:想在Eboot里响应中断,现在中断无响应
我是这样设置中断向量的
#define pISR                (*(unsigned *)(0x30000000+0x18))
0x30000000换成过0x00000000,0x8C000000,都没作用
pISR =(unsigned)(0xEA000000)+(((unsigned)IsrHandler - (0x8C000000 + 0x18 + 0x8) )>>2);
0x8C000000换成过0x80000000,也是没作用

我在eboot里打印了
for(i=0;i<10000;i++)
{
RETAILMSG(1, (TEXT("a %x\r\n"),         (*(unsigned *)(0x00000000+i*4))));
RETAILMSG(1, (TEXT("b %x\r\n"),         (*(unsigned *)(0x30000000+i*4))));
RETAILMSG(1, (TEXT("c %x\r\n"),         (*(unsigned *)(0x8c000000+i*4))));
RETAILMSG(1, (TEXT("d %x\r\n"),         (*(unsigned *)(0x8c038000+i*4))));
}

其中a,b,c全是0,也就是说从0x00000000,0x30000000,0x8c000000三个虚拟地址起始的2500个地址的值都是0
只有d不是0,而且发现了连续的0xEAXXXXXX的值,0x8c038000是我的eboot的起始虚拟地址


arm的中断向量表不是应该在0x00000000+0x18的地方吗,请问我该怎么确定Eboot中的物理地址0对应的虚拟地址呢?
eboot有可能会把中断向量表放在0x8c038000里面吗?因为我在0x8c038000之后的地址的数值中发现了跳转指令
EA00002A
EAFFFFFD
EAFFFFFC
EAFFFFFB
EAFFFFFA
EAFFFFF9
EAFFFFF8
连续的8个EA开头的数值,难道我的
#define pISR 应该指向数值为EAFFFFF9的地址??

最新回复

的确是。呵呵。  详情 回复 发表于 2010-5-5 10:55
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
急,在线等,盼高手解答,分不够我再加
eboot的虚拟地址到物理地址的映射是需要看mmu.s里的代码吗?我是Wince4.2带的eboot
启动从nand flash开始,采用了nboot+eboot的方式,也就是nand flash的前4k是nboot
我要是访问对了物理地址0x00000000,读出来的数值应该是和nboot.bin文件是一样的吧
怎么确定这个0x0的物理地址对应的虚拟地址啊,郁闷一上午了,改来改去怎么也不好使,麻烦大家了,帮个忙吧
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
我不懂中断,但是感觉你问的有问题, nandflash有对应的虚拟地址吗?我只知道RAM 0x300000000 对应0x8C000000
那么mini2440的nand flash是用那个片选信号?




也就是说,选用了那个nGCS为片选就意味着以这个片选对应的起始地址作为基地址供系统访问,nandflash不是内存器件,你的这个原理图中没有把nandflash的单元直接映射到系统内存中,而是作为io器件由2440的nandlfash控制器来控制,所以这里的片选信号不是由某个nGCS来充当,而是由2440的nandflash控制器的片选引脚充当。你去看看2440的datasheet就知道了


这是mini2440 初学者嵌入式入门里 的一个问题解答。


 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
感谢lyx_wq的回答

我认为是这样的,2440从nand flash启动时,会拷贝flash前4k内容到cpu内部的一个steppingstone的sram里面
这时steppingstone被映射到物理地址0x0上,2440的手册上MEMORY CONTROLLER一节也是这样画的图
我说的去读取物理地址0x0不是说去读取nand flash,而是去读取steppingstone,因为steppingstone被映射到了0x0

nboot.bin的二进制文件的前32个字节应该就是中断向量表的配置,nboot被拷贝到物理地址的0x0去执行了
所以我觉得我去读0x0,只要读取正确了,应该会和nboot.bin里面的内容是一样的

我的eboot启动之后,在初始化mmu时把虚拟地址0x8c000000对应到了物理地址0x30000000,也就是sdram的起始地址
但是我没法确定,eboot把物理地址0x0被对应到了哪个虚拟地址

这块一直很糊涂,也不知道自己理解的对不对,希望高手出来帮忙确认一下
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
DCD 0x80000000, 0x00000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 0

    DCD 0x82000000, 0x08000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 1

    DCD 0x84000000, 0x10000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 2

    DCD 0x86000000, 0x18000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 3

    DCD 0x88000000, 0x20000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 4

    DCD 0x8A000000, 0x28000000, 32 ; 32 MB SROM(SRAM/ROM) BANK 5

    DCD 0x8C000000, 0x30000000, 64 ; 64 MB DRAM BANK 0

    DCD 0x90800000, 0x48000000, 1 ; Memory control register

    DCD 0x90900000, 0x49000000, 1 ; USB Host register
应该在

    DCD 0x90A00000, 0x4A000000, 1 ; Interrupt Control register

    DCD 0x90B00000, 0x4B000000, 1 ; DMA control register

    DCD 0x90C00000, 0x4C000000, 1 ; Clock & Power register

    DCD 0x90D00000, 0x4D000000, 1 ; LCD control register

    DCD 0x90E00000, 0x4E000000, 1 ; NAND flash control register

    DCD 0x91000000, 0x50000000, 1 ; UART control register

    DCD 0x91100000, 0x51000000, 1 ; PWM timer register

    DCD 0x91200000, 0x52000000, 1 ; USB device register

    DCD 0x91300000, 0x53000000, 1 ; Watchdog Timer register

    DCD 0x91400000, 0x54000000, 1 ; IIC control register

    DCD 0x91500000, 0x55000000, 1 ; IIS control register

    DCD 0x91600000, 0x56000000, 1 ; I/O Port register

    DCD 0x91700000, 0x57000000, 1 ; RTC control register

    DCD 0x91800000, 0x58000000, 1 ; A/D convert register

    DCD 0x91900000, 0x59000000, 1 ; SPI register

    DCD 0x91A00000, 0x5A000000, 1 ; SD Interface register

    DCD 0x00000000, 0x00000000, 0 ; End of Table (MB MUST BE ZERO!)

    END
应该是0x80000000吧,自己理解,不能确定哦!
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
boot中不是用查询吗
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
lyx_wq兄弟,你贴的是nk的地址映射吧,我说的是eboot的地址映射,这时候还没启动nk呢,也用不上你贴的这个表

wangxin说说你的看法,怎么查询??

我又试了一下午了,还是不好使,高手都不在eeworld了?去哪能问啊?给指条明路也行,别的论坛能帮忙回答问题的,我也回来给分

 
 
 

回复

1

帖子

0

TA的资源

禁止访问

8
 
提示: 作者被禁止或删除 内容自动屏蔽
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

9
 
http://efly.seaskyer.net/article.asp?id=2
这个网页有这样几句:
1)eboot和nk公用一段起始代码fw.s,所以我们会在eboot文件夹下的arm子文件夹找到fw.s,里面就一句话: INCLUDE ..\\\\..\\\\kernel\\\\hal\\\\arm\\\\fw.s,对于这段起始代码我就不详细分析,无非是建立好中断向量表,设置好系统的工作频率,设置MMU等,然后就跳转到eboot的main函数
……

除了按照OEMAddressTable进行内存空间影射外,还可以要根据程序需求进行其他一系列影射,通常的做法都是将目前所有的设备/内存在原地址空间上再影射一次,以方便使用。另外就是在将0x0位置影射到内存,这样,就可以通过这个部分来进行中短向量的安装了,以实现中断服务程序。(以上内存影射并不是必须的,仅仅是为了方便程序的编写而已,使用和系统相同的影射表可以使得不必重新另外建一套头文件,同时如果需要的话可以一直在内存中保存eboot,这样内存空间的规划也会相对容易做一些)。
以上的这些工作做完,就进入windowsCE提供的eboot入口函数了。也就是BootloaderMain。

照他的意思应该就是那个表啊
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 
我原本也是这么以为的,可是按照表里的地址对应关系,我的是
DCD 0x92000000, 0x00000000, 64  ; 32 MB SROM(SRAM/ROM) BANK 0
读出来倒是真像是中断向量表,但是写入跳转地址也是没反应,中断不触发
再加上网上很多人的日志都写的是0x30000000或0x00000000对应的物理地址0x0
我就猜测,会不会eboot有自己特殊设置的地方

非常感谢lyx_wq兄弟,我加班了,再试试
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
lyx_wq说的应该是正确的,我从0x92000000读取出来的数值跟nboot.bin是一样的
说明中断向量表就应该在这里,但是我向0x92000000+0x18写入跳转地址
(unsigned)(0xEA000000)+(((unsigned)IsrHandler - (0x8C000000 + 0x18 + 0x8) )>>2)
中断就是没触发,难道是IsrHandler的汇编代码有问题?谁能帮忙确定一下我写入的地址是否正确啊,我感觉应该是正确的,可是就是没效果,唉~
周六继续加班搞
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
很长,我只能提醒的是MMU映射要正确,不然就找不到地址去执行指令了。
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

13
 
arm的中断向量表不是应该在0x00000000+0x18的地方吗,
——经过映射他就不是这个地址了,而是对应的虚拟地址吧。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
我写的是有点啰嗦,怕描述不清除问题

那eboot是跟nk用的一样的地址映射吗?
如果是的话虚拟地址0x92000000现在就应该对到物理地址0x0上了
我用读0x92000000的方法看,应该就是nboot.bin的内容

现在就是想找个人根据我的描述确定一下
我代码里写的虚拟地址0x92000000是否正确对应到了物理地址0x0上了
地址正确了,我再去改IsrHandler
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

15
 
谢谢gooogleman大周末还折腾你上来回答问题,呵呵,跑去it168问了一下,同样没人搭理,难道是我问得太没技巧了?问题还是没解决,痛苦ing
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 14 楼 yangyong9608 的回复:
谢谢gooogleman大周末还折腾你上来回答问题,呵呵,跑去it168问了一下,同样没人搭理,难道是我问得太没技巧了?问题还是没解决,痛苦ing


还没有搞定吗?
帮你看看。
由于我不使用eboot 的
不过我觉得和ADS 还是类似的。
前面有人发过类似的帖子的。不知道你是否注意到了。
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

17
 
1. EBoot/NK 用的 OEMAddressTable 通常是同一个.

2. ARM execption handler 可以在 0x00000000, 亦可在 0xFFFF0000, 2440 EBoot 应是放在 Virtual Address 的 0x00000000 吧.

3. EBoot 在建立 MMU table 的程式码中, 应有一段将 PA=0x30000000 re-mapping to VA=0x00000000.

4. 这段 CODE, Samsung 应已写好了, LZ 没事去改它做啥.

Paul, Chao @ Techware
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

18
 
#define pISR                (*(unsigned *)(0x30000000+0x18))
// Virtual Address 0x0 is mapped to 0x30000000, ISR Address is VA 0x18
我的内存起始物理地址是0x30000000的
// make value to assemble code "b IsrHandler"
pISR =(unsigned)(0xEA000000)+(((unsigned)IsrHandler - (0x80000000 + 0x18 + 0x8) )>>2);

和ADS的写法有点不一样哦。

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

19
 
感谢Paul, Chao gooogleman两位高手关注,我的问题还是没解决,再帮我一把行吗?在线等二位

我没改过我的映射代码,mmu.s里还是下面这样的代码
; setup mmu to map (VA == 0) to (PA == 0x30000000)

    ldr r0, =PTs        ; PTE entry for VA = 0
    ldr r1, =0x3000040E     ; uncache/unbuffer/rw, PA base == 0x30000000
    str r1, [r0]

根据两位的意思

中断向量表应该在sdram的起始位置?
而虚拟地址0x00000000被映射到物理地址0x30000000,所以在虚拟地址0x00000000,而不是物理地址0x00000000?

我以为eboot是按照我4.2的bsp里一个map.a的文件来做地址映射的,上面写着
DCD 0x92000000, 0x00000000, 64
DCD 0x8C000000, 0x30000000, 64
那这个map.a里的映射是做什么呢?0x8C000000也是映射到物理地址0x30000000,跟(VA == 0) to (PA == 0x30000000)一样吗?



 
 
 

回复

3

帖子

0

TA的资源

一粒金砂(初级)

20
 
googleman兄弟,我也搜索过类似的文章,可他写得有问题啊

“#define pISR (*(unsigned *)(0x30000000+0x18))
// Virtual Address 0x0 is mapped to 0x30000000, ISR Address is VA 0x18
我的内存起始物理地址是0x30000000的”

内存物理地址是0x30000000,可是Eboot不是用虚拟地址吗?
#define pISR (*(unsigned *)(0x30000000+0x18))里面的0x30000000是物理地址还是虚拟地址呢?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表