日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

内存检测方法

發布時間:2023/12/20 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 内存检测方法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.電路的制作工藝錯誤:在焊接電路的時候,可能會出現焊錫飛濺的情況,使得兩個引腳短路,這樣的后果是,當你對存儲器進行操作的時候,就會數據重疊,甚至于說,出現無法讀取的數據;焊接操作不當或者銅板刻制出錯,出現開路的情況,可能會出現對存儲器無法操作或者數據操作不成功的情況。

2.電路的電容性:假設使用的芯片頻率足夠快,你進行一個寫操作,為了檢驗,你再進行一個讀操作,那么問題來了,如果電容性,雖然你可能檢測到的數據是你想要的,但是這時這個數據是由于讀寫操作太快,而來不及反翻轉,那么這樣的芯片實際上是不能存儲你檢測到的那么多的數據的。

3.存儲芯片錯誤放置,其實這樣的情況很容易避免的,這樣的問題,進行檢測的時候,都會自動的檢測出來。

現在介紹三種檢測方法,數據總線檢測,地址總線檢測,設備檢測。

數據存取正常是在控制總線(地址總線)正常的情況下進行的,而設備檢測需要確定地址總線和數據總線已經正常工作了。

1.數據總線檢測,通常采用的方法使用0~1對存儲的每一個bit位進行遍歷,

每次的讀寫操作,每個數據位之間都是獨立的。如圖所示,好像“1”從右邊走到了左邊,所以這種方法也叫作“walking 1”.

typedef unsigned char datum; /* 設置數據總線寬度為8bit */ /********************************************************************** * * 函數名: memTestDataBus * * 函數內容: 在指定的地址下,用walking 1的方法對數據總線進行檢測 * 地址通過函數參數指定。 * * 輸入參數: address 需要檢測的內存地址 * * 返回值: 返回'0',則沒有問題,如果返回其他值, * 則說明檢測失敗有數據位操作有問題 * **********************************************************************/ datum memTestDataBus(volatile datum * address) { datum pattern; /* * 在指定的地址下執行對數據線進行walking 1檢測 */ for (pattern = 1; pattern != 0; pattern <<= 1) { /* * 寫入檢測數據 */ *address = pattern; /* * 讀回數據 */ if (*address != pattern) { return (pattern); } } return (0); } /* memTestDataBus() */

2.地址總線檢測:對芯片的每一個地址進行寫0和1,同時確定引腳之間相互獨立。

這個和數據總線檢測的walking 1的方法是類似(對一個16bit的總線來說,地址可以是0000H,0001H,0002H,0004H,0008H,0010H,0020H,0080H等等),并且在你寫入的同時,你需要檢測其他的地址沒有被重寫。

但是不是所有的地址線可以通過這樣的方法檢測,比如你的地址總線寬度是32bit,尋址空間是4GB,如果你要測試128K的內存塊,那么其實只有17根總線用到了, 仍有15根總線沒有用到。

確定兩個存儲之間沒有重疊

/********************************************************************** * * 函數名: memTestAddressBus() * * 函數描述: 這個測試可以找出某個bit位上的錯誤,比如,卡高,卡低 * 短路。基礎地址和區域大小可以由函數參數指定。 * 輸入參數: 基礎地址, * * 返回值 : 如果地址總線沒有,返回空值。 * 返回的非零的結果,是函數執行時遇見的第一個出現地址 * 重疊的。通過檢查存儲的內容,可以知道關于這個存儲問 * 題是卡高,卡低,短路。 * **********************************************************************/ datum * memTestAddressBus(volatile datum * baseAddress, unsigned long nBytes) {unsigned long addressMask = (nBytes/sizeof(datum) - 1);unsigned long offset;unsigned long testOffset;datum pattern = (datum) 0xAAAAAAAA;datum antipattern = (datum) 0x55555555;/** 在每一個偏置電源下,對每一個地址位寫初值操作*/for (offset = 1; (offset & addressMask) != 0; offset <<= 1){baseAddress[offset] = pattern;}/** 檢查地址位卡低*/testOffset = 0;baseAddress[testOffset] = antipattern;for (offset = 1; (offset & addressMask) != 0; offset <<= 1){if (baseAddress[offset] != pattern){return ((datum *) &baseAddress[offset]);}}baseAddress[testOffset] = pattern;/** 檢查地址位卡高*/for (testOffset = 1; (testOffset & addressMask) != 0; testOffset <<= 1){baseAddress[testOffset] = antipattern;if (baseAddress[0] != pattern){return ((datum *) &baseAddress[testOffset]);}for (offset = 1; (offset & addressMask) != 0; offset <<= 1){if ((baseAddress[offset] != pattern) && (offset != testOffset)){return ((datum *) &baseAddress[testOffset]);}}baseAddress[testOffset] = pattern;}return (NULL); } /* memTestAddressBus() */

3.設備檢測,存儲器中每一位都可以存儲0或1,雖然這句話很簡單,很粗暴,但是所花的時間比前面兩個多了不少。

在設備檢測過程中,你需要對所有的內存空間進行兩次讀寫操作,第一次將一個隨機數寫讀該地址,第二次將這個隨機數取反再次寫讀。在檢測中常用的方法是,隨著地址的變化,存儲的值逐漸增加。

如下圖所示:

第一列和第二列是地址和數據的變化,第三列是數據取反之后的變化。取數值的方式有很多種,但是這種順序變化的方式更加的容易計算。

/********************************************************************** * * 函數名: memTestDevice() * * 函數描述: 用數據遞增/遞減的方式檢測整個物理存儲區域。 * 在這個過程中設備里的每一個存儲位用bit1或者bit0進行 * 檢測。通過形參傳遞基礎地址和檢測區域大小。 *輸入參數: 基礎地址 baseAddress,檢測區域大小 * * 返回值: 如果檢測成功,則返回空值。 * 如果檢測失敗,會返回一個第一次檢測失敗的內存地址。同時 * 檢測內存內容,可以得到這個問題更多詳細信息。 * **********************************************************************/ datum * memTestDevice(volatile datum * 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;}/** 檢測每一個存儲位置,并進行每個bit位進行翻轉*/for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++){if (baseAddress[offset] != pattern){return ((datum *) &baseAddress[offset]);}antipattern = ~pattern;baseAddress[offset] = antipattern;}/** 檢測存儲器中每個已經翻轉的bit位,同時將所有內存置零*/for (pattern = 1, offset = 0; offset < nWords; pattern++, offset++){antipattern = ~pattern;if (baseAddress[offset] != antipattern){return ((datum *) &baseAddress[offset]);}}return (NULL); } /* memTestDevice() */

好吧,到了三劍合一的時候了

說了那么多,我們現在來講點實際的。假設現在我們需要檢測一個地址00000000H,大小是64K的內存塊。我們現在以我們剛剛說的順序對三個函數進行調用。對我們的內存進行檢測,得到的代碼如下。

int memTest(void) { #define BASE_ADDRESS (volatile datum *) 0x00000000 #define NUM_BYTES (64 * 1024)if ((memTestDataBus(BASE_ADDRESS) != 0) ||(memTestAddressBus(BASE_ADDRESS, NUM_BYTES) != NULL) ||(memTestDevice(BASE_ADDRESS, NUM_BYTES) != NULL)){return (-1);}else{return (0);}} /* memTest() */

在檢測中,你可以用一個LED的亮滅來表示內存的檢測的結果,如果返回值不為空,則亮起紅燈。如果返回值為空,則亮起綠燈。

?

總結

以上是生活随笔為你收集整理的内存检测方法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 人妻激情偷乱频一区二区三区 | av av在线| 国产一级免费在线观看 | 韩国视频一区二区三区 | 91丝袜一区二区三区 | 国产a视频精品免费观看 | 国内成人自拍视频 | 99久久人妻无码精品系列 | 少妇一级淫片免费观看 | 成年人网站在线观看视频 | 欧美区一区二 | 淫视频在线观看 | 久久精品国内 | 人人爱人人射 | 国产成人在线播放视频 | 中文字幕乱码人妻一区二区三区 | 色批网站| av成人在线免费观看 | 亚洲人免费 | av最新天堂 | 精品免费在线视频 | 黄色av电影在线 | 视频在线观看一区 | 亚洲国产精品久久久久爰色欲 | 蜜臀久久精品久久久久 | 国产亚洲精品码 | 青青草娱乐视频 | 内裤摩擦1v1h | japanese国产打屁股网站 | 爱射综合| 婷婷色婷婷 | 深夜视频在线看 | 国产精品一区二区视频 | 国产特级淫片免费看 | 免费网站91| 国内毛片毛片毛片毛片毛片 | 国产主播啪啪 | 国模在线观看 | 国产精品美女一区 | 午夜视频入口 | 婷婷色九月 | 亚洲午夜精品一区 | 欧美激情中文字幕 | 最近中文字幕免费mv视频7 | 亚洲图片小说区 | 欧美精品一级二级三级 | 久久精品香蕉 | 2021中文字幕 | 男女做受视频 | 无码h肉动漫在线观看 | 中文字幕一区二区三区人妻不卡 | 色天堂视频 | 成人午夜视频在线 | 波多野结衣av一区二区全免费观看 | 男人激烈吮乳吃奶爽文 | 中国三级视频 | 999国产在线 | 日本在线视频www | 亚洲天堂资源网 | 国产伦精品一区二区三区视频女 | 一区二区免费av | 久草成人 | 精品国产999久久久免费 | 一区二区三区视频免费看 | 午夜精品在线观看 | 麻豆蜜桃wwww精品无码 | 成人影视在线看 | 久久伊人99 | 99er久久 | 反差在线观看免费版全集完整版 | 丝袜美腿亚洲综合 | 91视频污在线观看 | 国产女人18毛片水18精 | 欧美日韩精品在线播放 | 久久色视频 | 老女人做爰全过程免费的视频 | 成年人网站在线免费观看 | 999精品一区 | 一区二区三区亚洲视频 | 日本免费网站 | 美女作爱网站 | 香蕉久久夜色精品 | 久久久高清免费视频 | 桃色视频网 | 免费毛片软件 | 久久人成 | 天天操天天干天天操 | 亚洲色图欧美色 | 色呦呦 | 国产精品扒开腿做爽爽 | 日本中文字幕在线看 | 91国产一区 | 国产精品无码免费在线观看 | 亚洲男人天堂2017 | 91啦中文 | 九九在线观看免费高清版 | 亚洲一区在线看 | 亚洲50p| 在线播放www |