标签: preempt-rt

preempt_rt的缺点

目标硬件平台具有有限的马力,和/或您希望实时作业将最小的开销放在系统上.这是双内核通常比本机抢占系统更好的地方.

从这里:http://www.xenomai.org/index.php/Xenomai : Roadmap#Xenomai_3_FAQ

Preempt_rt确实抢占了整个Linux.以何种方式抢占Linux会对系统造成负担?

与Xenomai相比,FAQ中讨论了preempt_rt.

linux operating-system real-time xenomai preempt-rt

13
推荐指数
1
解决办法
1万
查看次数

Linux中间隔计时器的准确度是多少?

我试图描述Linux上的计时器抖动.我的任务是运行100毫秒的计时器,看看这些数字是如何运作的.

我正在研究多核机器.我使用了setitimer()的标准用户程序,以root身份运行,然后使用处理器亲和性,最后使用处理器亲和性和进程优先级.然后我使用PREEMPT_RT内核运行相同的内容,然后使用clock_nanosleep()运行示例,如PREEMPT_RT页面上的演示代码中所示.在所有运行中,计时器性能非常相似,尽管有变化,但没有真正的差异.

我们的最终目标是稳定的计时器.我经常得到的最好的最坏情况是大约200us.所有案例的直方图都显示出奇怪的行为.首先,我不希望计时器提前开火.但他们这样做.正如您在直方图中看到的那样,我在0偏移的两边都得到了低谷.这些在第二个图中的三个波段中可见.在第一个图中,X轴以微秒为单位.在第二个图中,Y轴以微秒为单位.

我跑了30s测试(即300个计时器事件)100次以生成一些数字.您可以在下图中看到它们.200us大幅下降.所有30000定时器事件时钟偏移都在第二个图表中绘制,您可以在其中看到一些异常值.

X轴以微秒为单位Y轴以微秒为单位

所以问题是,之前有其他人做过这种分析吗?你有没有看到同样的行为?我的假设是RT内核可以帮助重载系统,但在我们的例子中,它无助于消除定时器抖动.那是你的经历吗?

这是代码.就像我之前说过的,我修改了使用clock_nanosleep()函数的PREEMPT_RT站点上的示例代码,因此我不会包含我的最小更改.

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

#define US_PER_SEC 1000000
#define WAIT_TIME 100000
#define MAX_COUNTER 300

int counter = 0;
long long last_time = 0;
static long long times[MAX_COUNTER];
int i = 0;

struct sigaction sa;

