[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;

    这部分定义的结构体主要用于对结构体访问的评估。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值