介紹 即時Linux核心 (RT-Preempt) 於ubuntu Linux 中的實作應用
即時 Linux 核心(PREEMPT-RT)是在標準 Linux 核心上進行修改,以實現「硬即時性(Hard Real-Time)」的需求,主要應用於工業控制、自走車、機器人、音訊處理與嵌入式系統等對延遲高度敏感的場域。在 Ubuntu 中,我們可以透過安裝特製的 Real-Time 核心或自行編譯來使用 PREEMPT-RT。
🔧 PREEMPT-RT 核心基本介紹
1. 三種 Linux 排程模型比較:
核心模式 | 說明 | 適用場合 |
---|---|---|
CONFIG_PREEMPT_NONE | 無搶佔,使用者程式佔用時間長 | Server |
CONFIG_PREEMPT_VOLUNTARY | 願意讓出 CPU,但非強制 | 桌面應用 |
CONFIG_PREEMPT | 內核搶佔點較多,改善延遲 | 桌面 + 嵌入式 |
CONFIG_PREEMPT_RT_FULL (RT-Patch) | 幾乎所有內核都可被搶佔,提供近硬即時能力 | 工業與即時控制 |
2. PREEMPT-RT 特點
-
鎖轉換:將自旋鎖轉換為可搶佔的 mutex。
-
中斷 Thread 化:中斷處理程序變成 RT thread,可排程化管理。
-
提供實時排程策略,如
SCHED_FIFO
、SCHED_RR
。 -
更嚴格的優先級反轉處理機制。
🧪 在 Ubuntu 中使用 RT 核心
方式一:安裝已編譯的 RT 核心(推薦)
bashsudo apt update
sudo apt install linux-image-lowlatency # 或使用 RT kernel
或者安裝特製的 RT kernel(若可取得 PPA):
bashsudo apt install linux-image-<version>-rt
確認是否成功切換:
bashuname -a # 查看 kernel 是否為 rt 或 lowlatency
方式二:自行編譯 PREEMPT-RT 核心
-
下載 kernel 原始碼與 RT patch
bashwget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.tar.xz wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.1/patch-6.1.x-rtxx.patch.gz
-
解壓與打 patch
bashtar -xvf linux-6.1.tar.xz
cd linux-6.1
zcat ../patch-6.1.x-rtxx.patch.gz | patch -p1
-
設定 config
bashmake menuconfig → General setup → Preemption Model → Fully Preemptible Kernel (RT)
-
編譯與安裝
bashmake -j$(nproc)
make modules_install
make install
-
更新 GRUB 並重啟
bashsudo update-grub sudo reboot
✅ 即時應用實例(以 ROS 2 為例)
自走車控制(Raspberry Pi + RT kernel)
-
控制回授環回時間(Loop time) < 1ms。
-
與
ros2_control
或realtime_tools
結合使用。 -
設定 thread 為
SCHED_FIFO
類型,確保優先級高於其他使用者程式。
c++#include <pthread.h>
struct sched_param param;
param.sched_priority = 90;
pthread_setschedparam(pthread_self(), SCHED_FIFO, ¶m);
驗證延遲
bashcyclictest -l1000000 -m -Sp90 -i200 -h400 -q
-
min
,avg
,max
latency 皆可小於 100μs。
🧭 小結
特性 | 一般核心 | PREEMPT-RT 核心 |
---|---|---|
最佳延遲 | ms 等級 | μs 等級 |
排程可預測性 | 差 | 優 |
適用場景 | 桌面、伺服器 | 工控、自走車、機器人 |
支援 real-time C++ API | 否 | 是,搭配 POSIX RT API |
ASK:
-
✅ ROS 2 + PREEMPT-RT 範例程式
-
✅ 如何測量 Thread 響應時間
-
✅ 在 Raspberry Pi 上部署完整 RT Kernel 流程
沒有留言:
張貼留言