在微控制器上高速测试 sram 的软件算法
Software algorithm to test sram on microcontroller at high speed
我有一个带有外部 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 芯片的最佳方法是什么?
有很多 'on the fly' RAM 测试可用。它们必须用于安全系统。就问 google.
第一个文档是 here or here
RAM 测试的重复次数取决于您要检查的内容以及您在产品生命周期中检查的时间。
如果您正在检查生产线的输出,您可以重复测试"for ever"以检查不同的环境条件(例如温度)。但是对于大多数情况,一个 运行 就足够了。
如果你想测试一个特定的板,你也可以测试"for ever"直到你关机。这也有助于用示波器探测接线。
如果您想在现场测试运行应用软件,您可以使用高优先级定时器中断一次测试一个字节。这 运行s "for ever" 当然也是。并确保您的测试恢复了旧值。
但首先你必须决定要查找的错误类型:
- 硬件错误,例如线路开路或短路。这是很有可能的。
- 硬件错误,如部分损坏的 RAM。我从来没有这些。我测试的 RAM 工作完美或根本不工作,抛开错误的访问周期等错误。
对于第一种,我会这样测试:
- 将只有一个 1 位的所有 8 个模式写入任何地址(数据 0x01 ... 0x80)
- 将只有一个 0 位的所有 8 个模式写入任何地址(数据 0xFE ... 0x7F)
- 将不同的模式(如递增数字)写入所有 0 位的地址和所有(最多 16 个)只有一个 1 位的地址(地址 0x0000、0x0001 ... 0x8000)
- 检查地址的模式
- 将不同的模式(如递增数字)写入所有 1 位的地址和所有(最多 16 个)只有一个 0 位的地址(地址 0xFFFF、0xFFFE ... 0x7FFF)
- 检查地址的模式
如果检查失败,您可以中止测试循环并报告错误。测试的数据位或地址位为实际错误提供了一些提示。如果你喜欢探测接线,请报告并继续。
这真的很快并且揭示了许多永久性错误。对于瞬态错误,您需要重复测试。
对于 second 类型,您需要更复杂的测试。其中一些取决于 RAM 中的 real 物理组织,涉及位的行和列。您可能想在网络上搜索 "factory RAM tests",例如 "galloping patterns" ("galpat")。
不幸的是,正如您所注意到的,这些测试需要很长时间。但恐怕没有办法。
一个非常简单的测试会将伪随机数序列写入RAM,然后检查序列。确保您的数字生成器生成的句点至少与 RAM 的大小一样长,例如使用足够宽的数字。但是,您将只使用它的低 8 位。您可以使用 LFSR.
我有一个带有外部 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 芯片的最佳方法是什么?
有很多 'on the fly' RAM 测试可用。它们必须用于安全系统。就问 google.
第一个文档是 here or here
RAM 测试的重复次数取决于您要检查的内容以及您在产品生命周期中检查的时间。
如果您正在检查生产线的输出,您可以重复测试"for ever"以检查不同的环境条件(例如温度)。但是对于大多数情况,一个 运行 就足够了。
如果你想测试一个特定的板,你也可以测试"for ever"直到你关机。这也有助于用示波器探测接线。
如果您想在现场测试运行应用软件,您可以使用高优先级定时器中断一次测试一个字节。这 运行s "for ever" 当然也是。并确保您的测试恢复了旧值。
但首先你必须决定要查找的错误类型:
- 硬件错误,例如线路开路或短路。这是很有可能的。
- 硬件错误,如部分损坏的 RAM。我从来没有这些。我测试的 RAM 工作完美或根本不工作,抛开错误的访问周期等错误。
对于第一种,我会这样测试:
- 将只有一个 1 位的所有 8 个模式写入任何地址(数据 0x01 ... 0x80)
- 将只有一个 0 位的所有 8 个模式写入任何地址(数据 0xFE ... 0x7F)
- 将不同的模式(如递增数字)写入所有 0 位的地址和所有(最多 16 个)只有一个 1 位的地址(地址 0x0000、0x0001 ... 0x8000)
- 检查地址的模式
- 将不同的模式(如递增数字)写入所有 1 位的地址和所有(最多 16 个)只有一个 0 位的地址(地址 0xFFFF、0xFFFE ... 0x7FFF)
- 检查地址的模式
如果检查失败,您可以中止测试循环并报告错误。测试的数据位或地址位为实际错误提供了一些提示。如果你喜欢探测接线,请报告并继续。
这真的很快并且揭示了许多永久性错误。对于瞬态错误,您需要重复测试。
对于 second 类型,您需要更复杂的测试。其中一些取决于 RAM 中的 real 物理组织,涉及位的行和列。您可能想在网络上搜索 "factory RAM tests",例如 "galloping patterns" ("galpat")。
不幸的是,正如您所注意到的,这些测试需要很长时间。但恐怕没有办法。
一个非常简单的测试会将伪随机数序列写入RAM,然后检查序列。确保您的数字生成器生成的句点至少与 RAM 的大小一样长,例如使用足够宽的数字。但是,您将只使用它的低 8 位。您可以使用 LFSR.