摘 要: 在大部分嵌入式系统中,内存的好坏主要依赖于内存芯片厂家的检测,对系统运行中出现的内存偶然故障,缺乏有效的检测手段。对嵌入式系统中内存检测的各个阶段、内存检测方式以及全空间检测方法等进行了详细描述。
关键词: 嵌入式系统;内存检测
嵌入式系统中内存芯片种类繁多,其访问方式、时序要求和初始配置并不完全相同,不同芯片的稳定工作温度等也不一样,甚至同型号不同批次的芯片的特性还不一样。这导致嵌入式系统开发者在内存芯片的兼容性开发、生产检测和运行时监测上需要耗费很多的精力。内存问题小则影响到业务功能,大则影响到系统运行,如何提供一套完整的内存检测手段,及时甄别出坏的内存非常重要,本文就对嵌入式系统的内存检测做一些探讨。
1 典型的嵌入式系统
典型的嵌入式系统框图如图1所示。图1中的BOOT Flash用于存放BOOT版本,BOOT版本实现嵌入式系统的基本初始化,并实现业务版本的加载;Version Flash用来存放业务版本;SDRAM/DDR作为BOOT版本、业务版本运行时使用的内存,也是本文描述的检测对象。网口、串口用来作为版本加载、调试通道、管理通道等;其他接口和设备根据具体的嵌入式系统应用而不同,如交换芯片、显示控制芯片和FPGA等。
2 内存的检测场景
嵌入式设备的内存检测可以存在于以下几个阶段:
(1)生产中检测:在出厂前进行检测,包括数据线、地址线测试,基本读写测试,强化测试,高低温测试等,生产中的检测本文不做深入描述;
(2)上电自检:在嵌入式系统上电过程中,各种业务还未正式启动,对内存的检测可以比较全面;
(3)运行中检测:业务正常运行起来后,内存已在使用中,只能对未使用的内存空间做例行检测。
对内存的上电自检及运行中检测,都是处在实际应用环境中,本文重点描述这部分检测的实现。
3 内存检测方案
在业务运行阶段,内存已被部分使用,这个时候无法检测到整个内存空间的好坏,为了使内存在应用环境能做到完整检测,需要利用BOOT阶段协助检测内存。
首先有必要了解嵌入式系统的BOOT过程,如图2所示。
BOOT代码存在BOOT Flash中,一般分为BootCode1和BootCode2两部分。BootCode1在BOOT Flash中直接运行,完成内存的基本初始化、拷贝BootCode2到内存运行。BootCode2也可能压缩过,这种情况下,BootCode1运行时还必须先解压BootCode2再拷贝至内存。BootCode2承担了网口初始化、下载业务版本的功能。
在业务版本Version起来后,运行它所占用的内存无法测试到,本文考虑在BOOT阶段对这块区域进行测试。而当Version运行起来后,就可以对未使用的空间作常规测试,包括原来BootCode2所在的空间(因为Version起来后,BootCode2代码已没有意义)。
具体的测试方案为:
(1)采用一片EEPROM记录内存测试结果、测试要求等;
(2)BOOT阶段根据EEPROM中的测试要求进行内存检测,再将结果写入EEPROM中;
(3)业务版本运行阶段,可以读出BOOT阶段的内存检测结果,如果异常可产生告警等;
(4)后台服务器以及业务版本可以设置内存检测类型,确定是做简单测试还是复杂测试,并写入EEPROM,以指导下次BOOT选择合适的内存检测类型。
详细的测试流程如图3所示。
(1)BootCode1拷贝BootCode2到内存之后,会进行版本校验,判断BootCode2的正确性,间接检测了BootCode2运行的内存空间,确保BootCode2能够正常运行,如果出错,可通过指示灯等告警,提示用户检查硬件。
(2)BootCode2正常运行后,从EEPROM中读取内存检测标志,确定做简单内存测试,还是强化内存测试(嵌入式系统对上电时间有严格要求,为保证迅速启动,一般采用简单内存测试)。
(3)BootCode2检测到错误,可通过指示灯等告警,并将检测结果写入EEPROM,业务版本初始化期间可读出该结果,如果有错,不会继续往下执行,直接告警。
(4)业务版本能正常起来的情况下,可以对空余内存做检测。
(5)在业务版本运行中,可以根据需要设置内存强化检测,会填写检测标志到EEPROM中,并重启系统,触发BOOT中进行内存全检,并将检测结果反馈给后台服务器。对EEPROM里数据格式定义如图4所示。
4 具体测试类型分析
内存检测的具体类型主要考虑如下几种:
(1)基本的数据线、地址线测试。对某几个特定地址读写特定数据,这种检测方式速度快,适用于常规测试,可在系统默认情况下执行。
(2)跳检测试。比如每1 KB区间检测4 B,采用特征数据进行读写测试,特征数据如0x00000000、0xFFFFFFFF、0x55555555、0xaaaaaaaa等。
(3)强化测试。借鉴开源测试方法memtest86+,利用各种算法进行内存的全方位测试,这种测试耗时长,根据CPU频率不同,内存大小不同,测试时间可能以小时计,这种测试只在首次使用时,或者作设备巡检时选择执行。
对内存检测结果的分析,可以用来筛选内存芯片,指导内存芯片的选型,判断哪些批次的好坏。可以在检测结果里增加内存型号记录、检测当时的环境温度等,作进一步的分析,可以更好的协助芯片选型、批次分析及设计改进。
参考文献
[1] Wind River. Tornado BSP Training Workshop[Z]. 1998.
[2] http://www.memtest.org/,2012-05-01.