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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    4981

    文章

    18270

    浏览量

    288247
  • 内存
    +关注

    关注

    8

    文章

    2763

    浏览量

    72744
收藏 人收藏

    评论

    相关推荐

    如何成为一名嵌入式C语言高手?

    系统,如何调试和优化程序,如何处理实时性要求等。同时,还可以学习如何使用调试工具和硬件仿真器来辅助调试和测试。 四、积极参与开源项目和技术社区加入一些嵌入式开源项目的社区,与其他开发者交流经验
    发表于 04-07 16:03

    嵌入式系统发展前景?

    设备、健康监测等领域有着广泛的应用前景。随着人们对健康的重视程度不断提高,嵌入式系统将更为深入地应用于医疗设备和健康护理,实现个人健康管理的智能化和实时化。 汽车电子和自动驾驶是嵌入式系统的另一个重要
    发表于 02-22 14:09

    嵌入式软件开发应该掌握哪些知识?

    嵌入式软件开发应该掌握哪些知识? 一、 什么是嵌入式软件? 嵌入式软件通常是指嵌入式系统运行的软件,
    发表于 02-19 11:23

    嵌入式学习步骤

    硬件组件。 (4).开发固件:编写嵌入式系统的固件,这是嵌入式系统的软件部分。固件负责控制硬件并执行特定任务。 (5).调试和测试:在将嵌入式系统部署到实际环境
    发表于 02-02 15:24

    嵌入式自学好书推荐

    嵌入式自学好书推荐 在数字时代的浪潮嵌入式系统一直是数字电子产品的重要组成部分。无论是家用电器、工业控制、汽车电子、医疗保健、军事应用还是物联网,
    发表于 01-11 15:13

    嵌入式硬件和软件哪个好?

    这类技术都是看经验的,经验越高,那他的身价也相应变高。据统计,65%的电子产品开发企业嵌入式软件开发工程师团队,往往只占全公司人数的5%,但是却创造了全公司超过70%的效益。 嵌入式软件开发工程师
    发表于 12-05 15:17

    为什么嵌入式没有35岁危机?

    为什么嵌入式没有35岁危机? 在当今数字化时代,IT行业变化迅速,技术的更新迭代速度惊人。然而,有一个技术领域却能够在这个竞争激烈的行业稳步前行,而且不受35岁危机所困扰,那就是嵌入式技术
    发表于 11-17 10:33

    如何成为一名优秀的嵌入式工程师?

    来分配和释放内存。同时,也需要理解指针的概念及用法,以及指针在内存管理的作用。 2.掌握指针:指针是C语言的一个重要特性,它允许你直接操作内存。理解指针的概念和用法对于
    发表于 11-07 15:36

    什么是嵌入式Linux?

    什么是嵌入式Linux? 对于很多电气、电信、通信专业的同学来说,对口专业就业方向主要有软、硬件两个方向。无论是对于学生还是就业而言,软硬件的开发学习,嵌入式物联网在近年来无疑是一个摆在面前
    发表于 10-11 13:47

    从事嵌入式工作有哪些优势?

    日常生活应用很多,比如电子产品,尤其是我们生活拥有的智能手机、智能电视、智能机器人等等都是利用了嵌入式技术研发出来的,单从这方面来看,前景就相当不错。 嵌入式可以说是当下非常有前
    发表于 10-08 15:05

    嵌入式软件好还是硬件好?

    越高,那他的身价也相应变高。据统计,65%的电子产品开发企业嵌入式软件开发工程师团队,往往只占全公司人数的5%,但是却创造了全公司超过70%的效益。 嵌入式软件开发工程师,他的领域是比较广泛的,在
    发表于 09-18 15:31

    如何提高嵌入式软件单元测试效率

    在本指南中,您将学习如何通过在更短的时间内运行更多的测试来增加您的单元测试吞吐量。 这种效率的提高来自于使用虚拟平台而不是物理硬件作为开发平台。 本指南对任何开发或运行嵌入式软件单元测试
    发表于 08-28 06:31

    嵌入式编程为什么使用qemu?qemu的实际应用

    1.前言 嵌入式开发的过程,很多时间都是要和硬件设备打交道,通过程序控制硬件的具体行为,这些往往是单片机延续下来的开发模式,在目前复杂的嵌入式系统,很多都需要借助设计模式来进行开
    发表于 08-16 06:44

    有效的嵌入式软件安全测试

    嵌入式应用程序中,手写汇编和第三方二进制库的使用相当普遍。通常,即使内存变得更便宜并且编译器效率提高,也有必要手动优化代码。程序集还用于直接与一些低级处理器功能交互。但是,这限制了传统的基于源代码的测试框架的使用。Incept
    的头像 发表于 06-29 14:27 543次阅读

    嵌入式系统存储正确性和压力测试方案

    嵌入式系统开发测试阶段通常需要对存储进行正确性和压力测试,比如SRAM,DDR等,通常的做法是进行遍历读写,比如写0x55,0xAA,0x00,0xFF,递增值等这些特殊值然后再回读
    的头像 发表于 06-08 10:45 1256次阅读
    <b class='flag-5'>嵌入式</b>系统存储正确性和<b class='flag-5'>压力</b><b class='flag-5'>测试</b>方案