在书的第一章开头部分,作者提到了“最成功的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相关推荐

  1. [ARM嵌入式系统开发]第一章之嵌入式系统的软硬件

    本章的最后,通过描述ARM为核心的嵌入式系统,来介绍了嵌入式系统的软件和硬件构成和结构.这里根据这部分的介绍以及其他的文章,描述下通用的嵌入式系统的软件和硬件.     首先来说下硬件,书中说,包含有 ...

  2. 嵌入式:ARM嵌入式系统开发流程概述

    文章目录 嵌入式开发的具体过程 开发流程图 嵌入式软件开发环境 交叉开发环境 远程调试结构图 嵌入式应用软件开发的基本流程 软件模拟环境 目标板与评估板 嵌入式软件开发的可移植性和可重用性 嵌入式开发 ...

  3. ARM嵌入式系统开发:软件设计与优化--第二章ARM处理器基础

    注:本文资料全部来源于网络或书籍,同时加上个人理解.若有侵权,告知即删.若有错误,留言商讨. 1.寄存器: 总共有37个寄存器,最多可以有17个活动寄存器(16个数据寄存器,2个状态寄存器:CPSR和 ...

  4. ARM 嵌入式系统开发 - 软件设计与优化

    ARM 的非 RISC 特征 允许特定指令的执行周期可变 增加桶形移位器 使用 16 位 Thumb 指令 使用条件执行指令 使用增强 DSP 指令 Jazelle Jazelle 是ARM 引进的第 ...

  5. 《嵌入式系统开发之道——菜鸟成长日志与项目经理的私房菜》——第1章 系统•嵌入•硬件 01-01 Welcome on board!...

    本节书摘来自异步社区<嵌入式系统开发之道--菜鸟成长日志与项目经理的私房菜>一书中的第1章,第01-01节,作者 邱毅凌,更多章节内容可以访问云栖社区"异步社区"公众号 ...

  6. arm板telnetd为什么运行不了_一种基于ARM的嵌入式系统开发的方案详细讲解

    背景介绍 在日益信息化的社会中,各种各样的嵌入式系统已经全面渗透到日常生活的每一个角落.嵌入式系统的功能越来越复杂,这就使得一个嵌入式系统产品从市场需求立项到方案选择.样机研制.定型量产所需要的开发费 ...

  7. 嵌入式系统开发-学习路线

    嵌入式系统开发 课程链接 随着嵌入式设备的普及,嵌入式应用的需求量也随之增大,本课程将重点培养基于linux系统下的嵌入式应用开发,包括5个阶段,其中课程涵盖了linux系统下的多进程.多线程嵌入式开 ...

  8. 计算机三级嵌入式系统开发 知识点笔记

    目录为搜索词,详情看每一节后图片 思维导图已上传,点击这里下载 嵌入式系统开发 全部章节图片 第一章 嵌入式系统概论 1.1 SoC IP核 1.2 1.2.1 ASCII GB2312 GB1803 ...

  9. 嵌入式系统开发怎样快速度入门

    http://wenda.tianya.cn/wenda/thread?tid=392a249d9d6856c5 实践当然是最锻炼人的方式,但是我想在校生很少有这样的机会,别说本科生,硕士生也未必有条 ...

最新文章

  1. 「镁客·请讲」NOLO VR张道宁:空间定位技术加持下的VR,是可以搞出商业价值的...
  2. MySQL 笔记8 -- 存储过程和索引
  3. 革命性提升-宇宙最强的NLP预训练BERT模型(附官方代码)
  4. MMDetection-配置文件
  5. 小白的Python之路 day5 configparser模块的特点和用法
  6. 网络信号管理大师怎么用_常说的OKR管理法,到底怎么用?
  7. c++11 继承构造
  8. 静态生成html的原理
  9. shell、ftp、mysql如何连接笔记
  10. 小米回应 50 亿疫情贷款申请;​爱奇艺 App 崩溃;OpenSSH 8.2 发布 | 极客头条
  11. c语言标准库函数system,C 库函数
  12. 网站的前期策划准备工作
  13. [DELPHI]数据类型
  14. python求偏度系数_python pandas库和stats库计算偏度和峰度(附程序)
  15. Web打印控件Lodop实现表格物流单的打印
  16. 基于Ruby 安装 sass 安装出现的错误以及解决
  17. godaddy不支持java_godaddy主机被墙的解决方案
  18. 硬盘有摩擦声音_有摩擦的建筑物
  19. 【Android】常用重要的adb命令
  20. 剖析支付宝线下支付技术

热门文章

  1. 构建海量数据平台-云梯生态系统
  2. 怀旧服显示服务器已满,魔兽世界怀旧服还未开启就已人满为患
  3. HP租车网站源码V6.0,一款专为租车行业打造的网站源码
  4. [单调栈/差分/尺取/单调队列]Exercise Week5 A最大矩形+B魔法猫+C平衡字符串+D滑动窗口
  5. day08-----pytorch
  6. ArcGIS数据采集和处理
  7. OSWorkFlow深入浅出(4)---犹抱琵琶半遮面
  8. 【网络是怎么连接的】—— 1.2 向 DNS 服务器查询 Web 服务器的 IP 地址
  9. Understanding How ECDSA Protects Your Data文章翻译
  10. 通过xml生成java Bean