2025年6月5日 星期四

RT_Linux (RT-Preempt)

 介紹 即時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_FIFOSCHED_RR

  • 更嚴格的優先級反轉處理機制。


🧪 在 Ubuntu 中使用 RT 核心

方式一:安裝已編譯的 RT 核心(推薦)

bash
sudo apt update sudo apt install linux-image-lowlatency # 或使用 RT kernel

或者安裝特製的 RT kernel(若可取得 PPA):

bash
sudo apt install linux-image-<version>-rt

確認是否成功切換:

bash
uname -a # 查看 kernel 是否為 rt 或 lowlatency

方式二:自行編譯 PREEMPT-RT 核心

  1. 下載 kernel 原始碼與 RT patch

bash
wget 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
  1. 解壓與打 patch

bash
tar -xvf linux-6.1.tar.xz cd linux-6.1 zcat ../patch-6.1.x-rtxx.patch.gz | patch -p1
  1. 設定 config

bash
make menuconfig → General setup → Preemption Model → Fully Preemptible Kernel (RT)
  1. 編譯與安裝

bash
make -j$(nproc) make modules_install make install
  1. 更新 GRUB 並重啟

bash
sudo update-grub sudo reboot

✅ 即時應用實例(以 ROS 2 為例)

自走車控制(Raspberry Pi + RT kernel)

  • 控制回授環回時間(Loop time) < 1ms。

  • ros2_controlrealtime_tools 結合使用。

  • 設定 thread 為 SCHED_FIFO 類型,確保優先級高於其他使用者程式。

c++
#include <pthread.h> struct sched_param param; param.sched_priority = 90; pthread_setschedparam(pthread_self(), SCHED_FIFO, &param);

驗證延遲

bash
cyclictest -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 流程


沒有留言:

張貼留言