如何在Linux用户空间中实现高精度定时器?

2024-01-18

我的 BeagleBoard 上安装了 Angstrom Linux。

我想实现非常精确的计时器,每 500us 触发一次。我读到hrtimers,但我发现的所有实现都是针对内核空间的。我想在用户空间中实现它。

有没有可以调用这些的APIhrtimers,我可以在用户空间中使用它,或者在 Linux 中实现精确计时器的任何其他方式?

我已经设置了jiffy到几纳秒。


最后,经过一番努力,我找到了一个建议使用的代码timer_create(), clock_gettime()与信号处理(处理 SIGALRM)结合使用,类似于巴西尔·斯塔林科维奇在他的评论中建议。

我在我的 1 GHz Beaglebone 时钟类型上尝试过CLOCK_MONOTONIC间隔500us。

Out of 10000定时器到期的次数,2%当时,正好是 500us(我忽略了纳秒的差异)。和96.6%的时间范围内500 +/- 10us。其余时间,平均误差不超过+/- 50us。

这是代码的链接 https://web.archive.org/web/20160911022409/http://open-nandra.com/2008/12/testing-posix-high-resolution-timers/

我在这里发布了稍微修改过的代码版本。我对代码做了以下修改:

  1. 对于小间隔 ~10uscount正在无限减少,因此我添加了对测试数量的控制(count)在信号处理程序本身内部。

  2. 添加一个printf在运行计时器的过程中会花费很多时间。因此,我将时间差存储在一个数组中,然后在最后,即在上次测试之后,我打印了所有内容。

  3. 我想计算时间差unsigned long(即以纳秒为单位)比计算更好double(以秒为单位),因为它更准确并且可能更快。因此我修改了timerdiff宏以纳秒为单位输出差异。由于我使用 500us 或更短的间隔,因此差异永远不会超出范围unsigned long.

正如您所看到的,即使在修改后,也只有 2% 的结果精确到

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <sys/types.h>
#include <signal.h>
#include <unistd.h>

#define NSEC_PER_SEC 1000000000L

#define MAX_TESTS    10000

#define timerdiff(a,b) (((a)->tv_sec - (b)->tv_sec) * NSEC_PER_SEC + \
(((a)->tv_nsec - (b)->tv_nsec)))

static struct timespec prev = {.tv_sec=0,.tv_nsec=0};
static int count = MAX_TESTS;
unsigned long diff_times[MAX_TESTS];

void handler( int signo )
{
    struct timespec now;
    register int i, correct=0;

    if(count >= 0)
    {
        clock_gettime(CLOCK_MONOTONIC, &now);
        diff_times[count]=timerdiff(&now, &prev);
        prev = now;
        count --;
    }

    else
    {
        for(i=0; i<MAX_TESTS; ++i)
        {
            if(diff_times[i]/1000 < 510 && diff_times[i]/1000 > 490)
            {
                printf("%d->\t", i);
                correct++;
            }
            printf("%lu\n", diff_times[i]);
        }
        printf("-> %d\n", correct);
        exit(0);
    }
}

