【问题标题】:Real-time programming with Linux使用 Linux 进行实时编程
【发布时间】:2012-05-17 03:59:59
【问题描述】:

我刚刚构建并设置了一个应用了 RT 补丁的 vanilla Linux 内核。一切顺利,我现在可以正确启动到新内核。

让我想知道的是:我有一个用 C 语言编写的模拟器程序,我希望它以硬实时模式执行,新内核应该允许这样做。可能整个模拟器不需要以实时优先级运行,但里面的一些任务需要。

我怎样才能做到这一点?我认为仅仅运行程序是不行的。

【问题讨论】:

    标签: c linux kernel real-time hard-real-time


    【解决方案1】:

    如果您询问如何在实时上下文中运行一些线程,而其他线程则作为传统的分时线程,那么您只需设置它们的schedulers properly using sched_setscheduler

    分时线程要SCHED_OTHER;实时模拟器线程希望是SCHED_FIFOSCHED_RR

    在 Linux 上,为了以实时优先级运行,您的用户必须具有允许这样做的资源限制 (man 2 rlimit)。特别是,您的rtprio rlimit 必须设置为您需要的最高优先级。或者,您可以以 root 身份运行应用程序。在带有 PAM 的 linux 系统中,这通常通过在 /etc/security/limits.conf 中添加适当的行来完成

     @realtime - rtprio 99

    这将向 realtime 组授予最高实时优先级 99 的 rtprio 限制。然后将实时组添加到/etc/groups 并确保您的用户在该组中。

    (由于这似乎是您第一次这样做,您可能还希望有一个“死人开关”高优先级实时线程,以确保您的模拟器不会失控并且使系统无法使用...如果您正在模拟高 CPU 负载,您可能会获得实际的高 CPU 负载并且无法在不重新启动的情况下停止。)

    【讨论】:

    • 不应该 Alt+SysRq+N 将所有实时进程重置为正常模式吗?
    • @Victor:我以前没有使用过该功能,也不知道该依赖多少。看起来它用于 renice 一切并放弃所有 rt 优先级,但不知道这样做后你将如何恢复到正常的优先级状态。
    • 所以假设我在一个新分叉的进程中调用了这个命令:sched_setscheduler(getpid(), SCHED_FIFO, &sp);为什么这不能正确执行? sched_setscheduler 返回 1 而不是 0,我很确定 sp 配置正确(sp.sched_priority 设置为 98)
    • 您可能没有权限调用 set_scheduler。你是以root身份运行的吗?如果这样可以解决问题,那么正确的做法是建立一个允许执行实时操作的组,并将其放入您的 limits.conf 文件中。快速示例:jackaudio.org/linux_rt_config
    • Ubuntu 16.04 上limits.conf 的路径是/etc/security/limits.conf(注意添加的security 目录)manpages.ubuntu.com/manpages/trusty/man5/limits.conf.5.html
    猜你喜欢
    • 1970-01-01
    • 2023-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多