基于linux用C/C++实现微妙级别精准定时器

【C++】windows系统下的微秒定时器 【前言】由于项目需要,我需要一个微秒级别的定时器,windows自带的那个多媒体定时器完全不靠谱。这个问题拖了很久,直到我看了mongoDB的源码,发现他用了boost::xtime解决了这个问题。mongoDB源码里,Time_support.cpp这个文件实现了不少定时器功能。 Win32平台 #if defined(_WIN32) 秒级很简单,就是windows的Slee 阅读详情

实现精准定时器需要使用操作系统提供的高精度计时器,Linux中提供了POSIX定时器,可以满足微秒级别的需求。下面是一个简单的C/C++代码示例:

源码:

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

struct timeval tv;
//gettimeofday(&tv,NULL);
//printf("s:%ld\n",tv.tv_sec);  //秒
//printf("ms:%ld\n",tv.tv_sec*1000 + tv.tv_usec/1000);  //毫秒
//printf("us:%ld\n",tv.tv_sec*1000000 + tv.tv_usec);  //微秒
static int count = 0;

void timer_handler(int signum) {
    if(count % 999 == 0) //1000次打印一次时间
    {
        gettimeofday(&tv,NULL);
        printf("ms:%ld\n",tv.tv_sec*1000 + tv.tv_usec/1000);  //毫秒
    }
    printf("%d ",count++);
}

int main(void) {
    timer_t timerid;
    struct sigevent sev;
    struct itimerspec its;
    struct sigaction sa;

    // 设置定时器信号处理函数
    sa.sa_flags = SA_SIGINFO;
    sa.sa_sigaction = timer_handler;
    sigemptyset(&sa.sa_mask);
    sigaction(SIGRTMIN, &sa, NULL);

    // 创建定时器
    sev.sigev_notify = SIGEV_SIGNAL;
    sev.sigev_signo = SIGRTMIN;
    sev.sigev_value.sival_ptr = &timerid;
    timer_create(CLOCK_REALTIME, &sev, &timerid);

    // 设置定时器参数
    its.it_value.tv_sec = 1;         // 初始延时1秒
    its.it_value.tv_nsec = 0;
    its.it_interval.tv_sec = 0;      // 定时周期为100微秒
    its.it_interval.tv_nsec = 100000;
    timer_settime(timerid, 0, &its, NULL);

    // 循环等待定时器信号
    while (1) {
        sleep(1);
    }

    return 0;
}

编译:

gcc demo.c -lrt

使用了POSIX定时器创建了一个精准定时器,定时周期为100微秒。在定时器信号处理函数中输出了定时器到期的信息。需要注意的是,该代码使用了Linux特有的实时信号SIGRTMIN,如果需要移植到其他平台上需要进行相应的修改。

Python控制Arduino与树莓派:从串口通信到智能小车实战 在嵌入式开发与硬件编程领域,Python凭借其简洁的语法和丰富的生态,正成为连接上位机与单片机的桥梁。无论是Arduino这类实时性强的微控制器,还是树莓派这类功能完整的Linux单板计算机,Python都能通过串口通信、GPIO控制等方式实现软硬件的协同工作。理解电平转换、PWM信号、主从式架构等基本原理,是构建稳定硬件系统的关键。从Arduino控制舵机、读取传感器,到树莓派OV5647摄像头模块进行图像采集与识别,再到结合Python量化交易策略代码实现7x24小时数据计算,Python硬件编程的应用 阅读详情

相关推荐

【信息科学与工程学】【运营科学】第二篇 C4信息与通信网络运营 (C4) ——数据中心网络运营04

典型值:λ1​∈[−0.02,−0.01], λ2​∈[−0.01,0], η1​,η3​∈[0.1,0.3], η2​,η4​∈[0.05,0.15]参数:δ1​∈[−0.8,−0.3], δ2​∈[−0.5,−0.2], δ3​∈[−0.4,−0.1], δ4​∈[−0.6,−0.2]参数:φ1​∈[0.1,0.3], φ2​∈[−0.2,−0.05], φ3​∈[−0.1,0.1], φ4​∈[−0.3,−0.1]参数:α∈[0.3,0.6], β∈[0.2,0.4], γ∈[0.01,0.03]

