|
楼主 |
发表于 2007-4-17 23:28:02
|
显示全部楼层
模拟的时间中断间隔产生密度与一般指令执行速度近似正态(考虑执行代码处理时间中断)。
尝试过后,大约速度如下(不更改 armio 的 TC_DIVIDER 前提下):
没有 DBCT 的 arm7tdmi 的实际速度约为 2MHz。
有 DBCT 的 arm7tdmi 的实际速度约为 5~6MHz。
当然这是运行在 1.2GHz 的 Windows XP 主机得出的粗略数据。
可见现在的 SkyEye 仍有相当大的空间作改进,
不过因为个人原因我暂时退出开发,期望有志人士与现有团队继续努力...
加油...
以下是没有DBCT的测试速度简单补丁。
这是我的输出结果:
1. 调用时间中断,每1毫秒一次
1) 没有DBCT
*************************************************
time in microseconds: 1250000
NumInstrs: 2457669
speed: 1.97 MHz
*************************************************
2) 有DBCT
*************************************************
time in microseconds: 6562500
NumInstrs: 19608837
speed: 2.99 MHz
*************************************************
2. 空循环
1) 没有 DBCT
*************************************************
time in microseconds: 4984375
NumInstrs: 12545425
speed: 2.52 MHz
*************************************************
2) 有 DBCT
*************************************************
time in microseconds: 4250000
NumInstrs: 95637808
speed: 22.50 MHz
*************************************************
[code:1]
Index: arch/arm/common/armio.c
===================================================================
--- arch/arm/common/armio.c
+++ arch/arm/common/armio.c
@@ -71,6 +71,7 @@
state->instr_count++;
#endif //DBCT_TEST_SPEED
//AJ2D--------------------------------------------------------------------------
+ if (!skyeye_config.no_dbct) state->NumInstrs++;
prescale--;
if (prescale < 0) {
prescale = DIVISOR;
Index: utils/main/skyeye.c
===================================================================
--- utils/main/skyeye.c
+++ utils/main/skyeye.c
@@ -482,6 +482,38 @@
exit( ret);
}
+#define TEST_ARM_SPEED
+#ifdef TEST_ARM_SPEED
+#include "portable/gettimeofday.h"
+static struct timeval speed_tv;
+static void init_test_speed()
+{
+ gettimeofday(&speed_tv, NULL);
+}
+
+static void test_speed()
+{
+ struct timeval tv;
+ uint64_t msec;
+ ARMul_State *state;
+
+ gettimeofday(&tv, NULL);
+
+ if (skyeye_config.mach == NULL || skyeye_config.arch == NULL ||
+ skyeye_config.arch->arch_name == NULL || strcmp(skyeye_config.arch->arch_name, "arm") != 0 ||
+ (state = (ARMul_State*)skyeye_config.mach->state) == NULL) return;
+
+ msec = (uint64_t)tv.tv_usec + (uint64_t)tv.tv_sec * 1000000ULL;
+ msec -= (uint64_t)speed_tv.tv_usec + (uint64_t)speed_tv.tv_sec * 1000000ULL;
+ printf("\n*************************************************\n");
+ printf("time in microseconds: %llu\n", msec);
+ printf("NumInstrs: %llu\n", state->NumInstrs);
+ printf("speed: %.2f MHz\n", (float)state->NumInstrs / (float)msec);
+ printf("*************************************************\n");
+}
+#endif
+
+
#ifdef __MINGW32__
static BOOL init_win32_socket()
{
@@ -670,6 +702,11 @@
fflush(stdout);
+#ifdef TEST_ARM_SPEED
+ init_test_speed();
+ signal(SIGINT, test_speed);
+#endif
+
if (debugmode == 0)
sim_resume (0);
else{
[/code:1] |
|