樹莓派4B 實時內核(Preempt_RT)的配置和編譯
https://blog.csdn.net/zlp_zky/article/details/114994444
基本按照這個blog來操作.
幾點問題:
1. 官方raspios 只有4.19.y-rt 是打過補丁的,可以直接下載編譯.
其它版本需要自己下載raspi 源碼並打補丁.
-----------------------------------------------------------------
獲取樹莓派內核編譯配置文件.config,該文件可從/proc/config.gz中獲取,或者通過make生成
方法1:
$ sudo modprobe configs
$ zcat /proc/config.gz > .config
然后基於此 .config文件, 用樹莓派的設定 修改它:
# KERNEL=kernel7
# make bcm2837_defconf (針對rpi 3b+)
#KERNEL=kernel7l
# make bcm2711_defconf (針對rpi 4b+)
---------------------------------------------------------------
(2)blog中編譯命令
make -j4 zImage modules dtbs
其中 zImage 已經沒有了(我的arm64平台上沒有了). . . 可以直接編譯成 deb的包形式,方便安裝.
對應的編譯目標為: deb-pkg
如下命令可以放到后台,之后關機睡覺, 第二天早上看是否編譯完成
# nohup make -j4 zImage modules dtbs deb-pkg &> ~/maketask.out &
查看編譯的命令:
# watch -n 0.5 tail ~/maketask.out -n20
查看后台make是否運行:
# ps -aux | grep make
3. 編譯過程中, 會產生一個編譯錯誤,導致編譯退出. 建議先修改好源碼, 在開始編譯, 在關機睡覺~~~否則第二天一場空.
/usr/bin/ld: scripts/dtc/dtc-parser.tab.o:(.bss+0x10): multiple definition of `yylloc'; scripts/dtc/dtc-lexer.lex.o:(.bss+0x0): first defined here
collect2: error: ld returned 1 exit status
————————————————
解決: 采用此貼中的方法一, 並沒有注釋那行, 而是加上 extern 就好了.
https://blog.csdn.net/weixin_42792088/article/details/121657463
4. 編譯完成后, 在源代碼同一級目錄下產生3個deb包:
linux-headers-4.19.71-rt24-v8_4.19.71-rt24-v8-1_arm64.deb
linux-image-4.19.71-rt24-v8_4.19.71-rt24-v8-1_arm64.deb
linux-libc-dev_4.19.71-rt24-v8-1_arm64.deb
5. 安裝本地deb包, 沒有yum localinstall xxx 的類似命令, 可使用gdebi代替:
# apt install gdebi-core
# gdebi linux-image-4.19.71-rt24-v8_4.19.71-rt24-v8-1_arm64.deb
6. 安裝前是5.10的內核,但是不帶實時補丁.
(https://downloads.raspberrypi.org/raspios_lite_arm64/images/raspios_lite_arm64-2021-11-08/2021-10-30-raspios-bullseye-arm64-lite.zip)
Linux ProfinetPI 5.10.63-v8+ #1459 SMP PREEMPT Wed Oct 6 16:42:49 BST 2021 aarch64 GNU/Linux
測試實時性:
# apt-get install rt-tests
# cyclictest -t 5 -p 80 -n
新版本參數-n沒有了, 改為次數10000, 即: -l 10000, 結果
# cyclictest -t 5 -p 80 -l 10000
WARN: cyclictest was not built with the numa option
# /dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 0.24 0.17 0.10 1/134 262521
T: 0 (262515) P:80 I:1000 C: 10000 Min: 12 Act: 26 Avg: 22 Max: 178
T: 1 (262516) P:80 I:1500 C: 6669 Min: 11 Act: 29 Avg: 19 Max: 102
T: 2 (262517) P:80 I:2000 C: 5001 Min: 13 Act: 30 Avg: 23 Max: 196
T: 3 (262518) P:80 I:2500 C: 4001 Min: 14 Act: 29 Avg: 23 Max: 104
T: 4 (262519) P:80 I:3000 C: 3334 Min: 14 Act: 29 Avg: 23 Max: 135
7. 安裝更改配置文件/boot/config.txt, 以切換新的內核.
$ vi /boot/config.txt 最后一行添加:
kernel=vmlinuz-4.19.71-rt24-v8
之后重啟~~
8. 驗證是否是剛編譯的內核:
# uname -a
Linux ProfinetPI 4.19.71-rt24-v8 #1 SMP PREEMPT RT Wed Jan 26 01:35:13 CST 2022 aarch64 GNU/Linux
再次運行測試:
WARN: cyclictest was not built with the numa option
# /dev/cpu_dma_latency set to 0us
policy: fifo: loadavg: 0.93 0.63 0.27 1/147 741
T: 0 ( 737) P:80 I:1000 C: 10000 Min: 9 Act: 30 Avg: 24 Max: 93
T: 1 ( 738) P:80 I:1500 C: 6673 Min: 9 Act: 30 Avg: 24 Max: 109
T: 2 ( 739) P:80 I:2000 C: 5005 Min: 11 Act: 33 Avg: 24 Max: 101
T: 3 ( 740) P:80 I:2500 C: 4004 Min: 10 Act: 32 Avg: 27 Max: 99
T: 4 ( 741) P:80 I:3000 C: 3336 Min: 11 Act: 29 Avg: 25 Max: 94
Max值好像小了不少. 總體差別不到 . . . . 空載時候估計也不會有啥差別, 等cpu任務繁忙時再測試.