#include "dhry.h"
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#define LOOPS 20000
Rec_Pointer Ptr_Glob,
Next_Ptr_Glob;
int Int_Glob;
Boolean Bool_Glob;
char Ch_1_Glob,
Ch_2_Glob;
int Arr_1_Glob [25 ]; /* <-- changed from 50 */
int Arr_2_Glob [25 ] [25 ]; /* <-- changed from 50 */
char Reg_Define[] = "Register option selected." ;
#ifndef ROPT
#define REG
/* REG becomes defined as empty */
/* i.e. no register variables */
#else
#define REG register
#endif
/* end of variables for time measurement */
void Proc_1( REG Rec_Pointer Ptr_Val_Par );
void Proc_2( One_Fifty * Int_Par_Ref );
void Proc_3( Rec_Pointer * Ptr_Ref_Par );
void Proc_4( void );
void Proc_5( void );
void Proc_1( REG Rec_Pointer Ptr_Val_Par )
/******************/
/* executed once */
{
REG Rec_Pointer Next_Record = Ptr_Val_Par->tr_Comp = Ptr_Glob->;Ptr_Comp;
Proc_7 (Next_Record->variant.var_1.Int_Comp, 10 ,
&Next_Record->variant.var_1.Int_Comp);
}
else /* not executed */
structassign (*Ptr_Val_Par, *Ptr_Val_Par->;Ptr_Comp);
} /* Proc_1 */
void Proc_2( One_Fifty * Int_Par_Ref )
/******************/
/* executed once */
/* *Int_Par_Ref == 1, becomes 4 */
{
One_Fifty Int_Loc;
Enumeration Enum_Loc;
Int_Loc = *Int_Par_Ref + 10 ;
do /* executed once */
if (Ch_1_Glob == 'A' )
/* then, executed */
{
Int_Loc -= 1 ;
*Int_Par_Ref = Int_Loc - Int_Glob;
Enum_Loc = Ident_1;
} /* if */
while (Enum_Loc != Ident_1); /* true */
} /* Proc_2 */
void Proc_3( Rec_Pointer * Ptr_Ref_Par )
/******************/
/* executed once */
/* Ptr_Ref_Par becomes Ptr_Glob */
{
if (Ptr_Glob != Null)
/* then, executed */
*Ptr_Ref_Par = Ptr_Glob->;Ptr_Comp;
Proc_7 (10 , Int_Glob, &Ptr_Glob->variant.var_1.Int_Comp);
} /* Proc_3 */
void Proc_4( void ) /* without parameters */
/*******/
/* executed once */
{
Boolean Bool_Loc;
Bool_Loc = Ch_1_Glob == 'A' ;
Bool_Glob = Bool_Loc | Bool_Glob;
Ch_2_Glob = 'B' ;
} /* Proc_4 */
void Proc_5( void ) /* without parameters */
/*******/
/* executed once */
{
Ch_1_Glob = 'A' ;
Bool_Glob = false ;
} /* Proc_5 */
void dhrystone (void )
{
One_Fifty Int_1_Loc;
REG One_Fifty Int_2_Loc;
One_Fifty Int_3_Loc;
REG char Ch_Index;
Enumeration Enum_Loc;
Str_30 Str_1_Loc;
Str_30 Str_2_Loc;
REG int Run_Index;
REG int Number_Of_Runs;
Next_Ptr_Glob = (Rec_Pointer)emalloc (sizeof (Rec_Type));
Ptr_Glob = (Rec_Pointer)emalloc (sizeof (Rec_Type));
Ptr_Glob->;Ptr_Comp = Next_Ptr_Glob;
Ptr_Glob->Discr = Ident_1;
Ptr_Glob->variant.var_1.Enum_Comp = Ident_3;
Ptr_Glob->variant.var_1.Int_Comp = 40 ;
strcpy (Ptr_Glob->variant.var_1.Str_Comp,
"DHRYSTONE PROGRAM, SOME STRING" );
strcpy (Str_1_Loc, "DHRYSTONE PROGRAM, 1'ST STRING" );
Arr_2_Glob [8 ][7 ] = 10 ;
/* Was missing in published program. Without this statement, */
/* Arr_2_Glob [8][7] would have an undefined value. */
/* Warning: With 16-Bit processors and Number_Of_Runs > 32000, */
/* overflow may occur for this array element. */
Number_Of_Runs=LOOPS;
for (Run_Index = 1 ; Run_Index <= Number_Of_Runs; ++Run_Index)
{
Proc_5();
Proc_4();
/* Ch_1_Glob == 'A', Ch_2_Glob == 'B', Bool_Glob == true */
Int_1_Loc = 2 ;
Int_2_Loc = 3 ;
strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 2'ND STRING" );
Enum_Loc = Ident_2;
Bool_Glob = ! Func_2 (Str_1_Loc, Str_2_Loc);
/* Bool_Glob == 1 */
while (Int_1_Loc < Int_2_Loc) /* loop body executed once */
{
Int_3_Loc = 5 * Int_1_Loc - Int_2_Loc;
/* Int_3_Loc == 7 */
Proc_7 (Int_1_Loc, Int_2_Loc, &Int_3_Loc);
/* Int_3_Loc == 7 */
Int_1_Loc += 1 ;
} /* while */
/* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */
Proc_8 (Arr_1_Glob, Arr_2_Glob, Int_1_Loc, Int_3_Loc);
/* Int_Glob == 5 */
Proc_1 (Ptr_Glob);
for (Ch_Index = 'A' ; Ch_Index <= Ch_2_Glob; ++Ch_Index)
/* loop body executed twice */
{
if (Enum_Loc == Func_1 (Ch_Index, 'C' ))
/* then, not executed */
{
Proc_6 (Ident_1, &Enum_Loc);
strcpy (Str_2_Loc, "DHRYSTONE PROGRAM, 3'RD STRING" );
Int_2_Loc = Run_Index;
Int_Glob = Run_Index;
}
}
/* Int_1_Loc == 3, Int_2_Loc == 3, Int_3_Loc == 7 */
Int_2_Loc = Int_2_Loc * Int_1_Loc;
Int_1_Loc = Int_2_Loc / Int_3_Loc;
Int_2_Loc = 7 * (Int_2_Loc - Int_3_Loc) - Int_1_Loc;
/* Int_1_Loc == 1, Int_2_Loc == 13, Int_3_Loc == 7 */
Proc_2 (&Int_1_Loc);
/* Int_1_Loc == 5 */
} /* loop "for Run_Index" */
}
/*
*************************************************************************
*
* "DHRYSTONE" Benchmark Program
* -----------------------------
*
* Version: C, Version 2.1
*
* File: dhry_2.c (part 3 of 3)
*
* Date: May 25, 1988
*
* Author: Reinhold P. Weicker
*
*************************************************************************
*/
/***************************************************************************
* Adapted for embedded microcontrollers by Graham Davies, ECROS Technology.
**************************************************************************/
#include "dhry.h"
#include <string.h>
#ifndef REG
#define REG
/* REG becomes defined as empty */
/* i.e. no register variables */
#else
#define REG register
#endif
extern int Int_Glob;
extern char Ch_1_Glob;
Boolean Func_3( Enumeration Enum_Par_Val );
void Proc_6( Enumeration Enum_Val_Par, Enumeration * Enum_Ref_Par )
/*********************************/
/* executed once */
/* Enum_Val_Par == Ident_3, Enum_Ref_Par becomes Ident_2 */
{
*Enum_Ref_Par = Enum_Val_Par;
if (! Func_3 (Enum_Val_Par))
/* then, not executed */
*Enum_Ref_Par = Ident_4;
switch (Enum_Val_Par)
{
case Ident_1:
*Enum_Ref_Par = Ident_1;
break ;
case Ident_2:
if (Int_Glob > 100 )
/* then */
*Enum_Ref_Par = Ident_1;
else *Enum_Ref_Par = Ident_4;
break ;
case Ident_3: /* executed */
*Enum_Ref_Par = Ident_2;
break ;
case Ident_4: break ;
case Ident_5:
*Enum_Ref_Par = Ident_3;
break ;
} /* switch */
} /* Proc_6 */
void Proc_7( One_Fifty Int_1_Par_Val, One_Fifty Int_2_Par_Val,
One_Fifty * Int_Par_Ref )
/**********************************************/
/* executed three times */
/* first call: Int_1_Par_Val == 2, Int_2_Par_Val == 3, */
/* Int_Par_Ref becomes 7 */
/* second call: Int_1_Par_Val == 10, Int_2_Par_Val == 5, */
/* Int_Par_Ref becomes 17 */
/* third call: Int_1_Par_Val == 6, Int_2_Par_Val == 10, */
/* Int_Par_Ref becomes 18 */
{
One_Fifty Int_Loc;
Int_Loc = Int_1_Par_Val + 2 ;
*Int_Par_Ref = Int_2_Par_Val + Int_Loc;
} /* Proc_7 */
void Proc_8( Arr_1_Dim Arr_1_Par_Ref, Arr_2_Dim Arr_2_Par_Ref,
int Int_1_Par_Val, int Int_2_Par_Val )
/*********************************************************************/
/* executed once */
/* Int_Par_Val_1 == 3 */
/* Int_Par_Val_2 == 7 */
{
REG One_Fifty Int_Index;
REG One_Fifty Int_Loc;
Int_Loc = Int_1_Par_Val + 5 ;
Arr_1_Par_Ref [Int_Loc] = Int_2_Par_Val;
Arr_1_Par_Ref [Int_Loc+1 ] = Arr_1_Par_Ref [Int_Loc];
Arr_1_Par_Ref [Int_Loc+15 ] = Int_Loc;
for (Int_Index = Int_Loc; Int_Index <= Int_Loc+1 ; ++Int_Index)
Arr_2_Par_Ref [Int_Loc] [Int_Index] = Int_Loc;
Arr_2_Par_Ref [Int_Loc] [Int_Loc-1 ] += 1 ;
Arr_2_Par_Ref [Int_Loc+10 ] [Int_Loc] = Arr_1_Par_Ref [Int_Loc];
Int_Glob = 5 ;
} /* Proc_8 */
Enumeration Func_1 ( Capital_Letter Ch_1_Par_Val, Capital_Letter Ch_2_Par_Val )
/*************************************************/
/* executed three times */
/* first call: Ch_1_Par_Val == 'H', Ch_2_Par_Val == 'R' */
/* second call: Ch_1_Par_Val == 'A', Ch_2_Par_Val == 'C' */
/* third call: Ch_1_Par_Val == 'B', Ch_2_Par_Val == 'C' */
{
Capital_Letter Ch_1_Loc;
Capital_Letter Ch_2_Loc;
Ch_1_Loc = Ch_1_Par_Val;
Ch_2_Loc = Ch_1_Loc;
if (Ch_2_Loc != Ch_2_Par_Val)
/* then, executed */
return (Ident_1);
else /* not executed */
{
Ch_1_Glob = Ch_1_Loc;
return (Ident_2);
}
} /* Func_1 */
Boolean Func_2( Str_30 Str_1_Par_Ref, Str_30 Str_2_Par_Ref )
/*************************************************/
/* executed once */
/* Str_1_Par_Ref == "DHRYSTONE PROGRAM, 1'ST STRING" */
/* Str_2_Par_Ref == "DHRYSTONE PROGRAM, 2'ND STRING" */
{
REG One_Thirty Int_Loc;
Capital_Letter Ch_Loc;
Int_Loc = 2 ;
while (Int_Loc <= 2 ) /* loop body executed once */
if (Func_1 (Str_1_Par_Ref[Int_Loc],
Str_2_Par_Ref[Int_Loc+1 ]) == Ident_1)
/* then, executed */
{
Ch_Loc = 'A' ;
Int_Loc += 1 ;
} /* if, while */
if (Ch_Loc >= 'W' && Ch_Loc < 'Z' )
/* then, not executed */
Int_Loc = 7 ;
if (Ch_Loc == 'R' )
/* then, not executed */
return (true );
else /* executed */
{
if (strcmp (Str_1_Par_Ref, Str_2_Par_Ref) > 0 )
/* then, not executed */
{
Int_Loc += 7 ;
Int_Glob = Int_Loc;
return (true );
}
else /* executed */
return (false );
} /* if Ch_Loc */
} /* Func_2 */
Boolean Func_3( Enumeration Enum_Par_Val )
/***************************/
/* executed once */
/* Enum_Par_Val == Ident_3 */
{
Enumeration Enum_Loc;
Enum_Loc = Enum_Par_Val;
if (Enum_Loc == Ident_3)
/* then, executed */
return (true );
else /* not executed */
return (false );
} /* Func_3 */
void dhrystone(void );
void main(void )
{
asm("nop" );
dhrystone(); //测试两NOP之间时间
asm ("nop" );
}
IARAVR:
总代码量: 1 582 bytes of CODE memory (+ 84 range fill )
执行时间:37240874时钟周期(软仿真)
IARSTM8:
总代码量: 1 369 bytes of readonly code memory
执行时间:36170907时钟周期(软仿真)
dhrystone.rar (108.69 KB)
有没有这么夸张?STM8比AVR多花了10倍的时钟周期?
LS看错了吧?
AVR 37240874
STM8 36170907
怎么能扯出十倍的说**
STM8是新的架构,比AVR强是不奇怪的,在IARSTM8对STM8进行更好的优化后,STM8的优势应该更加明显。
这个老早就PK过了。 STM8是 增强的51。 AVR是单指令周期的RISC,
而且寄存器更多! 寄存器多 对编译器来说是很有用的。
用STM8来与AVR比较。确实太抬举STM8了, 也太贬低AVR了!
STM8 核心 连 单周期的51核心都不如(说的是核心结构性能)。
但STM8凭 综合的性能:内部集成外设和新加的指令:例如除法?、乘法?等等
还有ST 良好的销售策略------价格低廉。
因此 说 STM8的性价比还是不错的。 但光论 核心的架构先进性。
这个核心已经是上两代的技术了。
好比 STM8是 J10第三代的战机 ,人家AVR如同是F-22的第5代战机了。
LS的比喻不是很恰当,AVR和STM8不是同一框架的,而现在又是多种框架并存的局面,只能说明各有所长。
AVR由于没有除法指令,使得一个INT-》BCD需要近千个时钟,而STM8中不足百个(好像16/8bit指令16指令周),常用指令也在1指令周期完成,STM8的中断最少为9进9出,AVR 4进2出,相比STM8实时性要打折扣。
各取所需,实用为上!得罪之处勿怪。
6楼说得太形而上学了.
CISC和RISC各有所长.
岂能以此定论MCU的好坏?
CISC虽然有的指令周期长一点,
但是其功能RISC需要好几个周期才能实现.
还要就是,
尽管AVR,C8051,甚至包括msp430反强调其单周期,
但是这些MCU处理源和目的都是寄存器的情况是单周期,
在其他寻址的时候,
都是多周期.
宣传的单周期有忽悠人之嫌疑
STM8性价比还是很高的,而且JTAG也不错。仿真调试下载都很方便。
不像AVR那个 令人恼火的 锁死问题。
STM8 的 寄存器太少,这个肯定是瓶颈的。
而且我有几个问题想请假8楼
看ARM 公司ARM7是(冯.诺依结构)CISC ,ARM9以后都是(哈佛结构)RISC. 为何?
为何 IBM SUN, HP,SGI,MIPS,ARM,ADI,TI ,MOTO都是主攻 RISC 处理器?
为何 咱们国家的科学家也搞个克隆的 龙芯?龙芯是RISC吧?
难道 这些 科学家 真的 是 搞忽悠。 他们对哈佛 和诺依曼 都看不清?
或者 这些科学家根本 就把RISC 与CISC看作是大同小异的东西?本质没多大区别?
也就是他们之间是:RISC and CISC architectures are becoming more and more alike?
而且他们也是:RISC and CISC are growing to each othe?
The difference between RISC and CISC chips is getting smaller and smaller.?
在嵌入式领域:RISC目前是主宰市场者。(DSP也是RISC的变种)
RISC VS CISC:
楼上是以意识形态来判断CPU运算能力好坏。
CISC不一定比RISC好,RISC也不一定比CISC强。
而且,目前发展趋势是RISC,CISC殊路同归,界限越来越模糊。
要比较CPU运算能力,用实验见真章。
不要以意识形态地单纯地凭RISC,CISC还评定CPU运算能力的好坏。
楼上说了这么多,实在的就一句:
“STM8 的 寄存器太少,这个肯定是瓶颈的。”
10楼:
ARM是advanced RISC machines的缩写吧,所以ARM7也是RISC, 不是CISC
我倒没感觉 STM8 的 寄存器太少,对STM8 而言,这点寄存器已足够了, ST公司的设计人员已作了充分的考虑,不存在运算瓶颈问题。
值的注意的是,STM8 和 51是二种不同的构架,STM8 是增强的6502构架,这种构架的好处就是寻址指令特别丰富,便于C语言优化程序结构,提高运行效率。
英特尔的X86系列都是CISC构架,难道世上有人会说,英特尔奔腾系列芯片的速度不及ARM(RISC构架)?
对用户来说,CISC构架和RISC构架,是从MPU指令集的机器码来区分的,长短不一的是CISC构架,长短统一的是RISC构架。
楼主何不多弄几个乘法比较一下速度?若比寻址,比16位累加累减AVR当然赛不过STM8了。但是一旦涉及复杂的运算,嘿嘿,你知道的。
查找数据手册?
EEWorld Datasheet 技术支持
安世半导体智能工业应用探索站,闯关赢好礼!
点击页面内“开始探索”按钮,填写并提交表单;
请根据序号依次完成3个安世半导体智能工业应用的探索,并根据给出的资料完成共计9题(每个应用3题),答对5题以上的玩家即可获得抽奖资格;
每人仅有一次参与答题的机会,请慎重作答,活动结束后,我们将抽取30位玩家赠送礼品。
查看 »
关闭
站长推荐
1 /7