【发布时间】:2020-01-24 04:02:49
【问题描述】:
我有一个带有外部 RAM 的 8051 微控制器,我想测试该 ram 以查看它是否可以正确存储和加载数据(我认为它目前不能)。
在我的程序中,我将值 80h 写入内存的第一个字节,并且随着每个内存地址的增加,该值会增加,但从第 128 个字节开始,每 256 个字节该值会翻转为零。
这是我的功能:
;extended memory test. C=1=memory fault
memtest:
mov DPTR,#0h
mov R7,#80h
;fill with incrementing values
post1:
mov A,R7
movx @DPTR,A
inc R7
inc DPTR
mov A,DPH
orl A,DPL
jnz post1
;Test for incrementing values
mov DPTR,#0h
mov R7,#80h
post2:
clr C
movx A,@DPTR
subb A,R7
setb C
jnz isbadram
movx @DPTR,A
mov A,R7
inc R7
inc DPTR
mov A,DPH
orl A,DPL
clr C
jnz post2
isbadram:
ret
但我认为我需要进行更严格的测试。我想我需要多次向同一个位置写入和读取不同的值,但我不知道要测试一个位置多少次,也不知道要尝试的最佳值。
我只是担心如果我测试一个位置太多次,那么我的程序会在它开始做任何有用的事情之前永远测试内存。
幸运的是,我拥有一些能够以大约 40nS 的速度执行指令的微控制器。 我有其他同族的指令,每个指令的执行速度大约为 0.5uS。
那么,在不花费太多时间进行测试的情况下,测试系统中已安装的 ram 芯片的最佳方法是什么?
【问题讨论】:
-
据我记得,你需要知道一些关于你的芯片布局和测试模式,如 MARCH、MATS、蝴蝶、棋盘等,并取决于要尝试的故障检测。如果数据存储正确与否,有必要连续执行几个不同的测试以获得良好的假设。
-
不同的测试做不同的事情。数据线,内存中的数据位。地址线,控制信号。为了更快的测试,使用大于 1 的素数来增加。这将更多地测试地址线并更快地通过数据线。如果它是 8 位内存,那么地址线需要更多的工作。取决于您可以通过质数地址位跳转多少地址位,然后在数据上使用非重复模式。
-
我对更广泛记忆的快速而肮脏的最爱,比如 32 位是一个伪随机数,不会在该范围内重复。一次通过,然后使用相同模式的反转,您已将内存中的每个数据位设为 1 或 0,测试了数据线和串扰,以及地址总线测试。又快又脏。为了以防万一,其他较长的测试提供了多种测试,但需要的时间要长得多。
-
在开始内存测试之前,您正在测试什么,通常芯片是预先测试的,是否担心芯片(位于总线两端)是坏的?或者这是一个主要目标是测试 pcb 和焊料的制造测试,只需要运行 I/O 而不是芯片内部。可以显着缩短整体测试时间。
-
如果这是一个调试板设计的事情,那么这是另一回事。是数据吗?是地址吗?是控制吗?这是什么总线,它是 i2c 还是 spi?如果是这样,那么就没有数据、地址或控制,您运行一些事务并在范围内查看它们。
标签: testing memory microcontroller ram 8051