目标硬件平台具有有限的马力,和/或您希望实时作业将最小的开销放在系统上.这是双内核通常比本机抢占系统更好的地方.
从这里:http://www.xenomai.org/index.php/Xenomai : Roadmap#Xenomai_3_FAQ
Preempt_rt确实抢占了整个Linux.以何种方式抢占Linux会对系统造成负担?
与Xenomai相比,FAQ中讨论了preempt_rt.
我试图描述Linux上的计时器抖动.我的任务是运行100毫秒的计时器,看看这些数字是如何运作的.
我正在研究多核机器.我使用了setitimer()的标准用户程序,以root身份运行,然后使用处理器亲和性,最后使用处理器亲和性和进程优先级.然后我使用PREEMPT_RT内核运行相同的内容,然后使用clock_nanosleep()运行示例,如PREEMPT_RT页面上的演示代码中所示.在所有运行中,计时器性能非常相似,尽管有变化,但没有真正的差异.
我们的最终目标是稳定的计时器.我经常得到的最好的最坏情况是大约200us.所有案例的直方图都显示出奇怪的行为.首先,我不希望计时器提前开火.但他们这样做.正如您在直方图中看到的那样,我在0偏移的两边都得到了低谷.这些在第二个图中的三个波段中可见.在第一个图中,X轴以微秒为单位.在第二个图中,Y轴以微秒为单位.
我跑了30s测试(即300个计时器事件)100次以生成一些数字.您可以在下图中看到它们.200us大幅下降.所有30000定时器事件时钟偏移都在第二个图表中绘制,您可以在其中看到一些异常值.


所以问题是,之前有其他人做过这种分析吗?你有没有看到同样的行为?我的假设是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) 我有一个机器人运行控制代码,在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系统中查找延迟问题(停顿)
我正在开发一个嵌入式 Linux 项目,使用的 arago 发行版可能是 3.3 版左右。
我配置了一个高分辨率的 Linux 计时器,每毫秒唤醒一次我的进程。这工作正常,但时间有两个问题:
我将这些问题归咎于 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 补丁的可访问教程?
我需要比较 preempt_rt 补丁、Xenomai 和 RTAI 之间的性能。他们每个人都有自己的基准测试,但没有给出相似的结果,并且并非所有基准测试都适用于所有三个平台。我正在寻找的是一个基准测试,它将测量基本性能,如中断延迟、上下文切换时间等,并且将在所有三个平台上运行。我尝试实现线程度量基准,但它对我来说太复杂了。有人知道这样的基准是否存在吗?预先感谢您的任何帮助。
我正在为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) 我想在使用实时 PREEMPT_RT 的同时编写实时 Linux 程序。我找到了官方维基(https://rt.wiki.kernel.org/index.php/HOWTO:_Build_an_RT-application)。有一些代码示例,但我想获得可能的 RT 函数的解释。
谢谢你,
我收到错误: 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”处找不到源文件找到该文件或编辑源查找路径以包含其位置。
怎么解决这个问题呢?
我在运行多线程嵌入式应用程序时遇到分段错误。GDB 提示我堆栈可能已损坏,这让我相信堆栈对于有问题的线程来说太小了。增加堆栈大小似乎消除了这个问题,但我想进一步确认一下。我在这里有哪些选择?是否可以在发生段错误时找出当前堆栈大小?