打印

44binit.s这段奇怪的代码,如何解释

[复制链接]
2761|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
mrkingxu|  楼主 | 2009-12-31 11:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
44binit.s这段奇怪的代码,如何解释 大家看看如下,如何解释,而且有这段代码的话,程序会死循环,进不去Main()函数.   

    ;****************************************************
    ;修正内存大小                     *
    ;****************************************************
    mov r0, #0
    ldr r1, =0x0c000000
    ldr r2, =0x0c000200
    str r0, [r1]    ;0 to 0xc000000
    mov r0, #-1
    str r0, [r2]    ; -1 to 0xc000200
    ldr r0, [r1]    ;[r1]=0 to r0
    cmp r0, #0

ldrne r0, =0x01c8001c
ldrne r1, =((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN8))
strne r1, [r0]
strne r1, [r0, #4]

请有这个经历的同行,解释一下.

相关帖子

沙发
Fe_ARM| | 2010-1-1 22:18 | 只看该作者
这是搬运内容,后面的是设置控制寄存器

使用特权

评论回复
板凳
mrkingxu|  楼主 | 2010-1-2 17:31 | 只看该作者
不像是搬运内容,他的注释是"修正内存大小"
它这里完成的是把数据0写入0xc000000
把数据-1写入0xc000200,
然后看0xc000000是否为写入的数据0,如果不是,则要设置GCS6.
但我不知道这段代码有何意义?

使用特权

评论回复
地板
desert_hawk| | 2010-1-2 20:44 | 只看该作者
像是测试外部存储接口上RAM的大小或范围,向0xc0000000写入0,如果读出来是0就说明这个范围有存储器,反之则没有。

使用特权

评论回复
5
xinzha| | 2010-1-2 23:00 | 只看该作者
如果该地址不存在的话,仲裁器很有可能会捅一个data_abort过来,还要看看data_abort异常是怎么处理的。
44b是啥?

使用特权

评论回复
6
desert_hawk| | 2010-1-2 23:18 | 只看该作者
楼主说的应该是s3c44b0,这个芯片是有0xC000000这个地址的,这个代码像是测试芯片的设置与实际连接的存储器是否匹配,应该和data_abort关系不大,即使芯片的设置和存储器不符合,也不会abort,最多是不能正确的读写数据。

使用特权

评论回复
7
xinzha| | 2010-1-2 23:37 | 只看该作者
也就是说即使这个地方没接存储器,译码器依然认为地址有效,只是内存控制器回一个异常的数据而已?
郁闷,找了半天资料,居然没有一个讲44b0的寄存器的。

使用特权

评论回复
8
desert_hawk| | 2010-1-2 23:51 | 只看该作者
应该是的,我刚用2440的板子试了试也确实是这样,在超出2440存储器范围的地址存取数据,仍然能够得到数据,不过都是杂乱无章的,没看出啥规律来。data_abort基本都是依据存取范围来判断的,比如一些reserved的区域或是MMU使能后没有被映射的虚拟地址范围。

使用特权

评论回复
9
desert_hawk| | 2010-1-2 23:55 | 只看该作者
没有44b0的板子,没法试了,不过有个手册。

S3C44B0X.pdf

1.95 MB

使用特权

评论回复
10
xinzha| | 2010-1-3 07:50 | 只看该作者
谢desert_hawk,看了看还是搞不明白为啥会死循环。
如果返回数据是随机的,那么很有可能这段代码不是官方提供的。因为写的不够严谨,既然是随机,那么返回0也是有可能,逻辑上就是错误。而且如果这个时候bank7接了个类型不是B6_MT<<15的存储器并且被用到的话,由于strne r1, [r0, #4]这句话的存在也有可能出问题。
楼主试试只把这句话注掉呢?

使用特权

评论回复
11
desert_hawk| | 2010-1-3 10:21 | 只看该作者
这代码估计不会是官方提供的,通用性不好,倒像是为特定的电路板编写的,板子上的器件变化了,就很可能出现问题。

使用特权

评论回复
12
mrkingxu|  楼主 | 2010-1-3 11:05 | 只看该作者
我在调试这段代码时,如果加了这条代码,程序将不能正确运行。也就是它这段代码会把0xc000000和0xc000200的数据破坏掉了。我也不知道,这块开发板的程序加这段干嘛,是不是在逗我们玩呢。可惜我买的这块S3C440B开发板的厂家倒闭了,不然可以问问他们自己。

使用特权

评论回复
13
xinzha| | 2010-1-3 11:22 | 只看该作者
我在调试这段代码时,如果加了这条代码,程序将不能正确运行。也就是它这段代码会把0xc000000和0xc000200的数据破坏掉了。我也不知道,这块开发板的程序加这段干嘛,是不是在逗我们玩呢。可惜我买的这块S3C440B开发板 ...
mrkingxu 发表于 2010-1-3 11:05

也许是因为这段代码倒闭了...

使用特权

评论回复
14
mrkingxu|  楼主 | 2010-1-6 14:32 | 只看该作者
44binit.s这段奇怪的代码,如何解释 大家看看如下,如何解释,而且有这段代码的话,程序会死循环,进不去Main()函数.   

    ;****************************************************
    ;修正内存大小                 ...
mrkingxu 发表于 2009-12-31 11:17
经过仔细思考,发生这段代码是用来测试SDRAM存储器初始化好了,也就是在准备搬运数据到SDRAM前测试SDRAM,如果不能写,那就再重新初始化一下SDRAM存储器时序.

使用特权

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

本版积分规则

9

主题

13

帖子

0

粉丝