Chinaunix首页 | 论坛 | 博客
  • 博客访问: 452024
  • 博文数量: 72
  • 博客积分: 3186
  • 博客等级: 中校
  • 技术积分: 1039
  • 用 户 组: 普通用户
  • 注册时间: 2009-03-07 16:53
文章分类

全部博文(72)

文章存档

2012年(1)

2011年(5)

2010年(10)

2009年(56)

我的朋友

分类: 嵌入式

2009-09-21 19:24:22

在sdram配置好了之后,紧接着可以对sdram进行测试,看sdram读写是否正常。内存的测试是非常重要的,因为如果sdram不能正常工作,那么我们所有的软件几乎都没地方运行了。
回想一下pc机上,bios里面好像也有内存测试的选项。因为内存测试是在系统启动之前检测,它必然会延长系统启动的时间。所以一般pc机上都会关掉这个内存测试。

在vivi中也有sdram测试的相关代码。通过一定的算法,来检测其读写是否正确。在配置vivi的时候,也是可以通过选项来选择是否编译这段代码的。在这里,仅浅析这段代码,看看vivi是如何处理这个过程的。



vivi中将memtest放在UART初始化之后,这主要是想使用串口在终端打印信息,这样给出的提示信息更直观。



memtest:
    mov r10, lr @ 保存返回地址

    @ print prompt information 打印信息“MTST ”
    ldr r1, SerBase
    mov r0, #'M'
    bl PrintChar
    mov r0, #'T'
    bl PrintChar
    mov r0, #'S'
    bl PrintChar
    mov r0, #'T'
    bl PrintChar
    mov r0, #' '
    bl PrintChar

    @ check the first 1MB in increments of 4k ,检查sdram开头的1M。每4k检测一次
    mov r7, #0x1000 @ 4k
    mov r6, r7, lsl #8 @ 1M
    mov r5, #DRAM_BASE @ 0x30000000

mem_test_loop:
    mov r0, r5
    bl testram_nostack @每4k检测这一次
    teq r0, #1
    beq badram @ 有错误

    add r5, r5, r7 @暂时无错误则继续下4k的检测,直到检测完1M
    subs r6, r6, r7
    bne mem_test_loop

    @ the first magabyte is OK. clear it
    @ 程序走到这里,说明前1M检测完毕,且无错误。
    mov r0, #((1024 * 1024) / (8 * 4))
    mov r1, #DRAM_BASE
    mov r2, #0
    mov r3, #0
    mov r4, #0
    mov r5, #0
    mov r6, #0
    mov r7, #0
    mov r8, #0
    mov r9, #0

clear_loop_memtest:
    stmia r1!, {r2-r9}
    subs r0, r0, #(8 * 4)
    bne clear_loop_memtest

    ldr r0, STR_OK
    ldr r1, SerBase
    bl     PrintWord

    mov pc, r10

badram:
    ldr r0, STR_FAIL
    ldr r1, SerBase
    bl PrintWord
    b .

testram_nostack:
@ 这里用到的算法很简单,步骤如下:
@ 1. 存储4k中的前两个字的值。(检测是以4k为单位的,每4k只测试前两个字是否能正确读写)
@ 2. 向第一个字中写0x55(0x01010101),向第二个字中写0xaa(0x10101010)。其特点都是10交错的。
@ 3. 立即读出刚刚写入的值,判断读出值是否与写入值相等?
@ 4. 根据上一步的结果,在r0中置标志位。
    ldmia r0, {r1, r2}
    mov r3, #0x55
    mov r4, #0xaa
    stmia r0, {r3, r4}
    ldmia r0, {r3, r4}
    teq r3, #0x55
    teqeq r4, #0xaa
    bne bad
    mov r3, #0xaa
    mov r4, #0x55
    stmia r0, {r3, r4}
    ldmia r0, {r3, r4}
    teq r3, #0xaa
    teqeq r4, #0x55
bad:
    stmia r0, {r1, r2}
    moveq r0, #0
    movne r0, #1

    mov pc, lr
@----------------------------------------------- End of memtest ------------------------------------


上面用红色高亮的部分,是在对一段内存清0.对于这一段,我有个疑问:
    mov r0, #((1024 * 1024) / (8 * 4)) 这里首先给r0赋值。即 r0 = 1M / 32
下面:
    subs r0, r0, #(8 * 4)  这里的目的是用来控制循环的次数。
因为之前都是在对前1M操作。那么这部分要对前1M清0吧。
1. 我觉得即使不清0,应该也没有影响。因为在检测过程的最后已经恢复了ram里原来的值stmia r0, {r1, r2}
2. 这里清0的次数。应该是 1M / (8 * 4) 次,那么后面的subs r0, r0, #(8 * 4) 为什么又减(8 * 4) 呢?为什么不是减 1 呢?

已经想了好一会了,暂时思维可能已经定式了。先记录下来。




阅读(1231) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2010-10-09 15:07:39

subs r0, r0, #(8 * 4) 为什么又减(8 * 4) 呢?为什么不是减 1 呢? 是的,vivi中有很多这样的问题,如nand 检测部分: @ verify mov r0, #0 ldr r1, =0x33f00000 mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes go_next: ldr r3, [r0], #4 ldr r4, [r1], #4 teq r3, r4 @比较数据 bne notmatch subs r2, r2, #4 最后一句,我也感觉有问题??? 我的QQ851592147,望一起交流下

chinaunix网友2010-10-09 14:27:16

上面红的,不要也不要紧,