【问题标题】:Software algorithm to test sram on microcontroller at high speed在微控制器上高速测试 SRAM 的软件算法
【发布时间】: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


【解决方案1】:

有很多“即时”RAM 测试可用。它们必须用于安全系统。问问谷歌就行了。
第一个文档是herehere

【讨论】:

    【解决方案2】:

    RAM 测试的重复次数取决于您要检查的内容以及您在产品生命周期中检查的时间。

    如果您正在检查生产线的输出,您可以“永远”重复测试以检查不同环境条件(如温度)下的情况。但大多数情况下一次运行就足够了。

    如果您想测试一个特定的板,您也可以“永远”测试,直到您关闭。这也有助于用示波器探测接线。

    如果您想在运行应用软件时现场测试,您可以使用高优先级定时器中断一次测试一个字节。当然,这也“永远”运行。并确保您的测试恢复旧值。

    但首先您必须确定要查找的错误类型:

    1. 硬件错误,例如接线中的开路或短路。这是完全可能的。
    2. 硬件错误,如部分损坏的 RAM。我从来没有这些。我测试的 RAM 可以正常工作或根本不能正常工作,抛开诸如错误访问周期之类的错误。

    对于第一种,我会这样测试:

    1. 在任何地址(数据 0x01 ... 0x80)中写入并检查所有 8 个模式,其中只有一个 1 位(数据 0x01 ... 0x80)
    2. 将只有一个 0 位的所有 8 个模式写入并检查到任何地址(数据 0xFE ... 0x7F)
    3. 将不同的模式(如递增数字)写入全为 0 位的地址和所有(最多 16 个)只有一个 1 位的地址(地址 0x0000、0x0001 ... 0x8000)
    4. 检查地址的模式
    5. 将不同的模式(如递增数字)写入所有 1 位的地址和所有(最多 16 个)只有一个 0 位的地址(地址 0xFFFF、0xFFFE ... 0x7FFF)
    6. 检查地址的模式

    如果检查失败,您可以中止测试循环并报告错误。测试的数据位或地址位为实际错误提供了一些提示。如果您想探测接线,只需报告并继续。

    这真的很快,并且揭示了许多永久性错误。对于暂时性错误,您需要重复测试。

    对于第二种,您需要更复杂的测试。其中一些取决于 RAM 中的真实物理组织,涉及位的行和列。您可能想在网上搜索“工厂 RAM 测试”,例如“galloping patterns”(“galpat”)。

    不幸的是,正如您所注意到的,这些测试需要很长时间。但是恐怕没有办法了。

    一个非常简单的测试会将一系列伪随机数写入 RAM,然后检查该序列。确保您的数字生成器产生的周期至少与 RAM 的大小一样长,例如使用足够宽的数字。但是,您将只使用它的低 8 位。你可以使用LFSR

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-30
      • 1970-01-01
      • 2018-11-11
      • 2011-06-30
      • 1970-01-01
      • 1970-01-01
      • 2017-08-25
      相关资源
      最近更新 更多