使用嵌入式 Linux 進行實時系統(tǒng)開發(fā)
對于實時、決策或者低延時應用,Linux能夠提供多種方案。第一種方法是和 Linux 內(nèi)核一起運行一個hypervisor或者co-kernel。這種方案中hypervisor或者co-kernel的優(yōu)先級高于 Linux,實時任務則運行于其中。另外一種方式是使用非對稱異構多核系統(tǒng),Linux和另外一個實時內(nèi)核分別運行在不同處理器內(nèi)核上。最后,還可使 Linux 更具搶占性從而提高其實時性能。這通??梢酝ㄟ^PREEMPT_RT 補丁實現(xiàn)。
實時系統(tǒng)的實時能力,并不表示其能夠達到很高的處理速度。實時能力是指系統(tǒng)能夠在規(guī)定的時間內(nèi)完成響應,這個時間可以是微秒、毫秒甚至是秒級。越小的時間范圍對于系統(tǒng)的軟件和硬件要求也會更高。本文我們使用 Toradex 計算機模塊上通過三種不同的方法實嵌入式實時Linux方案。我們對于實時性能的測試方法如下
以 200us 為單位,翻轉一個 GPIO,并測試信號在翻轉時候的抖動。下面是具體測試情況:
1). 普通Linux
Linux:3.14.52,CONFIG_PREEMPT_VOLUNTARY=y
圖中可以看到抖動分布的情況。92%的翻轉抖動在40us以內(nèi),最糟糕的情況是超過15ms的延時。普通的 Linux很難保證每次任務都在規(guī)定的時間內(nèi)完成,即使我們把響應時間上線放寬到10ms。
2). Real-timeLinux – PREEMPT_RT
Linux:3.14.52,PREEMPT_RT_FULL
<p CxSpLast" style="margin-left:18.0pt">PREEMPT_RT patch: https://www.kernel.org/pub/linux/kernel/projects/rt/
在使用 PREEMPT_RT 補丁后,幾乎所有的任務都在 40us.相比于普通 Linux,抖動分布更加集中在10 us以內(nèi),并且最大的延時為106us。
3). Real-timeLinux – Xenomai
模塊:Colibri iMX6
Linux:3.14.52,Xenomai
Xenomai 通過 co-kernel 的方式提供高于 Linux內(nèi)核優(yōu)先級運行任務。同 PREEMPT_RT有相近的實時性能表現(xiàn),但最大的延時為17.5us。
4). iMX7 – HMP異構多核處理
模塊:ColibriiMX7
Linux:4.1.15 onCortex-A7
FreeRTOS: v8.0.0 onCortex-M4
Colibri iMX7 在同一個處理器上集成了 Cortex-A7和 Cortex-M4 內(nèi)核,Cortex-A7 上可以運行 Linux 等復雜、多任務操作系統(tǒng),而 Cortex-M4 則能運行 FreeRTOS 等實時操作系統(tǒng),甚至是直接運行應用程序。由于實時任務和Linux 分別運行在獨立的處理器內(nèi)核上,所以兩者之間不會產(chǎn)生 CPU 資源競爭,保證 M4 內(nèi)核上任務的獨占性。從上面測試的結果可以看到,信號翻轉幾乎都在 200us 的時間點上完成,最大的抖動是0.5us。
從上面的測試中可以看到,普通的Linux內(nèi)核很難保證任務的實時性,即在規(guī)定時間內(nèi)完成響應。通過內(nèi)核補丁,或者像Xenomai一樣,引入高優(yōu)先級的co-kernel,都可以很大程度上改善Linux的實時性。用戶可以在不改變硬件平臺的情況下實現(xiàn)實時應用。基于軟件方式實現(xiàn)的實時Linux,意味著部分Linux內(nèi)核API發(fā)生了變化。為了保證整個任務的實時性,用戶可能需要修改部分外設驅(qū)動代碼,例如CAN驅(qū)動。因為默認的外設驅(qū)動并不是針對實時Linux內(nèi)核。Colibri iMX7通過硬件的方式,通過不同的處理器內(nèi)核分離非實時和實時任務。
Cortex-A7采用普通的Linux內(nèi)核,兼容所有的外設驅(qū)動,用戶能夠利用Linux系統(tǒng)豐富的開發(fā)資源。而實時任務由Cortex-M4完成,目前FreeRTOS所支持的外設驅(qū)動包括ADC、GPIO、I2C、UART、WDOG、SPI、CAN。Linux和FreeRTOS之間通過 rpmsg協(xié)議進行通信。
提交
Verdin AM62 LVGL 移植
基于 NXP iMX8MM 測試 Secure Boot 功能
隆重推出 Aquila - 新一代 Toradex 計算機模塊
Verdin iMX8MP 調(diào)試串口更改
NXP iMX8MM Cortex-M4 核心 GPT Capture 測試