weixin_49199313的博客 1204

Linux环境下C++开发----4种定时任务方法

Linux环境下C++开发----4种定时任务方法

Warren++的博客 2816

【信息科学与工程学】计算机科学与自动化——第二十四篇 编译器04 LLVM编译器01

训推一体方案通过整合训练与推理流程,实现资源复用、效率提升和全链路自动化。以下从。

weixin_49199313的博客 1517

c++简单定时器实现

c++简单定时器实现。

yuanshenqiang的博客 4513

【Linux】C-C++ 一种简单易用的高效定时器实现.rar

一种基于条件变量的超时机制实现的较高精度又简单的定时器,经过实际测试验证可行。之所以利用条件变量的超时机制,是为了满足可以随时打断及时的需求,同时又不需要轮询的去查,在等待的过程中,线程处于阻塞休眠状态,所以也不消耗 CPU 资源。(信号量也可以)     该机制主要可以应用在一些要求可以随时取消和修改计时时间的场景,例如收到某条启动指令之后需要启动设备,当超过多长时间没有收到指令时就需要停止设备。优点吧,实现简单,精度较高,好用,不消耗 CPU 资源,支持单次和重复触发,并且各个定时器独立计时和执行,不影响其他定时器。缺点吧,就是有点耗内存了,启动 100 个定时器,就有 100 个线程(指的是100个定时器都没有超时)。     基本上可以满足大部分场景,如果比较庞大的系统需要上百个定时器计时,这种实现方式就不合适了,建议采用多级链表来实现,并且需要考虑定时器与定时器之间影响。

C++ 非阻塞式延时函数XSleep

// Function : XSleep() // Purpose : To make the application sleep for the specified time // duration. // Duration the entire time duration XSleep sleeps, it // keeps processing the message pump, to ensure that all // messages are posted and that the calling thread does // not appear to block all threads!

CMSIS-4静态工程评测:嵌入式底层契约的结构解构与迁移约束

CMSIS(Cortex Microcontroller Software Interface Standard)是ARM Cortex-M系列MCU软硬件协同的核心接口规范,其本质是定义处理器内核、编译器、RTOS与外设驱动之间稳定交互的ABI契约。CMSIS-4作为工业界广泛部署的成熟版本,虽被误读为‘过时标准’,实则承载着数亿设备的兼容性基线。其核心价值在于提供可预测的头文件结构、确定性宏展开、汇编级启动约束及DSP函数ABI,支撑裸机开发、实时系统移植与跨工具链构建。技术实践中,CMSIS-4的静态

weixin_34082695的博客 400

幸狐RV1106开发板实战:5分钟搞定Yolo8模型部署(附避坑指南)

本文详细介绍了在幸狐RV1106开发板上快速部署YOLOv8模型的实战流程。通过RKNN-Toolkit2工具链,将ONNX模型转换为RV1106 NPU专用的RKNN格式,并完成交叉编译与上板运行。文章重点分享了环境搭建、模型转换的关键步骤以及常见的避坑指南,帮助开发者高效实现边缘AI目标检测应用。

weixin_28677451的博客 912

Linux下C++定时器类Timer

Linux下C++定时器类Timer 前段时间在Linux上做了一个协议转换器,用的是C++。因为需要定时发送报文,所以找了许多Linux下定时器的实现方法,但基本都不太好用,一堆下划线也看得我一个头两个大。那怎么办?自己写一个。 1、思路 我比较喜欢简单的、面向对象的东西,所以肯定是要封成一个类,这样用的时候直接new出来就可以了,很方便。 这个定时器类的原理就是创建一个线程,在这个线程中去sleep,经过指定时间后触发回调,这样就达到定时器的效果。实现如下: 2、代码 .h #ifndef TIM

