Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何正确使用nanosleep()以特定频率运行代码?_C_Delay - Fatal编程技术网

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

C 如何正确使用nanosleep()以特定频率运行代码?,c,delay,C,Delay,我正在为6502CPU做一个模拟器,我想控制它运行的频率 没有任何延迟,我的最大平均频率约为70-80 MHz。然而,当我尝试使用nanosleep来控制频率时,它只能在达到1毫秒延迟(1000000纳秒)之前工作。 如果我尝试将延迟设置得更低,例如设置为.1毫秒,则不会更改平均执行时间。对我来说奇怪的是,如果我将延迟设置为.1毫秒,实际延迟结果是~.008毫秒,并且在1-9999ns范围内的任何值都不会改变 我尝试过在调试和发布模式下编译代码 我用纳米睡眠错了吗?这是我第一次使用nanosle

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

没有任何延迟,我的最大平均频率约为70-80 MHz。然而,当我尝试使用nanosleep来控制频率时,它只能在达到1毫秒延迟(1000000纳秒)之前工作。 如果我尝试将延迟设置得更低,例如设置为.1毫秒,则不会更改平均执行时间。对我来说奇怪的是,如果我将延迟设置为.1毫秒,实际延迟结果是~.008毫秒,并且在1-9999ns范围内的任何值都不会改变

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

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

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

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

函数的作用是:在指定的时间间隔之前,暂停当前线程的执行 由rqtp参数已过或信号已传递给调用线程,其操作是调用信号捕获 函数或终止进程暂停时间可能比请求的时间长,因为参数值向上舍入 为睡眠分辨率的整数倍,或由于系统安排了其他活动。但是,除了 如果被信号中断,暂停时间应不小于rqtp规定的时间,如 系统时钟为实时时钟

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

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

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();
   }
}
如何正确使用nanosleep()以特定频率运行代码

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

函数的作用是:在指定的时间间隔之前,暂停当前线程的执行 由rqtp参数已过或信号已传递给调用线程,其操作是调用信号捕获 函数或终止进程暂停时间可能比请求的时间长,因为参数值向上舍入 为睡眠分辨率的整数倍,或由于系统安排了其他活动。但是,除了 如果被信号中断,暂停时间应不小于rqtp规定的时间,如 系统时钟为实时时钟

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

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

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();
   }
}

请发布包含函数调用和变量声明的代码。请改用计时器。睡眠不是周期性地运行代码的方式。如果你需要很好地控制时间,你需要检查自上次滴答声以来经过的实际时间,而不是仅仅假设(nano)睡眠是完全准确的。一旦你的进程被取消调度的时间超过了你的计时持续时间(除非你也像Kamil的回答中那样使用realtime scheduler类),你还需要处理掉错过的计时。我想一次计算1024步或类似的步骤然后再睡觉会更聪明,否则,睡眠的开销比实际工作要昂贵得多。您应该计算(虚拟)CPU周期,并使用可变延迟(可能是循环或其他机制),使周期与所经过的时间一致,以获得准确的频率。有一个定期检查虚拟CPU周期数的计时器,如果CPU运行过快,则增加延迟,过慢,然后减少延迟。或者,计算一个精确的周期数,看看经过了多少实时时间。请发布包含函数调用和变量声明的代码。改用计时器。睡眠不是周期性地运行代码的方式。如果你需要很好地控制时间,你需要检查自上次滴答声以来经过的实际时间,而不是仅仅假设(nano)睡眠是完全准确的。一旦你的进程被取消调度的时间超过了你的计时持续时间(除非你也像Kamil的回答中那样使用realtime scheduler类),你还需要处理掉错过的计时。我想一次计算1024步或类似的步骤然后再睡觉会更聪明,否则,睡眠的开销比实际工作要昂贵得多。您应该计算(虚拟)CPU周期,并使用可变延迟(可能是循环或其他机制),使周期与所经过的时间一致,以获得准确的频率。有一个定期检查虚拟CPU周期数的计时器,如果CPU运行过快,则增加延迟,过慢,然后减少延迟。或者,计算一个精确的周期数,并查看经过了多少实时时间。