工控網(wǎng)首頁
>

應(yīng)用設(shè)計

>

使用嵌入式 Linux 進(jìn)行實(shí)時系統(tǒng)開發(fā)

使用嵌入式 Linux 進(jìn)行實(shí)時系統(tǒng)開發(fā)

對于實(shí)時、決策或者低延時應(yīng)用,Linux能夠提供多種方案。第一種方法是和 Linux 內(nèi)核一起運(yùn)行一個hypervisor或者co-kernel。這種方案中hypervisor或者co-kernel的優(yōu)先級高于 Linux,實(shí)時任務(wù)則運(yùn)行于其中。另外一種方式是使用非對稱異構(gòu)多核系統(tǒng),Linux和另外一個實(shí)時內(nèi)核分別運(yùn)行在不同處理器內(nèi)核上。最后,還可使 Linux 更具搶占性從而提高其實(shí)時性能。這通常可以通過PREEMPT_RT 補(bǔ)丁實(shí)現(xiàn)。

實(shí)時系統(tǒng)的實(shí)時能力,并不表示其能夠達(dá)到很高的處理速度。實(shí)時能力是指系統(tǒng)能夠在規(guī)定的時間內(nèi)完成響應(yīng),這個時間可以是微秒、毫秒甚至是秒級。越小的時間范圍對于系統(tǒng)的軟件和硬件要求也會更高。本文我們使用 Toradex 計算機(jī)模塊上通過三種不同的方法實(shí)嵌入式實(shí)時Linux方案。我們對于實(shí)時性能的測試方法如下

以 200us 為單位,翻轉(zhuǎn)一個 GPIO,并測試信號在翻轉(zhuǎn)時候的抖動。下面是具體測試情況:

1).   普通Linux

Linux:3.14.52,CONFIG_PREEMPT_VOLUNTARY=y

圖中可以看到抖動分布的情況。92%的翻轉(zhuǎn)抖動在40us以內(nèi),最糟糕的情況是超過15ms的延時。普通的 Linux很難保證每次任務(wù)都在規(guī)定的時間內(nèi)完成,即使我們把響應(yīng)時間上線放寬到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 補(bǔ)丁后,幾乎所有的任務(wù)都在 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)先級運(yùn)行任務(wù)。同 PREEMPT_RT有相近的實(shí)時性能表現(xiàn),但最大的延時為17.5us。

4).   iMX7 – HMP異構(gòu)多核處理

模塊:ColibriiMX7

Linux:4.1.15 onCortex-A7

FreeRTOS: v8.0.0 onCortex-M4

Colibri iMX7 在同一個處理器上集成了 Cortex-A7和 Cortex-M4 內(nèi)核,Cortex-A7 上可以運(yùn)行 Linux 等復(fù)雜、多任務(wù)操作系統(tǒng),而 Cortex-M4 則能運(yùn)行 FreeRTOS 等實(shí)時操作系統(tǒng),甚至是直接運(yùn)行應(yīng)用程序。由于實(shí)時任務(wù)和Linux 分別運(yùn)行在獨(dú)立的處理器內(nèi)核上,所以兩者之間不會產(chǎn)生 CPU 資源競爭,保證 M4 內(nèi)核上任務(wù)的獨(dú)占性。從上面測試的結(jié)果可以看到,信號翻轉(zhuǎn)幾乎都在 200us 的時間點(diǎn)上完成,最大的抖動是0.5us。

從上面的測試中可以看到,普通的Linux內(nèi)核很難保證任務(wù)的實(shí)時性,即在規(guī)定時間內(nèi)完成響應(yīng)。通過內(nèi)核補(bǔ)丁,或者像Xenomai一樣,引入高優(yōu)先級的co-kernel,都可以很大程度上改善Linux的實(shí)時性。用戶可以在不改變硬件平臺的情況下實(shí)現(xiàn)實(shí)時應(yīng)用。基于軟件方式實(shí)現(xiàn)的實(shí)時Linux,意味著部分Linux內(nèi)核API發(fā)生了變化。為了保證整個任務(wù)的實(shí)時性,用戶可能需要修改部分外設(shè)驅(qū)動代碼,例如CAN驅(qū)動。因?yàn)槟J(rèn)的外設(shè)驅(qū)動并不是針對實(shí)時Linux內(nèi)核。Colibri iMX7通過硬件的方式,通過不同的處理器內(nèi)核分離非實(shí)時和實(shí)時任務(wù)。

Cortex-A7采用普通的Linux內(nèi)核,兼容所有的外設(shè)驅(qū)動,用戶能夠利用Linux系統(tǒng)豐富的開發(fā)資源。而實(shí)時任務(wù)由Cortex-M4完成,目前FreeRTOS所支持的外設(shè)驅(qū)動包括ADCGPIOI2CUARTWDOGSPICANLinuxFreeRTOS之間通過 rpmsg協(xié)議進(jìn)行通信。

投訴建議

提交

查看更多評論
其他資訊

查看更多

Verdin AM62 LVGL 移植

基于 NXP iMX8MM 測試 Secure Boot 功能

隆重推出 Aquila - 新一代 Toradex 計算機(jī)模塊

Verdin iMX8MP 調(diào)試串口更改

NXP iMX8MM Cortex-M4 核心 GPT Capture 測試