int main(int argc, char *argv[])
{
    int i = 0;
    timer_t t_id;

    struct itimerspec tim_spec = {.it_interval= {.tv_sec=0,.tv_nsec=500000},
                    .it_value = {.tv_sec=1,.tv_nsec=0}};

    struct sigaction act;
    sigset_t set;

    sigemptyset( &set );
    sigaddset( &set, SIGALRM );

    act.sa_flags = 0;
    act.sa_mask = set;
    act.sa_handler = &handler;

    sigaction( SIGALRM, &act, NULL );

    if (timer_create(CLOCK_MONOTONIC, NULL, &t_id))
        perror("timer_create");

    clock_gettime(CLOCK_MONOTONIC, &prev);

    if (timer_settime(t_id, 0, &tim_spec, NULL))
        perror("timer_settime");

    while(1);

    return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Linux用户空间中实现高精度定时器? 的相关文章

  • 我想在 Red Hat Linux 服务器中执行 .ps1 powershell 脚本

    我有一个在窗口中执行的 ps1 powershell 脚本 但我的整个数据都在 Linux 服务器中 有什么可能的方法可以让我在红帽服务器中执行 powershell 脚本 powershell脚本是 Clear Host path D D
  • 一段时间后完成活动

    我正在尝试开发一个类似匹配小图片的游戏 我的问题是我想在一段时间后完成游戏 例如 在第 1 级中 我们有 10 秒的时间来匹配图片 我也想显示剩余时间 如果有任何帮助 我将不胜感激 既然你还想显示倒计时 我会推荐一个倒计时器 http de
  • 任何退出 bash 脚本但不退出终端的方法

    当我使用exitshell 脚本中的命令 该脚本将终止终端 提示符 有什么方法可以终止脚本然后停留在终端中吗 我的剧本run sh预计通过直接获取或从另一个脚本获取来执行 编辑 更具体地说 有两个脚本run2 sh as run sh ec
  • 使用脚本检查 git 分支是否领先于另一个分支

    I have branch1 and branch2我想要某种 git branch1 isahead branch2 这将显示如果branch1已承诺branch2没有 也可能指定这些提交 我无法检查差异原因branch2 is在之前br
  • 在 scapy 中通过物理环回发送数据包

    我最近发现了 Scapy 它看起来很棒 我正在尝试查看 NIC 上物理环回模块 存根上的简单流量 但是 Scapy sniff 没有给出任何结果 我正在做的发送数据包是 payload data 10 snf sniff filter ic
  • 在ubuntu中打开spyder

    我想在ubuntu中打开spyder Python IDE 通常我会在 shell 中编写 spyder 它会打开spyder IDE 现在 当我在shell中编写spyder时 它只是换行 什么也没有发生 类似于按 enter 我如何找回
  • Python:threading.timer不尊重间隔

    这是后续另一个问题 https stackoverflow com questions 32286049 python accept input while waiting 我现在有了一个解决方案 但由于不相关的原因 实现似乎没有正常运行
  • 更新Linux中的包含路径

    我的 my path to file 文件夹中有几个头文件 我知道如何将这些文件包含在新的 C 程序中 但每次我都需要在包含它之前输入头文件的完整路径 我可以在linux中设置一些路径变量 以便它自动查找头文件吗 您可以创建一个 makef
  • 为什么 OS X 和 Linux 之间的 UTF-8 文本排序顺序不同?

    我有一个包含 UTF 8 编码文本行的文本文件 mac os x cat unsorted txt foo foo 津 如果它有助于重现问题 这里是文件中确切字节的校验和和转储 以及如何自己生成文件 在 Linux 上 使用base64 d
  • Linux shell 从用户输入中获取设备 ID

    我正在为一个程序编写安装脚本 该程序需要在其配置中使用 lsusb 的设备 ID 因此我正在考虑执行以下操作 usblist lsusb put the list into a array for each line use the arr
  • Ubuntu Python shebang 线不工作

    无法让 shebang 线在 Ubuntu 中为 python 脚本工作 我每次只收到命令未找到错误 test py usr bin env python print Ran which python usr bin python 在 sh
  • beagleboneBlack 上的 buildroot 有什么用处?

    我不明白beaglebone black这样的卡买来时有Linux系统 buildroot是什么原因 buildroot有什么用 构建一个完全定制的 轻量级的 快速启动的嵌入式 Linux 系统
  • ioctl 命令的用户权限检查

    我正在实现 char 驱动程序 Linux 并且我的驱动程序中有某些 IOCTL 命令仅需要由 ADMIN 执行 我的问题是如何在 ioctl 命令实现下检查用户权限并限制非特权用户访问 IOCTL 您可以使用bool capable in
  • 仅使用containerd(不使用Docker)修剪容器镜像

    如果我刚刚containerd安装在 Linux 系统上 即 Docker 是not安装 如何删除未使用的容器映像以节省磁盘空间 Docker 就是这么方便docker system prune https docs docker com
  • 如何在 Flutter App 中按时间注销?

    如果用户在登录后对应用程序没有反应或不活动超过 5 分钟 我需要从应用程序中注销用户 该应用程序将转到主登录页面 我尝试实施给定的解决方案here https stackoverflow com questions 52602606 how
  • STM32F4 定时器 - 计算周期和预分频,以生成 1 ms 延迟

    我在用STM32F407VGT6 with CubeMX 因此 我从通用定时器开始 但我被预分频值和周期值所困扰 基本上我想每隔一段时间生成一个定时器中断n 其中 n 1 2 3 ms 并执行一些任务 计算周期和预分频值的公式有很多变化 公
  • 为什么 Linux 没有 DirectX API?

    在考虑现代显卡的 Windows 系统上 DirectX API 的驱动程序端实现时 我想知道为什么此实现在非 Windows 系统 尤其是 Linux 上不可用 由于明显缺乏此功能 我只能假设有一个我无视的充分理由 但在我的原始理解中 我
  • linux下无法创建僵尸进程

    嗯 我有一个奇怪的问题 我无法在我的项目中创建僵尸进程 但我可以在其他文件中创建僵尸进程 有简单的说明 int main if fork 0 printf Some instructions n else sleep 10 wait 0 r
  • 如何为 Linux 桌面条目文件指定带有相对路径的图标?

    对于我的一个 Linux 应用程序 我有应用程序二进制文件 一个 launcher sh 脚本 针对 LD LIBRARY PATH 和一个 desktop 文件 所有这些都位于同一文件夹中 我想使用图标的相对路径而不是绝对路径 我试过了
  • 在 Delphi 中编程延迟的最佳方法是什么?

    我正在开发的 Delphi 应用程序必须延迟一秒 有时甚至两秒 我想使用最佳实践来对此延迟进行编程 在阅读 stackoverflow 上有关 Delphi Sleep 方法的条目时 我发现了以下两条评论 我遵循这样的格言 如果你觉得需要使

随机推荐

  • jsp缓存标签库

    我想缓存 JSP 页面的某些部分 因为渲染起来很繁重 整个页面无法缓存 因为它包含用户特定的内容 但大部分页面可以 我认为最好的解决方案是创建一个 JSP 缓存标记 似乎有几种解决方案 但大多数项目都已死亡或被放弃 http www ope
  • 如何使用 FosRestBundle 公开函数结果?

    我正在使用 Symfony2 和 FosRestBundle 为我们的系统开发 REST API FosRestBundle 是一个非常好的工具 但它似乎有一个限制 只有属性 私有 受保护和公共 可以暴露给 API 我想公开一个基于其他两个
  • 在 Python 中将 UTF-8 转换为字符串文字

    我有一个 UTF 8 格式的字符串 但不太确定如何将此字符串转换为其相应的字符文字 例如我有字符串 我的字符串是 Entre xc3 xa9 示例一 这段代码 u Entre xc3 xa9 encode latin 1 decode ut
  • Tkinter 复选框/组合框下拉列表

    我正在尝试用 Python 创建一个后处理数据应用程序 并使用 Tkinter 为其设计 GUI 我不知道 Tkinter 是否支持由复选框组成的下拉列表 然后您可以从中选择多个框 下图反映了我试图描述的内容 这可能吗 这并不完全是您想要的
  • .NET 中的视频会议

    我正在向我们的一款软件添加聊天功能 我已经使用 WCF 启动并运行了聊天功能 我正在考虑尝试使用 WCF 再次添加视频聊天功能 基本上我将发送视频流 而不是发送客户端消息 我想知道是否有人用 WCF 做过这个 是否非常推荐使用 WCF 来执
  • 有没有办法在 Perl 中使用“常量”作为哈希键?

    有没有办法使用常量作为哈希键 例如 use constant X gt 1 my x X gt X 上面的代码将创建一个以 X 作为键而不是 1 作为键的哈希 然而 我想使用常量 X 的值作为键 use constant实际上制作了常量子程
  • Ruby Openid 连接库与客户端消费示例

    我正在寻找 ruby openid connect 客户端库以及使用它的直接代码示例 我找到了一个图书馆here https github com nov openid connect它的示例基于 Rails 但我对 Rails 不太熟悉
  • 为什么linux在内核代码持有自旋锁后禁用内核抢占?

    我是 Linux 新手 正在阅读 Rubini Corbet 撰写的 Linux 设备驱动程序书籍 我对与以下相关的一项声明感到困惑spinlocks 书中指出 如果非抢占式单处理器系统曾经进入 旋转一把锁 它会永远旋转 没有其他线程能够获
  • Java字符串搜索忽略重音符号

    我正在尝试为我的应用程序编写一个过滤函数 该函数将采用输入字符串并过滤掉以某种方式与给定输入不匹配的所有对象 最简单的方法是使用 String 的 contains 方法 即仅检查对象 对象中的 String 变量 是否包含过滤器中指定的字
  • 在 WHERE 子句中使用 mysql concat() ?

    我想搜索我的表 其中包含一列名字和一列姓氏 我目前接受一个字段中的搜索词 并将其与两列进行比较 一次一个 select from table where first name like search term or last name li
  • 有没有检查 CLS 合规性的工具?

    有没有一个工具可以分析我的 NET 代码 C 和VB NET http en wikipedia org wiki Visual Basic NET 然后告诉我why东西不符合 CLS Visual Studio 很高兴地告诉我一个参数不符
  • 如何只为 pandas 中数据帧的某些列绘制直方图

    这是我拥有的数据 在此输入图像描述 https i stack imgur com EwuSA png 假设我有一个名为 df 的变量中的数据框 如果我执行 df hist 它将为数据框中的每个类别显示一个直方图 但我只想为从类别 1 到类
  • 从 docker-compose 中退出代码打破 while 循环

    我有一个案例 有一个 WordPress 项目 我应该在其中创建一个脚本来更新插件并将源代码更改提交到单独的分支 在这样做时我遇到了一个奇怪的问题 输入变量 akimset 4 0 3 all in one wp migration 6 7
  • 在一条消息 MQTT 中发布多个主题

    我有一个设备可以从不同的传感器收集大量数据 我想通过一条消息将它们发送给我的经纪人 在客户端 我只想在给定时间查看其中一些数据 我不想看到全部数据 我可以在一条消息中发布多个主题 然后在客户端只能看到其中的一些主题吗 我知道我可以使用通配符
  • 如何在打印事件上触发javascript?

    当用户打印页面时是否可以触发javascript事件 当用户选择打印页面时 我想删除对 j avascript 库的依赖 因为该库非常适合屏幕但不适合打印 知道如何实现这一目标吗 对于任何从谷歌偶然发现这个答案的人 让我尝试澄清一下 正如
  • Couchbase/N1QL:从参数提供的值列表中选择

    作为后续从集合中按 类别 获取顶部行 https stackoverflow com questions 72447539 get top rows by category from a collection我仍然想获取每个类别 ID 的前
  • Azure WebJobs - 在哪里托管?它们作为长时间运行的进程安全吗?

    From Azure 网站始终在线 https stackoverflow com questions 26578934 azure website always on and Azure 网站上 始终开启 设置的含义 https stac
  • Android viewModel 保存的StateHandle

    这更多的是一个概念性问题 Android 最近引入了在 viewModel 内部处理进程死亡期间状态的概念 而不是savedInstanceState以前位于 Activity 或 Fragment 中 我的问题是如何测试这个进程的死亡 如
  • 如何在 Robot Framework 中标记数据驱动模板测试

    我有很多数据驱动的测试 这样我就可以对多行 数据运行相同的测试 效果很好 但是 我们还使用 TestRail 并通过 RF 测试上的标签将 RF 测试链接到 TestRail 目前我只为每个模板标记一个 TestRailID 例如 Test
  • 如何在Linux用户空间中实现高精度定时器?

    我的 BeagleBoard 上安装了 Angstrom Linux 我想实现非常精确的计时器 每 500us 触发一次 我读到hrtimers 但我发现的所有实现都是针对内核空间的 我想在用户空间中实现它 有没有可以调用这些的APIhrt