使用嵌入式 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)包括ADC、GPIO、I2C、UART、WDOG、SPI、CAN。Linux和FreeRTOS之間通過(guò) rpmsg協(xié)議進(jìn)行通信。
提交
Verdin AM62 LVGL 移植
基于 NXP iMX8MM 測(cè)試 Secure Boot 功能
隆重推出 Aquila - 新一代 Toradex 計(jì)算機(jī)模塊
Verdin iMX8MP 調(diào)試串口更改
NXP iMX8MM Cortex-M4 核心 GPT Capture 測(cè)試