问题标签 [linux-rt]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
linux-kernel - Linux 中调度程序调试工具
我有一个嵌入式 linux 系统,其中包含两个必须实时(或软实时)运行的线程。使用 SCHED_OTHER 时,我注意到很多抖动,但两个线程总是在分配的时间内执行。
我已经应用了启用 PREEMPT_RT 的 RT 补丁,并且使用 SCHED_FIFO 运行这两个线程(具有 ~80 的高线程优先级)会导致更少的抖动,总体而言要好得多,除了偶尔两个线程都错过了他们的最后期限(而不是每 10 毫秒左右执行一次,他们可能几乎一秒钟都没有得到调度!)。
我想问在嵌入式 Linux 操作系统上调试 linux 调度(在 RT 下)时哪个工具最好。ftrace 浮现在脑海中,但我不知道它是否是最好的和/或唯一的工具。我的目标是找出为什么两个线程没有被安排在很长一段时间内。
更新:我今天一直在用wakeup_rt 运行ftrace。作为跟踪器的 wakeup_rt 没有完成工作:它记录的最大延迟为 5 毫秒,而我的线程可以延迟 1000 毫秒。也许这不是调度程序问题?请您推荐 ftrace 中的其他什么跟踪器?
linux-kernel - 通过 prio-preempt 在 Linux RT LTS4.4 上测试优先级抢占
我的系统使用 Arm cortexa7@1GHz 和来自 CIP 社区的实时补丁集 Linux 4.4.138-rt19:v4.4.138-cip25-rt19
我已经运行了一个 prio-preempt.c 来验证我系统上的优先级抢占。但是我遇到了一个问题:系统可能只运行了少于 27 个创建线程的线程。
关于理论方面,ltp app prio-preempt 创建了 27 个具有不同优先级的 worker_threads,N 个 busy_threads(N:取决于 CPU 的数量,在我的情况下 N = 2)具有高优先级,以及 master_thread(最高优先级)。
将应用程序部署到板上时,threads_running始终低于 27,而create_fifo_thread(worker_thread,i,...)成功创建了 27 个 worker_thread(s)。我在 cortexa15@1.5GHz 上运行了上面相同的程序,问题没有发生。
为了进一步了解,我认为问题可能来自 Linux RT 调度程序在bmutex锁被释放后无法唤醒睡眠线程。
有人对我有同样的问题吗?请分享你的想法。
pthreads - 如何安排具有绝对开始时间的实时任务?
对于 TSN 感知的通信协议栈和框架,我需要能够执行实时线程,不仅以非常精确的间隔运行,而且从 ptpd 中扣除的精确时隙开始。
目前,我通过延迟/让出任务直到开始时间来做到这一点。对于我的 TSN 通信的 PoC,这已经足够了,但是有了 Linux 实时扩展,必须有更好/更有效的方法。两个 Beaglebone 之间引入的抖动约为 800us(运行 Linux 4.14.71-ti-r80 #1 SMP PREEMPT)。
使用循环 pthread,我同步了网络生产者任务的启动(注意:vos_ 前缀表示我的操作系统抽象方法,实际上匹配 POSIX 调用):
上面的代码在 5ms 的时间间隔内产生大约 800us 的抖动(使用没有 RT 扩展和策略 Round-Robin 的 Linux 4.14),这是相当好的 - 但当涉及到多个线程都执行预定流量时无效......
对于 Linux 4.1.15-ti-rt-r43 #1 SMP PREEMPT RT,我计划使用 SCHED_DEADLINE 作为策略,但 struct sched_attr 不提供启动时间参数。则不需要上述代码中的运行时检查。但:
我如何有效地使用 Linux 的实时扩展来让线程在精确的绝对时间运行,例如从绝对实时“现在”+ 0.0075 秒开始每 1 毫秒(例如 now.0085、now.0095、now.0105 ...),没有上述代码的开销?
linux-kernel - 哪个工具可以找到嵌入式 Linux 延迟峰值的原因?
最好的情况是,如果我有一个(调试)工具,它在后台运行并告诉我打破我对系统的延迟要求的进程或驱动程序的名称。哪种工具适合?你有一个简短的例子来说明它在以下情况下的用法吗?
测试用例:
- 示波器测量 GPIO 输入触发和 GPIO 输出响应之间的时间。通常响应时间为 150µs。我每 25 毫秒触发一次。
- 我的 linux 用户测试程序使用 poll() 和 read()+write() 将检测到的输入信号作为对输出的响应进行镜像。
- Linux 内核使用 Preempt_rt 补丁进行了修补。
- 在小时的维度上,我可以看到高达 20 毫秒的响应时间峰值。
c - SCHED_DEADLINE 运行时溢出信号 (SIGXCPU)
我正在使用SCHED_DEADLINE
. 如果线程SIGXCPU
超过指定的sched_runtime
. 据我对手册页的理解,这可以通过设置SCHED_FLAG_DL_OVERRUN
-flag 来实现。但是,在下面的示例程序中,没有接收到信号(在第三次迭代中)。根据 kernelshark-plot,线程在运行时被挂起,但没有创建信号。
我对SCHED_FLAG_DL_OVERRUN
-flag 的理解是否正确?如果不是,是否有另一种方法来检测线程是否超过指定的运行时间,而不测量每次迭代后的时间?
我的内核版本是5.4.3-rt1-1-rt #1 SMP PREEMPT_RT
.
c - Linux中如何控制两个线程的时间偏移?
有没有办法创建两个SCHED_DEADLINE
具有特定偏移(相位)到全局循环的线程?我正在尝试创建两个线程,两个线程的周期均为 10 毫秒,但它们的到达时间之间的偏移量为 5 毫秒。行为应该是这样的,带有 | 是到达时间,x 是实际开始时间,D 是绝对截止日期。两个线程都是独立的,因此不需要使用互斥锁等来同步它们。它们只需要时间偏移量。
线程 1 |-----xooooo---------D-------------|
线程 2 -------|-----xoooo--D-----
linux-kernel - 每当上下文切换发生时,我应该在 linux 中看到什么中断?
我正在研究 cat /proc/interrupts 并且我正在寻找在上下文切换发生时我应该寻找的中断的名称?当上下文切换发生在 linux 内核中时,我在哪里可以看到中断计数。
timer - PREEMPT_RT_FULL 在 Linux-RT 4.19.188 中的隔离 CPU 上打破 NO_HZ_FULL
我在 Linux-4.19.188 + patch-4.19.188-rt77 中运行测试,启用了 PREEMPT_RT_FULL 和 NO_HZ_FULL。
我在一个独立的 CPU 上放置了一个带有 SCHED_FIFO(优先级为 99)的无限循环。根据 NO_HZ_FULL 实现,预期的结果是在隔离的 CPU 中不会看到任何滴答声。
但是那个隔离 CPU 中的“本地 APCI 定时器中断”的数量随着 HZ 的增加而增加(在我的 Linux 中为每秒 250),这意味着激活了滴答声!
我在网上搜索了一下,发现 2018 年 9 月报告了一个类似的问题,https: //marc.info/?t=153534185000001&r=1&w=2 。从那时起,Linux 似乎就没有修复它。
问题随机发生并不总是存在。
我想知道是什么在那个隔离的 CPU 上设置了滴答计时器,我应该在哪里挖掘根本原因?
linux-kernel - Linux-RT 补丁
我开始使用 Linux-RT 并在 Internet 上浏览我已经意识到这不是同一个“完整的 Linux-RT”和“PREEMPT_RT 内核配置”。有什么区别?
我在一个项目中工作并且需要一个 RTOS,所以我决定使用 Linux。