- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我一直在将嵌入式 linux 程序的主循环转换为在服务器上运行,其中一个好处是可以在非 root 用户下运行。该程序负责定期从网络设备请求 IO 扫描 - 每 2 毫秒一次。今天我用调用 nanosleep 代替了/dev/rtc 的使用。在这种特殊情况下,我们可以避免大量延迟,但我想知道当我们在具有更严格的时序要求的嵌入式设备上运行时,是否可以保留 nanosleep 调用(大型项目就是这种情况) ).性能有很大差异吗?
最佳答案
这取决于 Linux 内核版本。来自 time(7) 联机帮助页:
High-Resolution Timers Before Linux 2.6.21, the accuracy of timer and sleep system calls (see below) was also limited by the size of the jiffy. Since Linux 2.6.21, Linux supports high-resolution timers (HRTs), optionally configurable via CON‐ FIG_HIGH_RES_TIMERS. On a system that supports HRTs, the accuracy of sleep and timer system calls is no longer constrained by the jiffy, but instead can be as accurate as the hardware allows (microsec‐ ond accuracy is typical of modern hardware).
注意:“jiffy”是“Greg”的回答中提到的定时器滴答频率。另请注意,this 引用的系统调用包括 nanosleep()。
也就是说,如果您的嵌入式目标上有足够新的内核版本,nanosleep() 应该足够好。如果您有较旧的内核版本,您确实会受到时钟节拍频率的限制,在这种情况下,您可能会遇到问题,因为 2 毫秒非常接近 CONFIG_HZ=1000 的 1 毫秒节拍频率。
关于c - nanosleep 和/dev/rtc 的性能差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7090575/
我正在尝试在 Linux 中使用库插入来 Hook 函数调用。我捕捉得很好,但有些情况我遗漏了……其中一个是 nanosleep()。我正在挂接的二进制文件每隔一秒就会使用此函数使线程休眠...如果我
我正在查看来自嵌入式 MIPS Linux 应用程序的核心转储。 GDB 正在报告 SIGBUS,并且处理信号的线程似乎位于 nanosleep 的系统调用中 - 更高级别的代码基本上称为 sleep
我有一个使用 nanosleep 的程序(混合了 C 和 Fortran,虽然这似乎不相关)。但是,如果我的 timespec 的 tv_sec 值为 0,它就不会休眠。 tv_nsec 值可能比整秒
在我的工作场所中的并发代码中,多次发生具有非零常量的nanosleep()或usleep(),以释放CPU而不依赖于futex(),或者使用 sleep 同步原语使线程进入休眠状态(例如例如,等待并发
我需要使用 nanosleep我的用户空间线程库中的函数来实现大约所需数量的等待,因为它可以在异步信号中断的情况下节省剩余时间。我使用 SIGALRM 抢先切换线程;因此,重要的是要考虑使用不可重入函
我编写了以下代码,以 0.3 秒的间隔逐个字符地打印段落。但是当我编译并运行它时,它会在句子中打印所有内容。为什么纳秒函数不起作用? #include #include #include #in
我在 while 循环中有一个 nanosleep 函数。这是我在《Linux系统编程:直接与内核和C库对话》一书中找到的一个例子 while(nanosleep(a, b) && errno
这段代码会做什么? struct timespec wait; wait.tv_sec = 0; wait.tv_nsec = 0; nanosleep(&wait, NULL); 或 ... c
我想知道 sleep/nanosleep 内部是如何实现的?考虑这段代码: { // on a thread other than main() thread while(1) { /
我正在使用 nanosleep 将进程停止一段时间。如何在要求的时间之前中断 nanosleep?谢谢! 最佳答案 如@Kerrek SB 所述,设置一个信号处理程序来处理 SIGUSR1,使用 ki
我注意到一个调用 nanosleep 的小测试程序在内核高于 2.6.22 的 Linux 机器上运行时显示 CPU 使用率的巨大差异。 #include int main (void) {
Unix 有多种 sleep API(sleep、usleep、nanosleep)。我所知道的唯一用于 sleep 的 Win32 函数是 Sleep(),它以毫秒为单位。 我看到大多数 sleep
我正在尝试在我的代码中测试 nanosleep 的性能。当我调用 nanosleep 并在 0 秒和 0 纳秒内传递时,与甚至不调用 nanosleep 相比,我得到了不同的值。如果我用 0 作为参数
我想在我的代码中用 nanosleep 替换过时的 usleep 函数: static int timediff( struct timeval *large, struct timeval *sma
我在使用 Linux 的 nanosleep 系统调用时遇到了一些问题。这段代码应该在退出前等待 2 秒,但它并没有: .text .globl _start _start: pushq %rbp m
我在 g++ 中编译了以下测试,nanosleep 太长了,它需要 60 微秒完成,我预计它只花费不到 1 微秒: int main() { gettimeofday(&startx, NUL
我想用我的 RaspberryPi 3 驱动步进电机。我需要每秒生成大约 10000 个脉冲,这意味着我需要以大约 100us 的间隔生成脉冲。我知道 Raspberry 可以生成 PWM,但事实并非
我有一个 C 程序,它使用 for(;;) 从/向套接字执行接收/发送操作。循环和一个 select()监视文件描述符。我还需要这个程序每 80 毫秒向一个数据包发送一个数据包,我该如何实现呢?也许我
我有 2 个与 C 语言 Linux 系统编程相关的理论问题,关于 nanosleep 和进程破坏。 所以,第一个: 仅使用nanosleep就可以使CPU负载达到97%。例如,让我们考虑一个在子进程
这个问题在这里已经有了答案: How to use nanosleep for sleeping random amounts of time? (2 个答案) 关闭 8 年前。 我知道这是一个新手
我是一名优秀的程序员,十分优秀!