c-如何正确使用nanosleep()以特定频率运行代码



我正在为6502 CPU制作一个模拟器,我想控制它运行的频率。

在没有任何延迟的情况下,我的最大平均频率约为70-80MHz。然而,当我试图使用纳米睡眠来控制频率时,它只工作到我达到1毫秒的延迟(1000000纳秒(。如果我试图将延迟设置得更低,例如为.1 mS,它不会改变平均执行时间。对我来说奇怪的是,如果我将延迟设置为.1 mS,实际延迟为~0.008 mS,并且在1-99999 nS范围内的任何值都不会改变。

我已经尝试在调试和发布模式下编译代码

我用错纳米睡眠了吗?这是我第一次使用nanosleep,我以前只使用过sleep和usleep,所以我有点困惑。有没有更好的方法来控制代码执行的频率?

如何正确使用nanosleep((以特定频率运行代码?

我说,使用nanosleep以特定频率运行代码是不可能的(或者,有可能在一定的漂移下达到一定的精度?(。从man nanosleep强调我,但整体相关:

nanosleep((函数将导致当前线程暂停执行,直到指定的时间间隔通过rqtp参数已经过去或信号被传递到调用线程,它的操作是调用信号捕获函数或终止该过程由于参数值四舍五入,暂停时间可能比请求的时间长到睡眠分辨率的整数倍,或者由于系统对其他活动的调度。但是,除了在被信号中断的情况下,暂停时间应不小于通过系统时钟clock_REALTIME。

有没有更好的方法来控制代码执行的频率?

使用定时器并尝试依赖内核来正确安排周期性执行,而不是自己执行。使用timer_create在指定的超时后请求中断,并在该超时后运行代码,您还可以考虑将进程设置为实时进程。在伪代码中,我想我会:

void timer_thread(union sigval s) {
do_your_code();
}
int main() {
timer_t t;
timer_create(CLOCK_MONOTONIC, &(struct sigevent){
.sigev_notify = SIGEV_THREAD,
.sigev_notify_function = timer_thread
}, &t);
timer_settime(t, &(struct itimerspec){{.tv_sec = 1},{.tv_sec = 1}}, 0);
while (1) {
// just do nothing - code will be triggered in separate thread by timer
pause();
}
}

最新更新