?? memtest.c
字號:
#include <reg51.h>
#include <stdio.h>
typedef unsigned char datum;
/***************************** 數據總線測試函數 ***************************
* 函數原型:datum memTestDataBus(volatile datum xdata * address)
* 功 能: 對某一固定地址存儲器區域寫入“移動的”1(walking 1’s),
* 存儲器地址由主調函數給定。測試成功返回0,測試失敗返回寫入值。
*************************************************************************/
datum memTestDataBus(volatile datum xdata * address) {
datum pattern;
for (pattern = 1; pattern != 0; pattern <<= 1) {
/* Write the test pattern */
*address = pattern; /* 寫入測試值 */
/* Read it back (immediately is okay for this test). */
if (*address != pattern) { /* 如果讀取值與寫入值不相等 */
return (pattern); /* 測試失敗返回寫入值 */
}
}
return (0); /* 測試成功返回0 */
}
/***************************** 地址總線測試函數 **************************** 函數原型:datum xdata *memTestAddressBus(volatile datum xdata
* baseAddress, unsigned long nBytes)
* 功 能:對某一段存儲器地址范圍的地址相關位寫入“移動的”1(walking 1’s), * 并檢查是否發生混淆,測試中將發現單個位地址的錯誤,譬如“粘滯高、 * 粘滯低”(stuck-high、stuck-low)以及引腳間短路現象。測試基地址以 * 及測試范圍由主調函數給定。測試成功返回 NULL,測試失敗返回發生
* 混淆錯誤的首地址。
* 注: 為了獲得最好的測試結果,測試基地址低位部分(LSB)應有足夠多的的
* 0以保證單個位地址能夠正確變化,例如要測試64KB范圍的地址總線,測
* 試基地址應選擇在64KB地址范圍的邊界上,并且應盡可能使被測試的地址
* 范圍為2的整數次冪。通過檢查存儲器內容可以找出其 它錯誤信息。
*************************************************************************/
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;
/* 對每個2的整數次冪的偏移地址寫入默認的測試數據 */
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;
/* 檢查地址位是否粘滯低或發生短路 */
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);
}
/******************************* 器件測試函數 ****************************** 函數原型:datum xdata *memTestDevice(volatile datum xdata * baseAddress,
* unsigned long nBytes)
* 功 能:通過對存儲器器件的整個地址單元進行加1和減1來測試其完整性,每一
* 個存儲位都要進行寫0和寫1測試。測試基地址以及測試范圍由主調函數
* 給定。測試成功返回NULL,并且整個存儲器區域將用0填充。
* 測試失敗則返回發生錯誤的第一個存儲器地址。通過檢查存儲器內容可
* 以找出其它錯誤信息。
*************************************************************************/
datum xdata *memTestDevice(volatile datum xdata * baseAddress,
unsigned long nBytes) {
unsigned long offset;
unsigned long nWords = nBytes / sizeof(datum);
datum pattern;
datum antipattern;
/* 用已知數據填充存儲器單元 */
for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++) {
baseAddress[offset] = pattern;
}
/* 檢查每個存儲器單元并將其取反 */
for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++) {
if (baseAddress[offset] != pattern) {
return ((datum xdata *) &baseAddress[offset]);
}
antipattern = ~pattern;
baseAddress[offset] = antipattern;
}
/* 檢查每個存儲器單元并將其清零 */
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);
}
/***************************** 存儲器測試函數*****************************
* 函數原型:memTest()
* 功 能:測試外部RAM存儲器數據總線、地址總線以及RAM器件。
* 測試成功返回0,測試失敗返回-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);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -