基於全志A40i開發板——Linux-RT核心應用開發教程(1)

黃工發表於2022-04-19

目錄

1 Linux-RT核心簡介 3

2 Linux系統實時性測試 3

3 rt_gpio_ctrl案例 10

4 rt_input案例 15

本文為Linux-RT核心應用開發教程的第一章節——Linux-RT核心簡介、Linux系統實時性測試,歡迎各位閱讀!本期用到的案例板子是創龍科技旗下的A40i工業級別開發板,是基於全志科技A40i處理器設計,4核ARM Cortex-A7的高效能低功耗國產開發板,每核主頻高達1.2GHz。

基於全志A40i開發板——Linux-RT核心應用開發教程(1)

基於全志科技A40i開發板,其介面資源豐富,可引出雙路網口、雙路CAN、雙路USB、雙路RS485等通訊介面,板載Bluetooth、WIFI、4G(選配)模組,同時引出MIPI LCD、LVDS LCD、TFT LCD、HDMI OUT、CVBS OUT、CAMERA、LINE IN、H/P OUT等音視訊多媒體介面,支援雙屏異顯、1080P@45fps H.264視訊硬體編碼、1080P@60fps H.264視訊硬體解碼,並支援SATA大容量儲存介面。

A40i核心板採用100%國產元器件方案,並經過專業的PCB Layout和高低溫測試驗證,穩定可靠,可滿足各種工業應用環境,應用於能源電力、軌道交通、工業控制、工業閘道器、儀器儀表、安防監控等典型領域。

Linux-RT核心簡介

創龍科技提供的Linux-RT核心應用了開源的RT PREEMPT機制進行補丁。PREEMPT_RT補丁的關鍵是最小化不可搶佔的核心程式碼量,同時最小化必須更改的程式碼量,以便提供這種附加的可搶佔性。PREEMPT_RT補丁利用Linux核心的SMP功能來新增這種額外的搶佔性,而不需要完整的核心重寫。Linux-RT核心增加PREEMPT_RT補丁後,增加了系統響應的確定性和實時性,但是代價是CPU效能降低。

Linux-RT核心與普通Linux核心相比,幾個主要的相同之處是:

(1) 具有相同的開發生態系統,包括相同工具鏈、檔案系統和安裝方法,以及相同的POSIX API等。

(2) 仍然存在核心空間和使用者空間的劃分。

(3) Linux應用程式在使用者空間中執行。

Linux-RT核心與普通Linux核心在常規程式設計方式上的幾個主要不同之處是:

(1) 排程策略。

(2) 優先順序和記憶體控制。

(3) 基於Linux-RT核心的應用程式使用了排程策略後,系統將根據排程策略對其進行調優。

Linux系統實時性測試

本章節主要介紹使用Cyclictest延遲檢測工具測試Linux系統實時性的方法。Cyclictest是rt-tests測試套件下的一個測試工具,也是rt-tests下使用最廣泛的測試工具,一般主要用來測試核心的延遲,從而判斷核心的實時性。

創龍科技預設使用是的Linux核心,同時提供了Linux-RT核心位於產品資料“4-軟體資料\Linux\Kernel\bin\linux-3.10.65-[版本號]-[Git系列號]\”目錄下,請按照如下方法更換為Linux-RT核心。

將Linux-RT核心映象boot-rt.fex和Linux-RT核心配套的核心模組目錄modules-rt拷貝至Ubuntu工作目錄下,執行如下命令,將boot-rt.fex重新命名為boot.fex,並進入modules-rt目錄下將核心模組壓縮包解壓。

Host# mv boot-rt.fex boot.fex

Host# cd modules-rt/

Host# tar -zxf 3.10.65-rt69-g1f1e2d0.tar.gz

基於全志A40i開發板——Linux-RT核心應用開發教程(1)
圖 1

將重新命名後的核心映象和解壓後的核心模組拷貝至評估板檔案系統任意目錄下。執行如下命令替換核心映象和核心模組,評估板重啟生效。

備註:mmcblk1為Micro SD對應的裝置節點,如需固化至eMMC,請將裝置節點修改為mmcblk0。

Target# dd if=boot.fex of=/dev/mmcblk1p6

Target# cp 3.10.65-rt69-g1f1e2d0/ /lib/modules/ -r

Target# rm /system/vendor/ -r

Target# sync

Target# reboot

基於全志A40i開發板——Linux-RT核心應用開發教程(1)
圖 2
 
基於全志A40i開發板——Linux-RT核心應用開發教程(1)
圖 3 Linux-RT核心

Cyclictest工具簡介

Cyclictest常用於實時系統的基準測試,是評估實時系統相對效能的最常用工具之一。Cyclictest反覆測量並精確統計執行緒的實際喚醒時間,以提供有關係統的延遲資訊。它可測量由硬體、韌體和作業系統引起的實時系統的延遲。

為了測量延遲,Cyclictest執行一個非實時主執行緒(排程類SCHED_OTHER),該執行緒以定義的實時優先順序(排程類SCHED_FIFO)啟動定義數量的測量執行緒。測量執行緒週期性地被一個到期的計時器(迴圈報警)所定義的間隔喚醒,隨後計算有效喚醒時間,並通過共享記憶體將其傳遞給主執行緒。主執行緒統計延遲值並列印最小、最大和平均延遲時間。

參考連結:https://wiki.linuxfoundation.org/realtime/documentation/howto/tools/cyclictest/start?s[]=cyclictest。

編譯Cyclictest工具

將產品資料“4-軟體資料\Demo\linux-rt-demos\Cyclictest\”目錄下的rt-tests.tar.gz壓縮包複製到Ubuntu系統,執行如下命令將其解壓。

Host# tar -zxf rt-tests.tar.gz

基於全志A40i開發板——Linux-RT核心應用開發教程(1)
圖 4

請先確保已參考Linux系統使用手冊編譯過LinuxSDK,構建A40i處理器對應的GCC編譯器。進入解壓生成的rt-tests原始檔目錄執行如下命令,使用LinuxSDK開發包目錄下的GCC編譯器進行案例編譯。編譯完成後,將在當前目錄下生成可執行檔案。

Host# CC=/home/tronlong/A40i/lichee/out/sun8iw11p1/linux/common/buildroot/host/usr/bin/arm-linux-gnueabihf-gcc make

基於全志A40i開發板——Linux-RT核心應用開發教程(1)
圖 5
基於全志A40i開發板——Linux-RT核心應用開發教程(1)
圖 6

編譯完成後,將在當前路徑下生成cyclictest可執行檔案,將其複製到評估板檔案系統。

使用Cyclictest測試系統實時性

本次測試對比基於Linux-RT-3.10.65核心和Linux-3.10.65核心的Linux系統實時性。參照如下步驟,結合Iperf和Cyclictest工具測試系統的實時性。此處使用Iperf工具不斷觸發系統中斷,提高中斷處理負載,以便更好測試系統實時特性。

在Ubuntu執行如下命令檢視IP地址,並以伺服器模式啟動Iperf測試。

Host# ifconfig

Host# iperf -s -i 1

基於全志A40i開發板——Linux-RT核心應用開發教程(1)

圖 7

分別使用Linux-RT-3.10.65核心和Linux-3.10.65核心啟動評估板,執行如下命令以客戶端模式啟動Iperf,並連線到伺服器端(Ubuntu系統)。192.168.0.40為Ubuntu的IP地址,"-t3600"指定測試時間為3600秒,&表示讓程式在後臺執行。

Target# iperf -c 192.168.0.40 -d -t3600&

基於全志A40i開發板——Linux-RT核心應用開發教程(1)

圖 8

執行如下命令使用Cyclictest程式測試系統實時性。

Target# ./cyclictest -t5 -p98 -m -n -D10m

基於全志A40i開發板——Linux-RT核心應用開發教程(1)

圖 9 Linux-RT-3.10.65核心測試結果
 
基於全志A40i開發板——Linux-RT核心應用開發教程(1)
圖 10 Linux-3.10.65核心測試結果
 
表 1 Cyclictest測試結果說明

 


Cyclictest命令引數解析可執行"./cyclictest --help"檢視,如下圖所示。對比測試資料,可看到基於Linux-RT-3.10.65核心的系統的延時更加穩定,最大延時更低,系統實時性更佳。

基於全志A40i開發板——Linux-RT核心應用開發教程(1)

圖 11
基於全志A40i開發板——Linux-RT核心應用開發教程(1)
圖 12

好了,到這裡本次開發例程的第一章節就閱讀完畢,如需看到更多案例,請返回點選更多文章閱讀,歡迎您的關注,也可以在評論區留言獲取更多資料。

 

相關文章