[ARM嵌入式系统开发]第一章之Dhrystone
在书的第一章开头部分,作者提到了“最成功的ARM内核之一ARM7TDMI,具有最高120 Dhrystone MIPS的性能、高的代码密度和低功耗等特性,使它成为移动嵌入式设备的最佳选择”。这里的Dhrystone MIPS,作者给了一个注释,Dhrystone MIPS version 2.1是一个小的基准测试程序。当然仅仅知道这些还是不够的。
Dhrystone benchmark是由Reinhold P. Weicker在1984年提出来的一个基准测试程序,其主要目的是测试处理器的整数运算和逻辑运算的性能。Dhrystone首先用Ada语言发布,后来Rick Richardson为Unix开发了用C语言编写的Version 1.1,这个版本也成功的推动了Dhrystone的广泛应用。但是后来Dhrystone在1988年更新Version 2.1后,停止了后续版本的开发。虽然至今仍然有很多公司,在发布处理器性能参数的时候,经常提及这个基准,但显然,Dhrystone已经是一个不合时宜的基准。不过ARM既然提及了,我们就仔细的看看这个基准到底能够反映什么问题。
为了详细的描述Dhrystone在ARM上的测试方法和过程,ARM提供了文档DAI0093A和基准程序。文档可以在www.arm.com上获取,基准程序在ARM的各种编译环境下都可以找到。笔者使用的是ADS,源码的路径在/ARM/ADSv1_2/Examples下,其中有原始的使用Kernighan and Ritchie style C编写的程序,也有ARM更改的使用ANSI C编写的程序,分别包含在dhry和dhryansi文件夹中。因为无需关注style的问题,所以我们把重点放在dhryansi的分析上。
Dhrystone程序其实比较简单,当然作者花费了很多时间,才精心设计出这些程序。最初的时候,作者搜集了一系列语言的程序后,统计出程序中常用的操作以及这些操作所占的比例。按照这些特性,作者人为的构建了这个评估环境,并经过N多次的修改完善,才形成了现在我们看到的Dhrystone程序。程序由dhry.h,dhry_1.c和dhry_2.c三个文件构成,下面从dhry.h开始逐个的分析这些程序。
首先从头文件说起,头文件主要是一些弥补系统差异化的选择和一些作者自定义的类型,逐步拆分如下:
#ifdef NOSTRUCTASSIGN
#define structassign(d, s) memcpy(&(d), &(s), sizeof(d))
#else
#define structassign(d, s) d = s
#endif
这部分主要是通过宏来区分不同的C标准对结构体赋值的规定,如果不支持直接赋值的写法,则需要打开NOSTRUCTASSIGN,转换成对memcpy的调用。否则,直接用赋值表达式完成。早期的C应该不支持直接的赋值表达式写法。不过在这里说明下,这只是一种写法,主要看C编译器的支持程序,因为最终还是要转换成机器码执行,比如ARM就将这种写法编译成几行汇编代码,实际上还是通过调用ARM库里的memcpy函数__rt_memcpy_w来完成。
#ifdef NOENUM
#define Ident_1 0
#define Ident_2 1
#define Ident_3 2
#define Ident_4 3
#define Ident_5 4
typedef int Enumeration;
#else
typedef enum {Ident_1, Ident_2, Ident_3, Ident_4, Ident_5}
Enumeration;
#endif
这部分主要是对Enumeration的定义。考虑到C的有些版本不支持enum类型,所以设置了宏NOENUM来选择。因为对C的发展不是特别清楚,所以这部分虽然这么说,当时笔者仍然不是很确定。
typedef int One_Thirty;
typedef int One_Fifty;
typedef char Capital_Letter;
typedef int Boolean;
typedef char Str_30 [31];
typedef int Arr_1_Dim [50];
typedef int Arr_2_Dim [50] [50];
这部分主要是一些自定义类型的定义。通过英文含义结合程序,我们可以得出:One_Thirty指的是从1到30的整数;One_Fifty指的是从1到50的整数;Capital_Letter指大写字母;Boolean指布尔型变量;Str_30指30个字符组成的字符串,之所以是31个,因为多了一个'/0';Arr_1_Dim是一维数组,而Arr_2_Dim是二维数组。
typedef struct record
{
struct record *Ptr_Comp;
Enumeration Discr;
union {
struct {
Enumeration Enum_Comp;
int Int_Comp;
char Str_Comp [31];
} var_1;
struct {
Enumeration E_Comp_2;
char Str_2_Comp [31];
} var_2;
struct {
char Ch_1_Comp;
char Ch_2_Comp;
} var_3;
} variant;
} Rec_Type, *Rec_Pointer;
这部分定义的结构体主要用于对结构体访问的评估。
[ARM嵌入式系统开发]第一章之Dhrystone相关推荐
- [ARM嵌入式系统开发]第一章之嵌入式系统的软硬件
本章的最后,通过描述ARM为核心的嵌入式系统,来介绍了嵌入式系统的软件和硬件构成和结构.这里根据这部分的介绍以及其他的文章,描述下通用的嵌入式系统的软件和硬件. 首先来说下硬件,书中说,包含有 ...
- 嵌入式:ARM嵌入式系统开发流程概述
文章目录 嵌入式开发的具体过程 开发流程图 嵌入式软件开发环境 交叉开发环境 远程调试结构图 嵌入式应用软件开发的基本流程 软件模拟环境 目标板与评估板 嵌入式软件开发的可移植性和可重用性 嵌入式开发 ...
- ARM嵌入式系统开发:软件设计与优化--第二章ARM处理器基础
注:本文资料全部来源于网络或书籍,同时加上个人理解.若有侵权,告知即删.若有错误,留言商讨. 1.寄存器: 总共有37个寄存器,最多可以有17个活动寄存器(16个数据寄存器,2个状态寄存器:CPSR和 ...
- ARM 嵌入式系统开发 - 软件设计与优化
ARM 的非 RISC 特征 允许特定指令的执行周期可变 增加桶形移位器 使用 16 位 Thumb 指令 使用条件执行指令 使用增强 DSP 指令 Jazelle Jazelle 是ARM 引进的第 ...
- 《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》——第1章 系统•嵌入•硬件 01-01 Welcome on board!...
本节书摘来自异步社区<嵌入式系统开发之道--菜鸟成长日志与项目经理的私房菜>一书中的第1章,第01-01节,作者 邱毅凌,更多章节内容可以访问云栖社区"异步社区"公众号 ...
- arm板telnetd为什么运行不了_一种基于ARM的嵌入式系统开发的方案详细讲解
背景介绍 在日益信息化的社会中,各种各样的嵌入式系统已经全面渗透到日常生活的每一个角落.嵌入式系统的功能越来越复杂,这就使得一个嵌入式系统产品从市场需求立项到方案选择.样机研制.定型量产所需要的开发费 ...
- 嵌入式系统开发-学习路线
嵌入式系统开发 课程链接 随着嵌入式设备的普及,嵌入式应用的需求量也随之增大,本课程将重点培养基于linux系统下的嵌入式应用开发,包括5个阶段,其中课程涵盖了linux系统下的多进程.多线程嵌入式开 ...
- 计算机三级嵌入式系统开发 知识点笔记
目录为搜索词,详情看每一节后图片 思维导图已上传,点击这里下载 嵌入式系统开发 全部章节图片 第一章 嵌入式系统概论 1.1 SoC IP核 1.2 1.2.1 ASCII GB2312 GB1803 ...
- 嵌入式系统开发怎样快速度入门
http://wenda.tianya.cn/wenda/thread?tid=392a249d9d6856c5 实践当然是最锻炼人的方式,但是我想在校生很少有这样的机会,别说本科生,硕士生也未必有条 ...
最新文章
- 「镁客·请讲」NOLO VR张道宁:空间定位技术加持下的VR,是可以搞出商业价值的...
- MySQL 笔记8 -- 存储过程和索引
- 革命性提升-宇宙最强的NLP预训练BERT模型(附官方代码)
- MMDetection-配置文件
- 小白的Python之路 day5 configparser模块的特点和用法
- 网络信号管理大师怎么用_常说的OKR管理法,到底怎么用?
- c++11 继承构造
- 静态生成html的原理
- shell、ftp、mysql如何连接笔记
- 小米回应 50 亿疫情贷款申请;​爱奇艺 App 崩溃;OpenSSH 8.2 发布 | 极客头条
- c语言标准库函数system,C 库函数
- 网站的前期策划准备工作
- [DELPHI]数据类型
- python求偏度系数_python pandas库和stats库计算偏度和峰度(附程序)
- Web打印控件Lodop实现表格物流单的打印
- 基于Ruby 安装 sass 安装出现的错误以及解决
- godaddy不支持java_godaddy主机被墙的解决方案
- 硬盘有摩擦声音_有摩擦的建筑物
- 【Android】常用重要的adb命令
- 剖析支付宝线下支付技术
热门文章
- 构建海量数据平台-云梯生态系统
- 怀旧服显示服务器已满,魔兽世界怀旧服还未开启就已人满为患
- HP租车网站源码V6.0,一款专为租车行业打造的网站源码
- [单调栈/差分/尺取/单调队列]Exercise Week5 A最大矩形+B魔法猫+C平衡字符串+D滑动窗口
- day08-----pytorch
- ArcGIS数据采集和处理
- OSWorkFlow深入浅出(4)---犹抱琵琶半遮面
- 【网络是怎么连接的】—— 1.2 向 DNS 服务器查询 Web 服务器的 IP 地址
- Understanding How ECDSA Protects Your Data文章翻译
- 通过xml生成java Bean