weixin_44001652的博客 2302

FPGA+CMV4000实战:从零搭建20fps成像系统的5个关键步骤(附避坑指南)

本文详细介绍了如何从零搭建基于FPGA和CMV4000传感器的20fps成像系统,涵盖硬件选型、SPI通信优化、LVDS数据采集、DDR2内存管理及系统集成等5个关键步骤。特别针对CMV4000传感器的SPI配置和高速数据处理的常见问题提供实用解决方案,帮助开发者避免常见陷阱,提升成像系统性能。

weixin_42628688的博客 427

从零构建智慧农业监测终端:STM32数据采集与LoRa组网实战

本文详细介绍了如何从零构建智慧农业监测终端,涵盖STM32数据采集与LoRa组网实战。通过DHT22温湿度传感器和YL-69土壤湿度传感器实现精准环境监测,结合LoRa无线传输技术解决偏远农田信号问题。文章还分享了硬件选型、电路设计、低功耗优化及Flutter跨平台应用开发等关键技巧,助力农业智能化升级。

weixin_29172963的博客 357

linux下实现定时器的三种简单方式

linux下简单实现定时器效果的几种方法

qq_51368339的博客 6373

【AUTOSAR-IpduM】-2.2-创建并配置一个接收RX的(Multiplexed-I-PDU)多路复用

案列背景: 在CFG中配置一个发送TX的(Multiplexed-I-PDU)多路复用Frame。 目录 1 在Arxml中创建一个发送的多路复用Frame 2 CFG导入带多路复用Frame的ARXML 2.1 CFG中提示的错误Error 2.2 如何解决CFG中提示的错误Error 3 结尾 <--返回「Autosar_BSW高阶配置」总目录--> <--返回「Autosar_BSW高阶配置」专栏主页--> <--返回「个人博客」首页--&g..

「汽车电子助手」的博客 1569

C++ 实现定时器的两种方法(线程定时和时间轮算法修改版)

定时器要求在固定的时间异步执行一个操作,比如boost库中的boost::asio::deadline_timer,以及MFC中的定时器。可以利用c++11的thread, mutex, condition_variable 来实现一个定时器。使用static以免被析构,可在cpp类外全局声明,第一个参数为任务容量最大数量,第二个参数为定时判断的毫秒数即最低检测时间单位。使用C++11中的thread, mutex, condition_variable来实现一个定时器。在要使用的地方,启动并添加任务。

Leckun的专栏 1万+

[Python + UG NX 二次开发新手教程] 第五课 采用Python / UF 开发模式

在 NX 二次开发里看到的“UF”是的缩写,它是 Siemens 提供的集合,也是整个 NX Open 体系里最贴近内核、历史最悠久的一套接口。相当于 NX 的“系统调用”——只要 NX 能做的事,UF 几乎都能调得动。Siemens 从 NX 12 开始把原来的 C 接口(UF)全部打包进了官方 Python 模块,命名空间为 NXOpen.UF.*,所以只要 NX 安装目录里带了 NXOpen\UF 子模块,就能在 Python 里直接调用 UF 函数。

温良 1003

如何给K8S配置一个具有永久有效的kubeconfig

在 Amazon EKS 环境中,Kubernetes 的认证机制与 AWS IAM 深度集成,通过aws-iam-authenticator动态生成临时凭证。这种设计虽然增强了安全性,但给需要持久化凭证的工具链(如 CI/CD 系统中的 KubeVela)带来了挑战。具体表现为:临时凭证失效​​:默认 Token 有效期为 15 分钟至 1 小时;​​IAM 角色限制​​:直接使用aws eks get-token生成的凭证无法持久化

小杨同学的博客 660

定时器-C++ Linux

时间轮

艾伦 772

Arduino 系列:Arduino Due 系列 (基于 ATSAM3X8E)_(5).电源管理与电压调节

