C++ 如何在C中以较低的时钟速度运行程序
我需要模拟一个硬件的工作方式(不适用于视频游戏) 这个组件的运行频率为1GHz,而我的电脑的运行频率为2.5和2.7GHz 所以我试图告诉电脑以较低的速度运行这个特定的进程 我试过计时器,但不行:当处理小的时间间隔时,进程无法准确地跟踪时间(我需要跟踪毫秒,而且无法整洁地完成) 此外,为了计算时间间隔,您可能会损失一些CPU时间 请记住,我不是外包给社区,我是自己工作的,但也许你们可以帮助集思广益:) 根据我从您的问题和评论中了解到的情况,您需要以C++ 如何在C中以较低的时钟速度运行程序,c++,c,C++,C,我需要模拟一个硬件的工作方式(不适用于视频游戏) 这个组件的运行频率为1GHz,而我的电脑的运行频率为2.5和2.7GHz 所以我试图告诉电脑以较低的速度运行这个特定的进程 我试过计时器,但不行:当处理小的时间间隔时,进程无法准确地跟踪时间(我需要跟踪毫秒,而且无法整洁地完成) 此外,为了计算时间间隔,您可能会损失一些CPU时间 请记住,我不是外包给社区,我是自己工作的,但也许你们可以帮助集思广益:) 根据我从您的问题和评论中了解到的情况,您需要以12.5HzCPU运行程序。我可以考虑单步执行指
12.5Hz
CPU运行程序。我可以考虑单步执行指令,很像调试器,但它不是等待您单步执行指令,而是在每个时间延迟执行每个指令(很像您所说的尝试)所以,如果这个前提是错误的,请告诉我,我将删除我的答案,因为它是基于这个前提的。
想法
如果您的时钟计数为80ms
,则意味着每个80ms
至少可以执行一条指令。不幸的是,函数在几秒钟内只接受unsigned int
参数,所以这不起作用。然而,还有一个系统调用,它允许您调整睡眠时间
所以,要将毫秒转换为纳秒,你将它乘以106,这将给你睡眠时间8000000纳秒。正如你已经提到的,调用函数和模拟器的时间会浪费一些时间,但我认为这是你为模拟器所付出的代价(你可以随时调整时间,做出更精细的调整)。因此,nanosleep
是:
#include <time.h>
int nanosleep(const struct timespec *req, struct timespec *rem);
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
要组装、链接、运行并查看结果,请执行以下操作:
$ as -o fat.o fat.s
$ ld -o fat fat.o
$ ./fat
$ echo $?
120
$
因此,它工作并计算5的阶乘。所以,如果我在数学上是对的,在12.5Hz的CPU上运行65条指令需要65/12.5
秒,对吗<代码>65/12.5=5.2
$ time ./lower ./fat
Emulating 12.50 Hz to proccess ./fat...
Returned: 30720
real 0m5.211s
user 0m0.000s
sys 0m0.008s
手册参考
.section .data
.section .text
.globl _start
.globl factorial
_start:
pushq $5
call factorial
movq %rax, %rdi
movq $0x3c, %rax
syscall
.type factorial, @function
factorial:
pushq %rbp
movq %rsp, %rbp
movq 16(%rbp), %rax
cmpq $1, %rax
je end_factorial
decq %rax
pushq %rax
call factorial
movq 16(%rbp), %rbx
imulq %rbx, %rax
end_factorial:
movq %rbp, %rsp
popq %rbp
ret
$ as -o fat.o fat.s
$ ld -o fat fat.o
$ ./fat
$ echo $?
120
$
$ time ./lower ./fat
Emulating 12.50 Hz to proccess ./fat...
Returned: 30720
real 0m5.211s
user 0m0.000s
sys 0m0.008s