?? memtest.c
字號(hào):
#include <reg51.h>
#include <stdio.h>
typedef unsigned char datum;
/***************************** 數(shù)據(jù)總線測(cè)試函數(shù) ***************************
* 函數(shù)原型:datum memTestDataBus(volatile datum xdata * address)
* 功 能: 對(duì)某一固定地址存儲(chǔ)器區(qū)域?qū)懭搿耙苿?dòng)的”1(walking 1’s),
* 存儲(chǔ)器地址由主調(diào)函數(shù)給定。測(cè)試成功返回0,測(cè)試失敗返回寫入值。
*************************************************************************/
datum memTestDataBus(volatile datum xdata * address) {
datum pattern;
for (pattern = 1; pattern != 0; pattern <<= 1) {
/* Write the test pattern */
*address = pattern; /* 寫入測(cè)試值 */
/* Read it back (immediately is okay for this test). */
if (*address != pattern) { /* 如果讀取值與寫入值不相等 */
return (pattern); /* 測(cè)試失敗返回寫入值 */
}
}
return (0); /* 測(cè)試成功返回0 */
}
/***************************** 地址總線測(cè)試函數(shù) **************************** 函數(shù)原型:datum xdata *memTestAddressBus(volatile datum xdata
* baseAddress, unsigned long nBytes)
* 功 能:對(duì)某一段存儲(chǔ)器地址范圍的地址相關(guān)位寫入“移動(dòng)的”1(walking 1’s), * 并檢查是否發(fā)生混淆,測(cè)試中將發(fā)現(xiàn)單個(gè)位地址的錯(cuò)誤,譬如“粘滯高、 * 粘滯低”(stuck-high、stuck-low)以及引腳間短路現(xiàn)象。測(cè)試基地址以 * 及測(cè)試范圍由主調(diào)函數(shù)給定。測(cè)試成功返回 NULL,測(cè)試失敗返回發(fā)生
* 混淆錯(cuò)誤的首地址。
* 注: 為了獲得最好的測(cè)試結(jié)果,測(cè)試基地址低位部分(LSB)應(yīng)有足夠多的的
* 0以保證單個(gè)位地址能夠正確變化,例如要測(cè)試64KB范圍的地址總線,測(cè)
* 試基地址應(yīng)選擇在64KB地址范圍的邊界上,并且應(yīng)盡可能使被測(cè)試的地址
* 范圍為2的整數(shù)次冪。通過(guò)檢查存儲(chǔ)器內(nèi)容可以找出其 它錯(cuò)誤信息。
*************************************************************************/
datum xdata *memTestAddressBus(volatile datum xdata * baseAddress,
unsigned long nBytes) {
unsigned long addressMask=(nBytes-1);
unsigned long offset;
unsigned long testOffset;
datum pattern = (datum) 0xAAAAAAAA;
datum antipattern = (datum) 0x55555555;
/* 對(duì)每個(gè)2的整數(shù)次冪的偏移地址寫入默認(rèn)的測(cè)試數(shù)據(jù) */
for (offset=sizeof(datum); (offset & addressMask)!=0; offset<<= 1) {
baseAddress[offset] = pattern;
}
/* 檢查地址位是否粘滯高 */
testOffset = 0;
baseAddress[testOffset] = antipattern;
for (offset=sizeof(datum); (offset & addressMask)!=0; offset <<= 1) {
if (baseAddress[offset] != pattern) {
return ((datum xdata *) &baseAddress[offset]);
}
}
baseAddress[testOffset] = pattern;
/* 檢查地址位是否粘滯低或發(fā)生短路 */
for (testOffset=sizeof(datum); (testOffset & addressMask)!=0;
testOffset <<= 1) {
baseAddress[testOffset] = antipattern;
for (offset=sizeof(datum); (offset & addressMask)!=0; offset <<= 1) {
if ((baseAddress[offset] != pattern) && (offset != testOffset)) {
return ((datum xdata *) &baseAddress[testOffset]);
}
}
baseAddress[testOffset] = pattern;
}
return (NULL);
}
/******************************* 器件測(cè)試函數(shù) ****************************** 函數(shù)原型:datum xdata *memTestDevice(volatile datum xdata * baseAddress,
* unsigned long nBytes)
* 功 能:通過(guò)對(duì)存儲(chǔ)器器件的整個(gè)地址單元進(jìn)行加1和減1來(lái)測(cè)試其完整性,每一
* 個(gè)存儲(chǔ)位都要進(jìn)行寫0和寫1測(cè)試。測(cè)試基地址以及測(cè)試范圍由主調(diào)函數(shù)
* 給定。測(cè)試成功返回NULL,并且整個(gè)存儲(chǔ)器區(qū)域?qū)⒂?填充。
* 測(cè)試失敗則返回發(fā)生錯(cuò)誤的第一個(gè)存儲(chǔ)器地址。通過(guò)檢查存儲(chǔ)器內(nèi)容可
* 以找出其它錯(cuò)誤信息。
*************************************************************************/
datum xdata *memTestDevice(volatile datum xdata * baseAddress,
unsigned long nBytes) {
unsigned long offset;
unsigned long nWords = nBytes / sizeof(datum);
datum pattern;
datum antipattern;
/* 用已知數(shù)據(jù)填充存儲(chǔ)器單元 */
for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++) {
baseAddress[offset] = pattern;
}
/* 檢查每個(gè)存儲(chǔ)器單元并將其取反 */
for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++) {
if (baseAddress[offset] != pattern) {
return ((datum xdata *) &baseAddress[offset]);
}
antipattern = ~pattern;
baseAddress[offset] = antipattern;
}
/* 檢查每個(gè)存儲(chǔ)器單元并將其清零 */
for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++) {
antipattern = ~pattern;
if (baseAddress[offset] != antipattern) {
return ((datum xdata *) &baseAddress[offset]);
}
baseAddress[offset] = 0;
}
return (NULL);
}
/***************************** 存儲(chǔ)器測(cè)試函數(shù)*****************************
* 函數(shù)原型:memTest()
* 功 能:測(cè)試外部RAM存儲(chǔ)器數(shù)據(jù)總線、地址總線以及RAM器件。
* 測(cè)試成功返回0,測(cè)試失敗返回-1
**************************************************************************/
int memTest(void) {
#define BASE_ADDRESS (volatile datum xdata *) 0x00009000
#define NUM_BYTES 8 * 1024
if ((memTestDataBus(BASE_ADDRESS) != 0) ||
(memTestAddressBus(BASE_ADDRESS, NUM_BYTES) != NULL) ||
(memTestDevice(BASE_ADDRESS, NUM_BYTES) != NULL))
{
return (-1);
}
else
{
return (0);
}
}
void main(void) {
SCON = 0x5a;
TMOD = 0x20;
TCON = 0x69;
TH1 = 0xfd;
if (!memTest()) printf("test t OK\n");
else printf("test fail\n");
while(1);
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -