精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

嵌入式中如何給內存做壓力測試?

璟琰乀 ? 來源:痞子衡嵌入式 ? 作者:痞子衡嵌入式 ? 2021-04-04 18:20 ? 次閱讀

大家好,我是痞子衡,是正經搞技術的痞子。今天痞子衡給大家介紹的是內存讀寫正確性壓力測試程序memtester。

嵌入式系統中,內存(RAM)的重要性不言而喻,系統性能及穩定性都與內存息息相關。關于內存性能有很多個不同指標,其中最基礎的指標便是訪問可靠性(即讀寫的正確性),只有穩定可靠的內存訪問才能確保系統正常運行。很多時候簡單地內存讀寫測試并不能發現隱藏的問題,因此我們需要一個完備的內存訪問壓力測試程序,今天痞子衡就和大家詳細聊一聊memtester。

一、內存性能測試程序集

在講memtester之前,痞子衡先給大家科普一下Linux系統下常用的內存性能測試工具,它們分別是mbw、memtester、lmbench、sysbench。這幾個測試工具(程序)各有側重點:

內存帶寬測試工具 --mbw;內存壓力測試工具 --memtester;內存綜合性能測試工具 --lmbench;內存申請與讀寫速度測試工具 --sysbench;

二、memtester程序

memtester是Simon Kirby在1999年編寫的測試程序(v1版),后來由Charles Cazabon一直維護更新(v2及之后版本),主要面向Unix-like系統,官方主頁上介紹的是“A userspace utility for testing the memory subsystem for faults.”,其實就是為了測試內存(主要DDR)的讀寫訪問可靠性(僅正確性,與速度性能無關),這是驗證板級硬件設備必不可少的一項測試。

整個memtester測試的視角就是從用戶的角度來看的,從用戶角度設立不同的測試場景即測試用例,然后針對性地進行功能測試,注意是從系統級來測試,也就是說關注的不單單是內存顆粒了,還有系統板級的連線、IO性能、PCB等等相關的因素,在這些因素的影響下,內存是否還能正常工作。

2.1 獲取程序

memtester程序的最新版本是4.5.0,早期的v1/v2/v3版本目前下載不到了,2012年Charles Cazabon重寫了程序并發布了全新v4.0.0,此后一直不定期更新,v4.x也是當前最流行的版本。

核心程序下載:http://pyropus.ca/software/memtester/

核心程序包下載后,在\memtester-4.5.0\下可找到源代碼。詳細源文件目錄如下:

\memtester-4.5.0 \memtester.h \memtester.c --主程序入口 \sizes.h --關于系統位數(32/64bit)的一些定義 \types.h --所用數據類型的定義 \tests.h \tests.c --測試算法子程序

如果是移植到ARM Cortex-M平臺下裸系統運行,一般只需要簡單修改memtester.c文件即可,其他源文件就是一些頭文件包含方面的改動,memtester本身并沒有太多移植工作,其源碼本是用作在Unix-like系統上運行的,而在嵌入式系統里運行僅需要把一些跟系統平臺相關的代碼刪除即可,此外就是打印函數的實現。

2.2 配置參數

memtester源碼里的配置選項主要是如下五個宏:

/* 如下需用戶自定義 */ULONG_MAX -- 確定系統是32bit還是64bitTEST_NARROW_WRITES -- 確定是否要包含8/16 bit寫測試/* 如下借助linux頭文件 */_SC_VERSION -- posix system版本檢查_SC_PAGE_SIZE -- 內存page大小獲取MAP_LOCKED -- Linux里mmap里的swap特性

2.3 程序解析

讓我們嘗試分析memtester主函數入口main,main()函數最開始都是一些輸入參數解析,其實主要就是為了獲取三個重要變量:內存測試起始地址、內存測試總長度、壓力測試循環次數,有了這三個變量值之后便開始逐一跑tests.c文件里各項測試算法小函數:

struct test { char *name; int (*fp)();};struct test tests[] = { { “Random Value”, test_random_value }, { “Compare XOR”, test_xor_comparison }, { “Compare SUB”, test_sub_comparison }, { “Compare MUL”, test_mul_comparison },

{ “Compare DIV”,test_div_comparison }, { “Compare OR”, test_or_comparison }, { “Compare AND”, test_and_comparison }, { “Sequential Increment”, test_seqinc_comparison },

{ “Solid Bits”, test_solidbits_comparison }, { “Block Sequential”, test_blockseq_comparison }, { “Checkerboard”, test_checkerboard_comparison }, { “Bit Spread”, test_bitspread_comparison },

{ “Bit Flip”, test_bitflip_comparison }, { “Walking Ones”, test_walkbits1_comparison }, { “Walking Zeroes”, test_walkbits0_comparison },#ifdef TEST_NARROW_WRITES { “8-bit Writes”, test_8bit_wide_random }, { “16-bit Writes”, test_16bit_wide_random },#endif { NULL, NULL }};/* Function definitions */void usage(char *me) { fprintf(stderr, “\n” “Usage: %s [-p physaddrbase [-d device]] 《mem》[B|K|M|G] [loops]\n”, me); exit(EXIT_FAIL_NONSTARTER);}int main(int argc, char **argv)

{ ul loops, loop, i; size_t bufsize, halflen, count; void volatile *buf, *aligned; ulv *bufa, *bufb; ul testmask = 0; // 省略若干變量定義代碼 printf(“memtester version ” __version__ “ (%d-bit)\n”, UL_LEN); printf(“Copyright (C) 2001-2020 Charles Cazabon.\n”); printf(“Licensed under the GNU General Public License version 2 (only)。\n”); printf(“\n”); // 省略若干初始檢查代碼 // 從輸入參數里獲取physaddrbase計算出內存測試起始地址

aligned // 從輸入參數里獲取mem及B|K|M|G計算出內存測試總長度

bufsize halflen = bufsize / 2; count = halflen / sizeof(ul); bufa = (ulv *) aligned; bufb = (ulv *) ((size_t) aligned + halflen); // 壓力測試的重要變量, loops即重復次數 for(loop=1; ((!loops) || loop 《= loops); loop++) { printf(“Loop %lu”, loop); if (loops) { printf(“/%lu”, loops); } printf(“:\n”); printf(“ %-20s: ”, “Stuck Address”); fflush(stdout); // 第一個測試

stuck_address if (!test_stuck_address(aligned, bufsize / sizeof(ul))) { printf(“ok\n”); } else { exit_code |= EXIT_FAIL_ADDRESSLINES; } // 遍歷tests.c里的所有測試子程序 for (i=0;;i++) { if (!tests[i].name) break; if (testmask && (!((1 《《 i) & testmask))) { continue; } printf(“ %-20s: ”, tests[i].name); // 可以看到將內存測試總空間一分為二,傳給子程序做處理的

if (!tests[i].fp(bufa, bufb, count)) { printf(“ok\n”); } else { exit_code |= EXIT_FAIL_OTHERTEST; } fflush(stdout); /* clear buffer */ memset((void *) buf, 255, wantbytes); } printf(“\n”); fflush(stdout); }}

tests.c文件里才是最核心的壓力測試算法子程序,一共17個函數,涉及各種內存訪問經驗操作

pIYBAGBZwO6ARHMRAAKGI8SbWWo030.jpg

2.4 結果格式

在Unix-like系統下使用make && make install命令進行編譯可得到一個可執行的memtester,可以隨便執行memtester 10M 1,即申請10M的內存測試1次,結果如下:

[root@as150 ~] memtester 10M 1memtester version 4.5.0 (64-bit)Copyright (C) 2001-2020 Charles Cazabon.Licensed under the GNU General Public License version 2 (only).pagesize is 4096pagesizemask is 0xfffffffffffff000want 10MB (10485760 bytes)got 10MB (10485760 bytes),

trying mlock 。。.locked.Loop 1/1: Stuck Address: ok Random Value: ok Compare XOR: ok Compare SUB: ok Compare MUL: ok Compare DIV: ok Compare OR: ok Compare AND: ok Sequential Increment: ok Solid Bits: ok Block Sequential: ok Checkerboard: ok Bit Spread: ok Bit Flip: ok Walking Ones: ok Walking Zeroes: ok 8-bit Writes: ok 16-bit Writes: okDone.

至此,內存讀寫正確性壓力測試程序memtester痞子衡便介紹完畢了,掌聲在哪里~~~

責任編輯:haq

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 嵌入式
    +關注

    關注

    5072

    文章

    19026

    瀏覽量

    303518
  • 內存
    +關注

    關注

    8

    文章

    3004

    瀏覽量

    73900
收藏 人收藏

    評論

    相關推薦

    mmc卡在嵌入式系統的使用

    隨著科技的發展,嵌入式系統在我們的日常生活扮演著越來越重要的角色。從智能手機到家用電器,再到工業控制系統,嵌入式系統無處不在。存儲設備作為嵌入式系統
    的頭像 發表于 11-25 09:58 ?105次閱讀

    ARM嵌入式系統內存對齊的重要性

    嵌入式系統軟件開發,經常在代碼中看到各種各樣的對齊,很多時候我們都是知其然不知其所以然,知道要做好各種對齊,但是不明白為什么要對齊,不對齊會有哪些后果,這篇文章大概總結了內存對齊的理由。
    的頭像 發表于 11-11 17:17 ?639次閱讀
    ARM<b class='flag-5'>嵌入式</b>系統<b class='flag-5'>中</b><b class='flag-5'>內存</b>對齊的重要性

    什么是嵌入式?一文讀懂嵌入式主板

    在現代科技浪潮嵌入式技術已成為支撐各種智能設備和系統運行的核心力量。那么,究竟什么是嵌入式嵌入式系統,顧名思義,是將計算機的硬件和軟件嵌入
    的頭像 發表于 10-16 10:14 ?529次閱讀

    嵌入式主板是什么意思?嵌入式主板全面解析

    嵌入式主板,通常被稱為嵌入式系統的核心組件,是一種用于控制和數據處理的計算機硬件,其設計旨在嵌入特定設備執行專門任務。嵌入式主板如同是設備
    的頭像 發表于 09-30 10:05 ?379次閱讀

    嵌入式常用數據結構有哪些

    嵌入式編程,數據結構的選擇和使用對于程序的性能、內存管理以及開發效率都具有重要影響。嵌入式系統由于資源受限(如處理器速度、內存大小等),
    的頭像 發表于 09-02 15:25 ?394次閱讀

    AI普及嵌入式設計人員帶來新挑戰

    探討了人工智能(AI)的普及嵌入式設計人員帶來的新挑戰。在創建“邊緣機器學習(ML)”應用時,設計人員必須確保其能有效運行,同時最大限度地降低處理器和存儲開銷,以及物聯網(IoT)設備的功耗
    發表于 08-22 14:20 ?648次閱讀
    AI普及<b class='flag-5'>給</b><b class='flag-5'>嵌入式</b>設計人員帶來新挑戰

    嵌入式系統的實時操作系統

    嵌入式RTOS是嵌入式應用程序運行、相互交互和與外界通信的底層軟件機制。在本節,您將了解嵌入式軟件開發人員使用哪些流行RTOS以及它們運行的嵌入式
    的頭像 發表于 08-20 11:28 ?455次閱讀

    如何提升嵌入式編程能力?

    如何提升嵌入式編程能力? 要提升嵌入式編程的能力,可以從以下幾點學習: 1. 理解硬件:熟悉你正在編程的硬件平臺,包括微控制器、處理器、內存、輸入/輸出設備等基礎理論與應用。 2. 學習基本原理
    發表于 06-21 10:01

    嵌入式fpga是什么意思

    嵌入式FPGA是指將FPGA技術集成到嵌入式系統的一種解決方案。嵌入式系統是一種為特定應用而設計的計算機系統,它通常包括處理器、內存、外設
    的頭像 發表于 03-15 14:29 ?1202次閱讀

    嵌入式軟件設計的原則分享

    嵌入式軟件開發如果具有更好的閱讀性、擴展性以及維護性,就需要考慮很多因素。今天大家分享幾個嵌入式軟件設計的原則。
    發表于 02-25 10:54 ?661次閱讀
    <b class='flag-5'>嵌入式</b>軟件設計的原則分享

    大家講講嵌入式系統I2C總線的時序

    I2C總線在嵌入式系統很常見,今天就來給大家講講I2C總線的時序。
    的頭像 發表于 02-23 09:47 ?1574次閱讀
    <b class='flag-5'>給</b>大家講講<b class='flag-5'>嵌入式</b>系統<b class='flag-5'>中</b>I2C總線的時序

    嵌入式學習步驟

    硬件組件。 (4).開發固件:編寫嵌入式系統的固件,這是嵌入式系統的軟件部分。固件負責控制硬件并執行特定任務。 (5).調試和測試:在將嵌入式系統部署到實際環境
    發表于 02-02 15:24

    嵌入式系統堆棧監控的作用

    在微控制器或微處理器,堆棧是內存的一個保留區域,用于存儲臨時數據和函數調用信息,管理函數的執行,跟蹤返回地址、局部變量和函數參數。堆棧監控是嵌入式系統運行起關鍵作用的一項安全措施,
    的頭像 發表于 01-05 11:13 ?471次閱讀

    什么是嵌入式系統?嵌入式系統的具體應用

    嵌入式,一般是指嵌入式系統。用于控制、監視或者輔助操作機器和設備的裝置。
    的頭像 發表于 12-20 13:33 ?2416次閱讀

    嵌入式C語言高手煉成之內存操作篇

    嵌入式系統的編程,常常要求在特定的內存單元讀寫內容,匯編有對應的MOV指令,而除C/C++以外的其它編程語言基本沒有直接訪問絕對地址的能力。在嵌入式系統的實際調試
    的頭像 發表于 12-11 17:20 ?492次閱讀