Articles of 实时

用Linux实时编程

我刚build立并build立了一个应用了RT补丁的vanilla Linux内核。 一切都很好,我现在可以正确引导到新的内核。 我想知道的是这样的:我有一个我在C中创build的模拟器程序,我希望它在硬实时模式下执行,新内核应该允许它。 可能整个模拟器不需要以实时优先级运行,但是其中的一些任务可以做到。 我怎样才能做到这一点? 我认为,简单地运行程序将不会。

如何睡几个微秒

考虑下面的代码: #include <stdio.h> #include <time.h> #include <math.h> // Compile with gcc -lrt -lm -o test_clock test_clock.c #define CLOCK CLOCK_MONOTONIC int main(int argc, char** argv) { double temp, elapsed; int j; struct timespec requestStart, requestEnd, req; // Pseudo-sleep clock_gettime(CLOCK, &requestStart); temp = 0; for(j=0; j < 40; j++) temp += sin(j); clock_gettime(CLOCK, &requestEnd); elapsed = ( […]

在非实时操作系统/内核上执行接近实时任务的最佳方法是什么?

在GNU / Linux机器上,如果你想做“实时”(亚毫秒级的时间关键)任务,你几乎总是要经历冗长,复杂和容易出问题的修补内核的过程来暴露出足够的支持[ 1] [2] 。 最大的问题在于,许多实时任务最有用的系统,即使允许这些补丁工作,也不具备基本的硬件要求,即高分辨率计时器外设。 或者如果他们这样做,这是硬件的具体情况,所以需要在具体情况下在补丁中具体实施。 即使CPU /指令时钟速率足够快以提供所需的时间粒度,也是如此。 所以,我的问题是,为了尽可能接近上述实时目标,最好的第二方式/技巧是什么? 在应用程序源代码中可以简单地做的事情,不需要深入了解底层硬件或太多的“内核黑客行为”。 提升进程优先级,为“关键”任务启动一个额外的线程,以及使用nanosleep()的各种变体(C),这些都是目前为止最好的回答/技巧。 我希望find更多。

如何屏蔽从Linux调度程序的CPU(防止调度到该CPU的线程)?

有可能使用sched_setaffinity将一个线程固定到一个cpu,提高性能(在某些情况下) 从Linux手册页: 限制进程在单个CPU上运行也可以避免由于某个进程在一个CPU上停止执行而发生高速caching失效而导致的性能开销,然后重新开始在不同的CPU上执行 此外,如果我希望获得更实时的响应,我可以将该线程的调度策略更改为SCHED_FIFO ,并将优先级更改为某个较高的值(最高为sched_get_priority_max ),这意味着所讨论的线程应始终sched_get_priority_max其他线程线程运行在它的CPU上,当它准备好了。 但是,此时,实时线程刚刚被抢占的cpu上运行的线程可能已经驱逐了实时线程的一级caching条目。 我的问题如下: 是否有可能阻止调度程序调度任何线程到给定的CPU? (例如:要么从调度程序完全隐藏CPU,要么以其他方式) 有一些线程,必须能够在该CPU上运行? (例如:内核线程/中断线程) 如果我需要在该CPU上运行内核线程,那么使用什么是合理的最大优先级值,这样我就不会饿死内核线程?

Linux'hrtimer – 微秒精度?

是否有可能以微秒的精度在Linux主机上执行任务? 也就是说,我想在特定的时间执行任务。 我知道,Linux不是实时系统,但我正在寻找Linux上的最佳解决scheme。 到目前为止,我已经创build了一个内核模块,设置hrtimer,并在进入callback函数时测量抖动(我并不太在意实际的延迟,这是抖动的计数) – 大约20-50us。 这并不比在用户空间中使用timerfd好得多(也尝试使用实时优先级进程,但并没有真正改变任何东西)。 我正在运行Linux 3.5.0(只是一个例子,尝试从2.6.35到3.7不同的内核),/ proc / timer_list显示hrtimer_interrupt,我没有运行在失效保护模式,禁用hrtimerfunction。 试过不同的CPU(Intel Atom to Core i7)。 到目前为止,我最好的想法是将hrtimer与ndelay / udelay结合使用。 这真的是最好的办法吗? 我不敢相信这是不可能以微秒的精度触发一个任务。 在内核空间中以模块的forms运行代码是可以接受的,但是如果代码没有被其他任务中断,那将是非常好的。 我不太关心系统的其他部分,任务每秒只能执行几次,因此每次执行任务时,使用mdelay / ndelay来刻录CPU几微秒就没有关系。 尽pipe如此,我更喜欢更加优雅的解决scheme。 我希望这个问题很清楚,发现很多关于定时器精度的话题,但是对这个问题没有真正的答案。

Bursty写SD / USB在embedded式Linux上拖延我的时间关键型应用程序

我正在开发一个embedded式Linux项目,将ARM9连接到硬件video编码器芯片,并将video写入SD卡或USB存储器。 软件体系结构包括将数据读入缓冲池的内核驱动程序以及将数据写入安装的可移动设备上的文件的用户级应用程序。 我发现超过一定的数据速率(大约750kbyte / sec),我开始看到用户级的video编写应用大概每隔5秒停顿半秒钟。 这足以导致内核驱动程序耗尽缓冲区 – 即使可以增加缓冲区的数量,video数据也必须与其他正在进行的事情同步(理想情况下在40ms内)。 在这5秒的“滞后峰值”之间,写入在40ms内完成(就应用而言 – 我很欣赏它们被操作系统缓冲) 我认为这种滞后现象是与Linux将数据刷新到磁盘的方式有关 – 我注意到pdflush的devise是每5秒唤醒一次,我的理解是,这将是写入的内容。 一旦失速结束,用户级应用程序能够快速服务并写入积压的缓冲区(没有溢出)。 我认为我正在写的设备具有合理的最终吞吐量:从内存fs复制一个15MB的文件,并等待同步完成(并且USB棒的指示灯停止闪烁)给了我大约2.7MBytes / sec的写入速度。 我正在寻找两种线索: 我怎样才能阻止我的应用程序的突发性写作 – 可能是处理优先级,实时补丁,或调整文件系统代码连续写而不是简单的? 我怎样才能使我的应用程序知道文件系统发生什么情况,从而在写入数据和卡/棒的吞吐量方面? 我有能力改变硬件编解码器中的video比特率,比丢帧好得多,或者在最大允许的比特率上施加人为上限。 更多信息:这是一个200MHz的ARM9,目前运行的是基于Montavista 2.6.10的内核。 更新: 挂载文件系统SYNC会导致吞吐量太差。 可移动媒体是FAT / FAT32格式的,必须是devise的目的,媒体可以插入任何Windows电脑和阅读。 定期调用sync()或fsync()说,每一秒会导致经常停顿和吞吐量不能接受 我正在使用write()并打开(O_WRONLY | O_CREAT | O_TRUNC)而不是fopen()等 我不能立即在网上find有关上述“Linux实时文件系统”的任何信息。 链接? 我希望这是有道理的。 在stackoverflow上的第一个embedded式Linux问题? 🙂

如何“实时”是Linux 2.6?

我正在考虑将我的产品从RTOS移植到embedded式Linux。 我没有太多的实时要求,而我所需要的几个RT要求是几十毫秒。 有人能给我一个参考,可以告诉我实时Linux的当前版本是什么? 是否有任何其他的陷阱转移到商业RTOS到Linux?

CLOCK_MONOTONIC的起始点

据我所知在Linux上CLOCK_MONOTONIC是启动时间。 在我目前的工作中,我更喜欢使用单调时钟而不是CLOCK_REALTIME (用于计算),但同时我需要在报告中提供人性化的时间戳(年/月/日)。 他们可能不是很精确,所以我打算在开机时join单调计数器。 从哪里可以得到这个时间在Linux系统上使用API​​调用?

在Linux中微秒准确(或更好)的进程时序

我需要一个非常准确的方法来计算部分程序。 我可以使用这个普通的高分辨率时钟,但是这将返回wallclock时间,这不是我所需要的:我需要花费的时间只运行我的进程。 我清楚地记得看到一个Linux内核补丁,可以让我的stream程时间精确到毫微秒,除了我忘记了书签,我忘了补丁的名字以及:(。 我记得它是如何工作的, 在每个上下文切换时,它将读取高分辨率时钟的值,并将最后两个值的增量添加到正在运行的进程的处理时间。 这会生成一个高分辨率的过程实际处理时间的准确视图。 正常的处理时间是使用常规时钟保持的,这是我相信毫秒精度(1000Hz),这对于我的目的来说太大了。 有谁知道我在说什么内核补丁? 我还记得它就像是一个字母之前或之后的字母 – 像“rtimer”之类的东西,但我不记得确切的。 (其他build议也欢迎) Markobuild议的完全公平的调度程序并不是我正在寻找的,但它看起来很有希望。 我遇到的问题是,我可以用来获取处理时间的调用仍然没有返回足够精细的值。 times()返回值21,22,以毫秒为单位。 clock()返回值21000,2200,相同的粒度。 getrusage()返回值如210002,22001(还有些),他们看起来有更好的准确性,但值看起来显着相同。 所以现在我可能遇到的问题是内核有我需要的信息,我只是不知道将返回它的系统调用。

如何使用WinAPIlocking内存中的页面?

我需要防止应用程序的内存页被从Windows上的RAM中取出。 是否有一个相当于POSIX mlockall()的WinAPI函数来实现这个function?