2024年5月10日发(作者:)

ROM与RAM测试方法

在硬件系统出厂前要进行产品测试,在嵌入式系统工作之前,一般也要进行自检,其

中ROM和RAM检测必不可少,可是有不少人对于测试目的、原因和方法存在错误理解。

为什么要测试ROM和RAM, 怎么测试呢?普遍的看法是:由于担心ROM和RAM芯

片损坏,在出厂和使用前应该校验这两种芯片的好坏。测试RAM的方法是写读各个内存

单元,检查是否能够正确写入;测试ROM的方法是累加各存储单元数值并与校验和比较。

这种认识不能说错,但有些肤浅,照此编出的测试程序不完备。一般来说,ROM和RAM

芯片本身不大会被损坏,用到次品的概率也比较小,真正出问题的,大都是其他硬件部分,

因此,测试ROM和RAM往往是醉翁之意不在酒。

 ROM测试

测试ROM的真正目的是保证程序完整性。嵌入式软件和启动代码存放在ROM里,

不能保证长期稳定可靠,因为硬件注定是不可靠的。以flash ROM为例,它会由于以下两

种主要原因导致程序挥发:

➢ 受到辐射。本身工作在辐射环境里/运输过程中受到辐射(如过海关时被X光机检

查)。

➢ 长时间存放导致存储失效,某些0、1位自行翻转。

无论如何,在硬件上存放的程序都是不可靠的。如果完全不能运行,那到也不会造成

太大的损失。怕就怕程序可以运行,但某些关键数据/关键代码段被破坏,引发致命错误。

为此,必须在程序正常工作前,在软件层面上保证所运行的程序100%没有被破坏,保证

现在要运行的程序就是当初写入的。保证程序完整性的方法很多,例如对全部程序进行CRC

校验(-16和-32)/累加和校验(移位累加),只要能在数学上确保出错概率极低,工程上就可

以认为程序完整。程序完整性测试通过,捎带着也就证明了ROM没有被损坏。即测试ROM

是否损坏只是测试的副产品,不是主要目的。

 RAM测试

测试RAM的真正目的是保证硬件系统的可靠性。大部分问题却可以通过RAM测试

反映出来,仔细想想,当硬件被生产出来/被插到背板上究竟会发生什么错误呢!是不是感

到自己做的板子出问题的可能性更大!请考虑如下几点:

➢ 生产工艺不过关,过孔打歪了,与临近信号线距离不满足线规甚至打在了线上。

➢ 由于搭锡引起的信号线粘连。

➢ 虚焊/漏焊引起的接触不良。

➢ 不按规程操作,把手印儿印在了高频线上。

➢ 板子脏了也不吹,覆盖了一层灰尘(内含金属微粒)。

这些现象比较有趣,试举几例:

✓ 地址线A0和A1粘连。读出XXX00、XXX01、XXX10三个字节的数据完全一样。

✓ 数据线D0和D1粘连。D0和D1只要有一个为0,那么两条线都为0。

✓ 接触不良。时好时坏。

✓ 器件表面处理不干净,有助焊剂残留。低速访问正常,大负荷高速访问频繁死机。

总之,我们做的板子在生产中和使用中都会有出错机会,所以出厂前必须测试,使用

前必须自检。如何测试RAM呢?写一个数然后读出来判断显然测不出所有问题,单个测

试数据不易覆盖全部测试内容,更不用说定位错误原因了(RAM坏、地址/数据线粘连、接

触不良)。好的测试应尽可能测出粘连、RAM坏、单板高频特性。

 测试地址线

1. '0'滑动,随机选择一个数如55、AA之类,依次写到FEH、FDH、FBH、F7H、EFH、

DFH、BFH、7FH地址单元里去,把地址写成二进制数,可以看到比特0在地址总线上从

低到高滑动,谓之'0'滑动。目的是测试这些地址线在依次变0时是否稳定正常。当每一根

线由1变0,会产生下冲,如果下冲控制不好,在高频时会引起错误。单板上地址线不一

定一样长,下冲也就不会完全一样,因此,每一根线都单独测一下下冲性能。

2. '1'滑动,随机选择一个数如55、AA之类,依次写到1H、2H、4H、8H、10H、

20H、40H、80H地址单元里去,把地址写成二进制数,可以看到比特1在地址总线上从

低到高滑动,谓之'1'滑动。目的是测试这些地址线在依次变1时是否稳定正常。当每一根

线由0变1,会产生上冲,如果上冲控制不好,在高频时会引起错误。单板上地址线不一

定一样长,上冲也就不会完全一样,因此,每一根线都单独测一下上冲性能。上冲和下冲

是不同的指标,要分别测一下。

3. "全0变全1",随机选择一个数如55、AA之类,写到FFH单元,再写到00H单

元,然后写到FFH单元。把地址写成二进制数,可以看到地址线从全'0'变到全'1'。由信号

处理理论知,在电压阶跃跳变时包含无限宽频谱,其中高频部分对外产生辐射,这些辐射

信号是干扰源,对临近线路产生较大影响。地址线一般集束布线,同时跳变会引起最大干

扰。地址线从全'0'变到全'1',干扰、上冲、扇出电流影响最大。

4. "全1变全0",紧接上一步,随机选择一个数如55、AA之类,写到00H单元。把

地址写成二进制数,可以看到地址线从全'1'变到全'0',产生最大下冲干扰。

5. "粘连测试"。依次向不同地址单元写入不同数据并读出判断,如:1、2、3、4......

此步骤捎带测试了RAM好坏。注意,千万别用相同数据测试,否则测不出粘连。

6. 可选"全0全1连续高速变化"。目的是模拟最恶劣情况(大扇出电流、强干扰、上/

下冲)。

 测试数据线(原理与测试地址线相同,1、2两步顺带测试了数据线粘连)

1. '0'滑动,向某一固定地址依次写入FEH、FDH、FBH、F7H、EFH、DFH、BFH、

7FH并读出判断。

2. '1'滑动,向某一固定地址依次写入1H、2H、4H、8H、10H、20H、40H、80H

并读出判断。

3. "全0变全1",所有单元置1(先清零再置1并读出判断)。

4. "全1变全0",所有单元清零(清零并读出判断)。

5. 可选"全0全1连续高速变化"。向某一单元高速交替写入若干全'0'和全'1',最后以

全'0'结束。

至此,RAM测试完毕,同时全部存储单元清零。

对于出厂检测程序,有较大发挥余地,如可以加入错误定位代码,自动指出错误原因

和错误位置。每一块单板的高频特性都会因为生产工艺误差(制板、材料、焊接、组装等)

和使用情况而各不相同。同一块板子的高频特性在不同情况下表现也不相同。

综上所述,除了测试RAM好坏,大部分代码测的是单板硬件可靠性。如果不关心高

频特性,用原来的测试方法就差不多了(如果测试数据没选好,可能测不出数据线粘连),

但应该认识到,测试RAM的主要对象不是RAM本身的好坏,而是连接RAM的单板硬件

和线路。

 源程序(伪代码)

//TEST ROM

TestROM()

{//用移位累加和校验

sum=0;

for(i=0;i

sum=sum+ram[i];

sum=sum>>1;

}

if(sum==CHECKSUM) printf("ROM test OK!n");

else printf("ROM test ERROR!n");

}

//TEST RAM

TestRAM()

{

//地址线测试

'0'滑动;

'1'滑动;

"全0变全1";

"全1变全0";

"粘连测试";

可选"全0全1连续高速变化";

//数据线测试

'0'滑动;

'1'滑动;

"全0变全1";

"全1变全0";

可选"全0全1连续高速变化"

}