C++ 如何在C中以较低的时钟速度运行程序

C++ 如何在C中以较低的时钟速度运行程序,c++,c,C++,C,我需要模拟一个硬件的工作方式(不适用于视频游戏) 这个组件的运行频率为1GHz,而我的电脑的运行频率为2.5和2.7GHz 所以我试图告诉电脑以较低的速度运行这个特定的进程 我试过计时器,但不行:当处理小的时间间隔时,进程无法准确地跟踪时间(我需要跟踪毫秒,而且无法整洁地完成) 此外,为了计算时间间隔,您可能会损失一些CPU时间 请记住,我不是外包给社区,我是自己工作的,但也许你们可以帮助集思广益:) 根据我从您的问题和评论中了解到的情况,您需要以12.5HzCPU运行程序。我可以考虑单步执行指

我需要模拟一个硬件的工作方式(不适用于视频游戏)

这个组件的运行频率为1GHz,而我的电脑的运行频率为2.5和2.7GHz

所以我试图告诉电脑以较低的速度运行这个特定的进程

我试过计时器,但不行:当处理小的时间间隔时,进程无法准确地跟踪时间(我需要跟踪毫秒,而且无法整洁地完成) 此外,为了计算时间间隔,您可能会损失一些CPU时间

请记住,我不是外包给社区,我是自己工作的,但也许你们可以帮助集思广益:)

根据我从您的问题和评论中了解到的情况,您需要以
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

手册参考

也许对你有用。否则,您可能可以使用虚拟mchine解决此问题。您可以尝试使用虚拟机。无论如何,我认为你的问题在这里是离题的。获得一个时钟功能不足的现代主板,问题得到解决,但你的目标架构是否与你的PC相同,只是时钟频率不同?它与1GHz的ARM和1GHz的intel不太兼容,甚至intel在每一代中都有所不同。您是否试图模拟一个硬件在1GHz的固定时钟下做一些事情?如果是这样,即使在1GHz时钟CPU上运行您的程序也无法保证您的仿真/模拟具有固定的1GHz锁定步长。那么,以30美元左右的价格购买1GHz ARM设备是您唯一的选择。当您以2.5GHz运行时,没有任何其他解决方案(包括虚拟机)会让您产生以1GHz运行的错觉(…并可与其他平台协作)。虚拟机和计时器一样,受调度精度和调度量的影响。对于长时间、计算密集型任务,您最多只能粗略地模拟一个大致的总体数字,但这根本不适用于响应性。
 .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