void timer_handler(int signum)
{
    if (counter > MAX_COUNTER)
    {
        sigaction(SIGALRM, &sa, NULL);
        for (i = 0; i < MAX_COUNTER; i++)
        {
            printf("%ld\n", times[i]);
        }
        exit(EXIT_SUCCESS);
    }

    struct timeval t;
    gettimeofday(&t, NULL);

    long long elapsed = …
Run Code Online (Sandbox Code Playgroud)

c linux real-time timer preempt-rt

13
推荐指数
1
解决办法
2071
查看次数

实时嵌入式Linux中的数据记录时延迟峰值

我有一个机器人运行控制代码,在Beaglebone Black上的PREEMPT-RT补丁Linux操作系统上具有实时优先级.所有代码都用C语言编写,运行频率为500Hz.

在运行代码时,我经常注意到几百毫秒的延迟,我已将其跟踪到我编写的数据记录功能.这种延迟导致我的机器人控制失败,因为我有很多,具体取决于实时功能.

代码的相关部分如下.为了清晰起见,我已经删除了很多代码,但如果需要的话,我会编辑这篇文章.

FILE *file;

int main(int argc, char** argv) {
    file = fopen(logname, "w");

    while (1) {
        /* Control code stuff*/

        logData();

        time_msec = time_msec + controlLoopTime;
    }
}

void logData() {
    if (time_msec - logTimer_msec >= LOG_TIMER) {
        logTimer_msec = time_msec;

        if (!bLogCreated) {
            fprintf(file,
                    "SensorData1 SensorData2 SensorDataN"
                    );
            bLogCreated = TRUE;
        }

        // log data to file
        fprintf(file,

                "%.2f %.2f\n",

                sensorData1, sensorData2, sensorDataN
        );
    }
}
Run Code Online (Sandbox Code Playgroud)

我需要以很好的速率(可能是100-125Hz)记录来自多个变量(可能是20-50)的数据.数据不需要以控制速率(每2ms)记录,但我已经将其减少到12ms,我仍然看到每隔几分钟出现延迟峰值.

延迟可能是fprintf呼叫的问题.这是BeagleBone Black的限制,我的代码,还是数据记录的本质?

这里也提出了类似的问题,但似乎没有解决我的问题:在嵌入式Linux系统中查找延迟问题(停顿)

c latency real-time embedded-linux preempt-rt

5
推荐指数
1
解决办法
720
查看次数

如何提高 Linux 中 1ms 定时器的实时性能?

我正在开发一个嵌入式 Linux 项目,使用的 arago 发行版可能是 3.3 版左右。

我配置了一个高分辨率的 Linux 计时器,每毫秒唤醒一次我的进程。这工作正常,但时间有两个问题:

  1. 唤醒时间的抖动
  2. 尽管进程完成的处理是恒定的,但清醒时处理时间的可变性。

我将这些问题归咎于 Linux 的实时性能不足。但我需要研究提高实时性能的方法。

我检查了内核是否配置了 CONFIG_PREEMPT 内核选项,这对实时有好处。

我还将 SCHED_FIFO 调度类应用于我的进程:

struct sched_param schedparm;
memset(&schedparm, 0, sizeof(schedparm));
schedparm.sched_priority = 1; // lowest rt priority
sched_setscheduler(0, SCHED_FIFO, &schedparm);
Run Code Online (Sandbox Code Playgroud)

但这没有区别。

我想一个合乎逻辑的步骤是将 PREEMPT_RT 补丁应用于内核构建,但我还没有确定如何做到这一点。

我还能做些什么来改善抖动/持续时间可变性?

或者任何人都可以建议有关如何应用 PREEMPT_RT 补丁的可访问教程?

linux embedded real-time timer preempt-rt

5
推荐指数
1
解决办法
1871
查看次数

preempt_rt、Xenomai 和 RTAI 之间的实时基准测试

我需要比较 preempt_rt 补丁、Xenomai 和 RTAI 之间的性能。他们每个人都有自己的基准测试,但没有给出相似的结果,并且并非所有基准测试都适用于所有三个平台。我正在寻找的是一个基准测试,它将测量基本性能,如中断延迟、上下文切换时间等,并且将在所有三个平台上运行。我尝试实现线程度量基准,但它对我来说太复杂了。有人知道这样的基准是否存在吗?预先感谢您的任何帮助。

benchmarking real-time xenomai preempt-rt

5
推荐指数
1
解决办法
2323
查看次数

Yocto为preempt_rt构建

我正在为beaglebone黑色构建自定义内核。遵循本指南(http://android.serverbox.ch/?p=1273),我可以使用基本映像成功引导到控制台。

当我尝试使用命令使用实时内核补丁进行构建时:

bitbake core-image-rt
Run Code Online (Sandbox Code Playgroud)

我收到以下错误消息:

Loading cache: 100% |###############################| ETA:  00:00:00
Loaded 1222 entries from dependency cache.
Parsing recipes: 100% |#############################| Time: 00:00:00
Parsing of 862 .bb files complete (861 cached, 1 parsed). 1221 targets, 61 skipped, 0 masked, 0 errors.
NOTE: Resolving any missing task queue dependencies
NOTE: multiple providers are available for virtual/kernel (linux-yocto, linux-dummy)
NOTE: consider defining a PREFERRED_PROVIDER entry to match virtual/kernel
ERROR: Nothing PROVIDES 'linux-yocto-rt' (but /home/ste/yocto/poky/meta/recipes-rt/images/core-image-rt.bb DEPENDS on or otherwise requires it) …
Run Code Online (Sandbox Code Playgroud)

linux bitbake beagleboneblack yocto preempt-rt

4
推荐指数
1
解决办法
5823
查看次数

使用 PREEMPT_RT 构建 RT 应用程序

我想在使用实时 PREEMPT_RT 的同时编写实时 Linux 程序。我找到了官方维基(https://rt.wiki.kernel.org/index.php/HOWTO:_Build_an_RT-application)。有一些代码示例,但我想获得可能的 RT 函数的解释。

谢谢你,

real-time preempt-rt

4
推荐指数
1
解决办法
5524
查看次数

mlockall():无法分配内存

我收到错误: mlockall 失败:调用函数 mlockall() 时无法分配内存:

if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) {
            printf("mlockall failed: %m\n");
            exit(-2);
    }
Run Code Online (Sandbox Code Playgroud)

使用的IDE:Eclipse操作系统:Ubuntu 16.04实时扩展使用:4.11.12 rt-15(抢占补丁)注意:我正在尝试实时进行UDP连接(使用intel i210以太网控制器)。

当我在 Eclipse 中调试相同的内容时,显示的是:

在“/build/glibc-bfm8X4/glibc-2.23/misc/../sysdeps/unix/syscall-template.S”处找不到源文件找到该文件或编辑源查找路径以包含其位置。

怎么解决这个问题呢?

ubuntu preempt-rt

3
推荐指数
1
解决办法
6788
查看次数

调查线程堆栈溢出

我在运行多线程嵌入式应用程序时遇到分段错误。GDB 提示我堆栈可能已损坏,这让我相信堆栈对于有问题的线程来说太小了。增加堆栈大小似乎消除了这个问题,但我想进一步确认一下。我在这里有哪些选择?是否可以在发生段错误时找出当前堆栈大小?

linux embedded gdb preempt-rt

1
推荐指数
1
解决办法
40
查看次数