工控網(wǎng)首頁(yè)
>

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

>

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

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

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

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

以 200us 為單位,翻轉(zhuǎn)一個(gè) GPIO,并測(cè)試信號(hào)在翻轉(zhuǎn)時(shí)候的抖動(dòng)。下面是具體測(cè)試情況:

1).   普通Linux

Linux:3.14.52,CONFIG_PREEMPT_VOLUNTARY=y

圖中可以看到抖動(dòng)分布的情況。92%的翻轉(zhuǎn)抖動(dòng)在40us以內(nèi),最糟糕的情況是超過(guò)15ms的延時(shí)。普通的 Linux很難保證每次任務(wù)都在規(guī)定的時(shí)間內(nèi)完成,即使我們把響應(yīng)時(shí)間上線放寬到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,抖動(dòng)分布更加集中在10 us以內(nèi),并且最大的延時(shí)為106us。

3).   Real-timeLinux – Xenomai

模塊:Colibri iMX6

Linux:3.14.52,Xenomai

Xenomai 通過(guò) co-kernel 的方式提供高于 Linux內(nèi)核優(yōu)先級(jí)運(yùn)行任務(wù)。同 PREEMPT_RT有相近的實(shí)時(shí)性能表現(xiàn),但最大的延時(shí)為17.5us。

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

模塊:ColibriiMX7

Linux:4.1.15 onCortex-A7

FreeRTOS: v8.0.0 onCortex-M4

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

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

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

投訴建議

提交

查看更多評(píng)論
其他資訊

查看更多

Verdin AM62 LVGL 移植

基于 NXP iMX8MM 測(cè)試 Secure Boot 功能

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

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

NXP iMX8MM Cortex-M4 核心 GPT Capture 測(cè)試