我正在寻找一种在Linux下的C / C ++中进行计时事件的方法。
例如,每100毫秒执行一段代码。 (不多不less,软实时)
我到目前为止看到的唯一select是:
– 无限循环,每次检查是否应该执行。
– 睡觉的线程,直到时间运行。
无限检查是否是时间运行,具有(太)CPU密集度的缺点。
一直睡到现在,都有不准确的缺点。 睡眠时间只是一个准则,它可以睡更多。
现在我想知道是否有人知道如何在Linux下的C / C ++中进行实时定时事件。
如何监控过程生命
CMake“make install”或在Windows中包含一个库
Linux中进程/线程的大小
系统调用映射内存到文件描述符(反向mmap)?
CreateIoCompletionPort中的并发线程数
谢谢,
丹尼斯
从C代码设置ALSA主音量
根据sql实例枚举获取sql server中的数据库列表
如何让阻塞recv()的线程正常退出?
Linux中头文件中的函数定义中DECLSPEC和SDLCALL的意思是什么?
阻止从Win32应用程序的所有Windows Internet访问
几乎不要紧,你要用什么 – select() , epoll() , usleep() , settimer() 。 有些方法可以“采取”更高分辨率的超时,有些则不行。 但是Linux不是一个实时的操作系统,甚至不应该指望它在那个时候唤醒你的进程。 现在,即使你旋转CPU,内核也可以很容易地暂停你的进程,只要它决定把CPU分配给其他进程或中断处理程序。
从API的角度(以及最近的趋势),你应该坚持timerfd() – 你可以告诉它使用什么时钟,它很好地集成到Linux事件分派机制(epoll,AIO等)的其余部分。
除此之外,它在程序员的控制之外。 通常需要付出很大的努力才能从Linux获得接近实时的行为。 它的范围从构建一个定制的补丁内核和配置整个世界的亲和力,包括屏蔽中断,修补您的BIOS和调整硬件。
实际上,假设你在商品x86_64服务器上运行一个新鲜的香草核心,这个服务器的负载并不是很高,那么你的唤醒时间大概在50微秒左右(你可以很容易地对它进行基准测试,从而得出你系统的一个大概的想法)。
运行在非实时操作系统上,没有用户空间的方法是完全可靠的。 你是对的,睡眠不准确,你可能会睡过头,但同样适用于循环:操作系统可能无法及时安排你的任务,你会错过你的插槽。
根据你需要的可靠性,考虑一个像QNX或RTLinux这样的实时操作系统(RTOS)。 RTLinux的wiki有点过时,所以我不确定它是多么活跃。
另一种方法是依靠某些硬件设备(如GPS卡)的时间。 你的程序会对外部事件做出反应,而不是试图为自己计时。 例如,硬件设备可能会暴露一个“文件”。 您的程序将打开它并阻止read() 。 每隔100毫秒,硬件设备就会向您发送一些数据。
你可以试试Linux的实时应用程序接口RTAI 。
让您可以针对自己喜爱的操作系统编写严格时间限制的应用程序。 像Linux本身一样,这个软件是一个社区的努力。
从初学者指南:
RTAI提供与Linux内核相同的服务,增加了工业实时操作系统的功能 。 它基本上由一个中断调度器组成:RTAI主要捕获外设中断,必要时将它们重新路由到Linux。 这不是对内核的侵入式修改; 它使用HAL(硬件抽象层)的概念从Linux获取信息并捕获一些基本功能。 这个HAL提供了一些Linux内核的依赖。 这导致了Linux内核的简单适应,从RTAI版本到版本的简单RTAI端口以及使用其他操作系统而非RTAI的更简单的方式。 RTAI将Linux视为后台任务,在没有实时活动发生时运行。
检查libevent: http : //libevent.org/
libevent API提供了一种机制,在文件描述符上发生特定事件或达到超时后执行回调函数。 此外,libevent还支持由于信号或定期超时而产生的回调。
你也可以考虑Linux特定的timerfd_create(2)和朋友( poll / 2为多路复用/等待,或一些事件库,如libev或libevent ,或Gtk或Qt事件循环,这将调用内部poll ) Posix timer_create(2) 。 另请参阅clock_gettime(2)和朋友
我强烈建议阅读时间(7)手册页。 它解释了很多。 而Vlad 回答说 ,Linux并不是一个真正的实时内核(即使它可能会接近)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。