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

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

    关注

    5212

    文章

    20746

    浏览量

    338442
  • 内存
    +关注

    关注

    9

    文章

    3252

    浏览量

    76569
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    嵌入式驱动开发,需要掌握哪些技能?

    。 4、 熟悉驱动开发常用工具驱动开发,会牵涉到很多软硬件工具。比如:VS Code、Keil、 J-Link、Git等。 5、 调试和故障排除嵌入式软件的测试和调试非常重要,需要掌握各种
    发表于 01-20 16:46

    什么是嵌入式应用开发?

    、实现和部署,还包括硬件选择、软件设计、测试、集成和维护等流程‌。 定义和背景 嵌入式应用开发是指将软件部署到嵌入式系统,这些系统广泛应用于消费电子和工业自动化
    发表于 01-12 16:13

    嵌入式系统,动态分配内存可能发生的问题是什么?

    尽管不像非嵌入式计算机那么常见,嵌入式系统还是有从堆(heap)动态分配内存的过程的。 那么嵌入式系统
    发表于 12-22 09:42

    C语言单元测试嵌入式软件开发的作用及专业工具的应用

    平台和操作系统上运行,无需进行大量的修改 二、C语言单元测试嵌入式开发的关键作用 嵌入式系统对实时性和可靠性要求极高,单元测试是确保代码
    发表于 12-18 11:46

    系统嵌入式的学习路线

    的知识太多,太杂,太广,很多嵌入式初学者陷入嵌入式知识的海洋,东学一点,西学一点,找不到学习的方向。 我从事嵌入式开发工作有10年,嵌入式
    发表于 12-16 07:49

    嵌入式应掌握的几种能力

    1. 编程语言 基本掌握嵌入式必备的编程语言。C语言为主,C++为辅。在资源有限的情况下,大多数嵌入式产品还是使用C语言为主的,特别是底层驱动开发。上层应用开发大多用C,在一些资源比较充足的平台
    发表于 12-08 06:05

    医疗嵌入式软件研发以后好跳槽吗?

    医疗嵌入式软件研发,以后想跳槽一点儿也不难。别看医疗行业门槛高、规矩多,你手里攒下的那套本事,到哪儿都吃得开。嵌入式这东西,甭管在哪个行当里折腾,说到底六个基本部分跑不掉:嵌入式C、
    的头像 发表于 12-03 11:04 1028次阅读
    <b class='flag-5'>做</b>医疗<b class='flag-5'>嵌入式</b>软件研发以后好跳槽吗?

    嵌入式开发的关键点介绍

    嵌入式开发在现代科技扮演着非常重要的角色。随着物联网的发展,嵌入式系统的需求也越来越大。嵌入式开发不仅需要开发人员具备深入的硬件知识和编程经验,还需要不断学习新的技术和工具,以满足不
    发表于 11-13 08:12

    嵌入式C/C++回归测试四大最佳实践(附自动化测试工具TESSY使用教程)

    嵌入式开发,一次微小的代码改动都可能引发“蝴蝶效应”,如何守护系统的稳健?推荐专业的自动化测试工具#TESSY,源自戴姆勒-奔驰,是嵌入式C/C++单元/集成
    的头像 发表于 10-31 14:21 643次阅读
    <b class='flag-5'>嵌入式</b>C/C++回归<b class='flag-5'>测试</b>四大最佳实践(附自动化<b class='flag-5'>测试</b>工具TESSY使用教程)

    嵌入式需要掌握哪些核心技能?

    : 1)C语言与底层编程 核心地位:C语言是嵌入式开发的基石,需精通指针操作、内存管理、位运算,直接操控硬件资源。 延伸技能:C++用于复杂项目架构设计,汇编语言优化底层性能(如启动代码、中断处理
    发表于 10-21 16:25

    嵌入式软件测试与专业测试工具的必要性深度解析

    性能的要求尤为苛刻。 ‌资源高度受限‌:嵌入式系统通常在有限的内存、存储空间和处理能力下运行,测试需关注内存管理、算法效率等资源优化问题。内存
    发表于 09-28 17:42

    嵌入式达到什么水平才能就业?

    工具定位问题具备嵌入式软件模块化设计能力:能按功能划分代码模块,编写规范的头文件与源文件,实现模块间低耦合调用会使用Git 进行版本管理:能提交代码、解决冲突、回滚版本,熟悉敏捷开发流程需求拆解与任务分配逻辑
    发表于 09-15 10:20

    油介质损耗及电阻率测试仪的嵌入式系统架构与抗干扰设计

    油介质损耗及电阻率测试仪的精准检测能力,不仅依赖于核心的电气测量模块与温控系统,更离不开稳定可靠的嵌入式系统作为“中枢神经”。嵌入式系统承担着数据采集、运算处理等核心功能,其架构设计与抗干扰设计共同
    的头像 发表于 09-02 13:57 779次阅读
    油介质损耗及电阻率<b class='flag-5'>测试</b>仪的<b class='flag-5'>嵌入式</b>系统架构与抗干扰设计

    如何在嵌入式RF测试实施多域信号分析

    射频(RF)测试嵌入式系统开发与验证的关键环节,尤其是在电信、航空航天、汽车以及物联网等行业。随着嵌入式系统的日益复杂,传统RF测试方法
    的头像 发表于 08-15 16:32 3071次阅读
    如何在<b class='flag-5'>嵌入式</b>RF<b class='flag-5'>测试</b><b class='flag-5'>中</b>实施多域信号分析

    Linux嵌入式和单片机嵌入式的区别?

    :使用Linux操作系统,可以运行各种复杂的应用程序和驱动程序。 4. 资源需求 : 单片机嵌入式 :对硬件资源的需求较低,通常只需要一个单片机芯片,内存和存储空间较小。 Linux嵌入式 :对硬件资源的需求
    发表于 06-20 09:46