电源管理与电压调节是确保嵌入式系统稳定性和可靠性的关键环节。通过合理选择电源输入方式、使用高效的电压调节器、设计适当的滤波电路和实施动态电源管理,可以有效提高系统的性能和寿命。同时,使用电源调试工具和编写调试代码,可以帮助开发者及时发现和解决问题。希望本文档能为使用 Arduino Due 的开发者提供有用的信息和指导。

2401_87715305的博客 1308

[linux c/c++] linux下定时器的使用

前言: linux下,定时器有两种实现: 1)使用alarm函数进行计时,alarm函数计时满后会发送ALARM信号,注册信号处理函数即可; 2)使用linux内核的原生timer,需要引入内核模块,头文件为linux/timer.h alarm: //功能描述:在5s内轮询产生的随机数(1s生产一个随机数),判断随机数是不是100的整数倍,如果是,则输出定时器剩余时间,如果不是,继续 #include <stdio.h> #include <signal.h&...

ykun089的博客 9612

11、基于STM32的智能药盒

当今时代是一个新技术层出不穷的时代,在电子领域尤其是自动化智能控制领域,传统的分立元件或数字逻辑电路构成的控制系统,正以前所未有的速度被单片机智能控制系统所取代。嵌入式具有体积小、功能强、成本低、应用面广等优点,可以说,智能控制与自动控制的核心就是单片机。

行走的皮卡丘 6099

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【Linux C/C++ 定时器接口设计】使用`timer_create` 和 `epoll`实现的差异

在Linux系统中,实现定时器的两种常见方法是使用 `timer_create` 和 `epoll`。这两种方法各有特点和适用场景

探索C++编程的奥秘,分享深入的技术见解和实践,旨在激发读者创造力与解决问题的思维。 2075

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Linux驱动开发高精度定时器的精度测量

前言今天我们来评测linux内核的高精度定时器。顺便利用通过Tektronix示波器 和 DS100 Mini 数字示波器进行交叉测试。因项目需要用到精准的时间周期,所以要评估它的可行性,...

Rice开发经验分享 2772

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Linux c语言如何实现精准定时器

可以使用系统调用 timer_create() 和 timer_settime() 来创建和启动一个精准定时器。这个定时器可以定时执行一个指定的函数,实现定时任务的功能。Linux 内核是多任务操作系统,定时器并不是实时的,可能会存在一定的误差。如果需要更精确的定时器,可以考虑使用定时器中断来实现。

shufawangzhang的博客 1538

Linux下C++定时器功能实现

在Centos下移植旧项目代码,又不想使用三方库占用本就不多的内存空间,就参考windows MFC中定时器实现了一下,开始使用的是”“机制是实现定时器,但注册信号触发时会中断一些其他api:sleep()和usleep()的延时功能会失效。如果在malloc或free执行过程中被信号中断,而信号处理函数又调用了malloc或free,可能会破坏内存管理的数据结构,导致内存泄漏或程序崩溃。printffreadfwrite等,这些函数在操作文件流时会维护一些内部状态。

xin_yao_xin的博客 852

Linux基础 -- Linux C 用户态定时器的使用

在Linux中,函数可以使用不同的时钟选项来创建定时器。

sz66cm 学习随笔 1168

【C/C++】常用计时函数整理

目前,存在着各种计时函数,一般的处理都是先调用计时函数,记下当前时间tstart,然后处理一段程序,再调用计时函数,记下处理后的时间tend,再tend和tstart做差,就可以得到程序的执行时间,但是各种计时函数的精度不一样.下面对各种计时函数,做些简单记录.方法1,2,7,8可以在linux环境下执行,方法1,2,3,4,5,6可以在windows环境下执行.

All_In_gzx_cc的博客 1545
上一篇: Could not locate zlibwapi.dll. Please make sure it is in your library path
下一篇: 深度学习PyTorch,TensorFlow中GPU利用率较低,CPU利用率很低,且模型训练速度很慢的问题总结与分析
我是谁??
博客等级 码龄11年 242粉丝 183原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值