如何正确使用 nanosleep() 以 运行 特定频率的代码?
How to correctly use nanosleep() to run code at specific frequency?
我正在为 6502 CPU 制作一个模拟器,我想控制它的频率 运行。
没有任何延迟,我的最大平均频率约为 70-80 MHz。但是,当我尝试使用 nanosleep 来控制频率时,它只能在我达到 1 mS 延迟(1000000 nS)之前起作用。
如果我尝试将延迟设置得更低,例如设置为 0.1 毫秒,它不会改变平均执行时间。令我感到奇怪的是,如果我将延迟设置为 .1 mS,实际延迟结果为 ~.008 mS,并且对于 1-99999 nS 范围内的任何值都不会改变。
我试过在调试和发布模式下编译代码
我是不是用错了nanosleep?这是我第一次使用nanosleep,我之前只用过sleep和usleep,所以我有点困惑。
有没有更好的方法来控制代码执行的频率?
How to correctly use nanosleep() to run code at specific frequency?
我说不可能在特定频率下使用 nanosleep
到 运行 代码(或者,有可能达到一定的精度但有一些漂移?)。来自 man nanosleep
强调我的,但整体是相关的:
The nanosleep() function shall cause the current thread to be suspended from execution until either the time interval specified
by the rqtp argument has elapsed or a signal is delivered to the calling thread, and its action is to invoke a signal-catching
function or to terminate the process. The suspension time may be longer than requested because the argument value is rounded up
to an integer multiple of the sleep resolution or because of the scheduling of other activity by the system. But, except for the
case of being interrupted by a signal, the suspension time shall not be less than the time specified by rqtp, as measured by the
system clock CLOCK_REALTIME.
Is there any better way to control the frequency of code execution?
使用定时器并尝试依靠内核来正确安排定期执行,而不是自己动手。使用 timer_create
在指定的超时后请求中断,并在该超时后使用 运行 您的代码,您也可以考虑使您的进程成为 real-time 进程。在伪代码中我想我会:
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();
}
}
我正在为 6502 CPU 制作一个模拟器,我想控制它的频率 运行。
没有任何延迟,我的最大平均频率约为 70-80 MHz。但是,当我尝试使用 nanosleep 来控制频率时,它只能在我达到 1 mS 延迟(1000000 nS)之前起作用。 如果我尝试将延迟设置得更低,例如设置为 0.1 毫秒,它不会改变平均执行时间。令我感到奇怪的是,如果我将延迟设置为 .1 mS,实际延迟结果为 ~.008 mS,并且对于 1-99999 nS 范围内的任何值都不会改变。
我试过在调试和发布模式下编译代码
我是不是用错了nanosleep?这是我第一次使用nanosleep,我之前只用过sleep和usleep,所以我有点困惑。 有没有更好的方法来控制代码执行的频率?
How to correctly use nanosleep() to run code at specific frequency?
我说不可能在特定频率下使用 nanosleep
到 运行 代码(或者,有可能达到一定的精度但有一些漂移?)。来自 man nanosleep
强调我的,但整体是相关的:
The nanosleep() function shall cause the current thread to be suspended from execution until either the time interval specified by the rqtp argument has elapsed or a signal is delivered to the calling thread, and its action is to invoke a signal-catching function or to terminate the process. The suspension time may be longer than requested because the argument value is rounded up to an integer multiple of the sleep resolution or because of the scheduling of other activity by the system. But, except for the case of being interrupted by a signal, the suspension time shall not be less than the time specified by rqtp, as measured by the system clock CLOCK_REALTIME.
Is there any better way to control the frequency of code execution?
使用定时器并尝试依靠内核来正确安排定期执行,而不是自己动手。使用 timer_create
在指定的超时后请求中断,并在该超时后使用 运行 您的代码,您也可以考虑使您的进程成为 real-time 进程。在伪代码中我想我会:
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();
}
}