基于ARM的Linux實(shí)時(shí)搶占補(bǔ)丁的研究與實(shí)現(xiàn)*
王帥華1,2,楊東升2,王允森1,2,袁曉慧1,2
(1.中國(guó)科學(xué)院大學(xué),北京100049;2.中國(guó)科學(xué)院 沈陽(yáng)計(jì)算技術(shù)研究所,沈陽(yáng)110168)
摘要:隨著ARM處理器計(jì)算能力的提高,該類(lèi)型的處理器在嵌入式領(lǐng)域的應(yīng)用越來(lái)越廣泛的同時(shí),也得到了數(shù)控系統(tǒng)的青睞。結(jié)合數(shù)控系統(tǒng)的實(shí)時(shí)加工技術(shù)的要求,通過(guò)分析和研究Linux實(shí)時(shí)搶占補(bǔ)丁(RT-Preempt patch)技術(shù),提出了一種基于ARM微處理器TI AM3358的嵌入式實(shí)時(shí)系統(tǒng)解決方案。在以TI AM3358為硬件平臺(tái)的Linux嵌入式系統(tǒng)中實(shí)現(xiàn)了RT-Preempt的應(yīng)用,并對(duì)任務(wù)調(diào)度延遲、中斷響應(yīng)延遲和優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題進(jìn)行了測(cè)試。經(jīng)試驗(yàn)證明,提出的實(shí)時(shí)系統(tǒng)解決方案可以滿(mǎn)足中檔數(shù)控系統(tǒng)實(shí)時(shí)加工的需求。
關(guān)鍵詞:可搶占實(shí)時(shí)補(bǔ)?。磺度胧綄?shí)時(shí)系統(tǒng);嵌入式數(shù)控系統(tǒng)
文章編號(hào):1001-2265(2015)09-0001-04
收稿日期:2014-11-25
基金項(xiàng)目:*"核高基"專(zhuān)項(xiàng)(2012ZX01029-001-002)
作者簡(jiǎn)介:王帥華(1988—),男,山東日照人,中國(guó)科學(xué)院大學(xué)碩士研究生,研究方向?yàn)閷?shí)時(shí)系統(tǒng),(E-mail)wangshuaihua@sict.ac.cn;楊東升(1965—),男,沈陽(yáng)人,中國(guó)科學(xué)院研究員,博士生導(dǎo)師,研究方向?yàn)樽詣?dòng)控制、數(shù)控技術(shù)等。
中圖分類(lèi)號(hào):TH164;TG65
Research and Implementation on RT-Preempt Patch of Linux Based on ARM
WANG Shuai-hua1,2, YANG Dong-sheng2, WANG Yun-sen1,2, YUAN Xiao-hui1,2
(1. University of Chinese Academy of Sciences, Beijing 100049, China; 2. Shenyang Institute of Computing Technology, Chinese Academy of Science, Shenyang 110168, China)
Abstract:With the increase in computing power of ARM processor, this type of processors are used more and more widely in embedded field, at the same time, they are favored by the CNC system. Through analysis and study of the Linux real-time preemption patch (RT-Preempt) presented a new embedded real-time system solution based on ARM microprocessor TI AM3358 and RT-Preempt. Finally, this paper completed the measurement of task schedule latency, interrupt response delay and priority inversion problem which affect the performance of real-time system. The results of the experiment support that the performance of that solution can meet the demand of real-time processing from CNC.
Key words: real-time preemption patch; embedded real-time system; embedded CNC
0引言
嵌入式系統(tǒng)平臺(tái)包括硬件平臺(tái)和軟件平臺(tái)。硬件系統(tǒng)平臺(tái)主要包括x86平臺(tái)和以ARM為代表的RISC平臺(tái)。軟件平臺(tái)主要有Linux、WinCE、Vxworks、QNX和pSOS等系統(tǒng)平臺(tái)[1]?;趚86的處理器功耗大、成本高、體積大并且外圍電路復(fù)雜,而基于ARM的處理器功耗低、成本低、體積小并且外圍電路簡(jiǎn)單。ARM處理器的計(jì)算能力不斷提高,最新的ARM處理器的已經(jīng)可以滿(mǎn)足中檔數(shù)控系統(tǒng)計(jì)算能力的要求[2]。Linux系統(tǒng)作為嵌入式軟件系統(tǒng)有它獨(dú)特的優(yōu)勢(shì),其開(kāi)源的特性使我們可以對(duì)其進(jìn)行深度定制和實(shí)時(shí)性改造。
1Linux實(shí)時(shí)化技術(shù)
Linux作為一個(gè)通用的操作系統(tǒng),為了適應(yīng)服務(wù)器和用戶(hù)桌面的應(yīng)用,增加系統(tǒng)的吞吐量和用戶(hù)體驗(yàn),被設(shè)計(jì)成分時(shí)操作系統(tǒng)。而嵌入式實(shí)時(shí)控制領(lǐng)域?qū)ο到y(tǒng)的實(shí)時(shí)性要求比較高,所以需要對(duì)Linux系統(tǒng)進(jìn)行實(shí)時(shí)化改造。
對(duì)Linux的實(shí)時(shí)化改造有兩種方法:
(1)對(duì)Linux內(nèi)核進(jìn)行修改,優(yōu)化Linux的實(shí)時(shí)性能;
(2)采用雙內(nèi)核方案,增加一個(gè)實(shí)時(shí)內(nèi)核,有實(shí)時(shí)要求的任務(wù)都在這個(gè)實(shí)時(shí)內(nèi)核上運(yùn)行,標(biāo)準(zhǔn)Linux內(nèi)核作為這個(gè)實(shí)時(shí)內(nèi)核優(yōu)先級(jí)最低的一個(gè)進(jìn)程[3-4]。
對(duì)Linux內(nèi)核改造的主要產(chǎn)物有:RED-Linux、Hard-hat Linux、Kurt-Linux和RT-Preempt等[5]。對(duì)標(biāo)準(zhǔn)Linux實(shí)施雙內(nèi)核改造的產(chǎn)物有:RTLinux、RTAI(Real-Time Application Interface)和Xenomai等。
與使用雙內(nèi)核的方法相比,對(duì)標(biāo)準(zhǔn)Linux內(nèi)核直接改造的方法更適合在新硬件平臺(tái)上進(jìn)行嵌入式實(shí)時(shí)系統(tǒng)的研發(fā)。TI AM3358是TI公司新推出的硬件平臺(tái),具有720MHz的主頻和較強(qiáng)的運(yùn)算能力,適合在數(shù)控系統(tǒng)中應(yīng)用,但是目前官方還沒(méi)有雙內(nèi)核方案對(duì)該平臺(tái)的完整支持。因此,我們選擇RT-Preempt對(duì)現(xiàn)有的Linux內(nèi)核進(jìn)行實(shí)時(shí)性改造。
2TI AM 3358微處理器
基于ARM Cortex-A8的AM3358微處理器在圖像、圖形處理、外設(shè)和諸如EtherCAT和PROFIBUS的工業(yè)接口選項(xiàng)方面進(jìn)行了增強(qiáng)。處理器主頻最高可以達(dá)到720MHz,具有單錯(cuò)檢測(cè)(奇偶校驗(yàn))的32KB L1指令/數(shù)據(jù)高速緩存,含糾錯(cuò)碼(ECC)的256KB L2高速緩存,支持移動(dòng)雙倍速率同步動(dòng)態(tài)隨機(jī)存儲(chǔ)器(mDDR)(低功耗DDR(LPDDR))/DDR2/DDR3,支持通用存儲(chǔ)器(NAND,NOR,SRAM,等),支持高達(dá)16位ECC,支持最多2個(gè)具有集成物理層的USB 2.0高速OTG端口,支持最多2個(gè)端口的10/100/1000以太網(wǎng)交換機(jī),串口包括:2個(gè)控制器局域網(wǎng)端口(CAN),6個(gè)UART,2個(gè)McASPI,2個(gè)McSPI和3個(gè)I2C端口,支持硬件加密加速(AES,SHA,PKA,RNG)。在這款符合工控要求的嵌入式處理器硬件平臺(tái)之上,整個(gè)嵌入式實(shí)時(shí)系統(tǒng)的實(shí)時(shí)性能主要由操作系統(tǒng)決定。
3Linux實(shí)時(shí)搶占補(bǔ)丁實(shí)現(xiàn)原理
Linux實(shí)時(shí)補(bǔ)丁現(xiàn)主要由Ingo Molnar和Thomas Gleixner維護(hù),并且由開(kāi)源自動(dòng)化開(kāi)發(fā)實(shí)驗(yàn)室(OSADL)對(duì)其穩(wěn)定性測(cè)試。最新版的實(shí)時(shí)補(bǔ)丁隨Linux內(nèi)核一同發(fā)布,并且越來(lái)越多的實(shí)時(shí)搶占補(bǔ)丁的內(nèi)容被官方Linux項(xiàng)目接收[6],融入到發(fā)行版的Linux內(nèi)核中。Linux實(shí)時(shí)補(bǔ)丁相比于雙內(nèi)核機(jī)制方案最大的優(yōu)勢(shì)在于它遵循POSIX標(biāo)準(zhǔn),使用該補(bǔ)丁的實(shí)時(shí)系統(tǒng)應(yīng)用程序和驅(qū)動(dòng)程序與非實(shí)時(shí)系統(tǒng)的應(yīng)用和驅(qū)動(dòng)程序差異很小,因此,在使用該補(bǔ)丁的平臺(tái)上做相應(yīng)的開(kāi)發(fā)比雙內(nèi)核機(jī)制的方案更容易。另外,該補(bǔ)丁與硬件平臺(tái)相關(guān)性小,可移植性高。
3.1實(shí)時(shí)補(bǔ)丁的工作原理
通常情況下Linux內(nèi)核僅僅在以下三種情況下允許進(jìn)程間的搶占:
(1)當(dāng)CPU運(yùn)行在用戶(hù)態(tài)時(shí);
(2)當(dāng)內(nèi)核代碼從系統(tǒng)調(diào)用或者中斷返回到用戶(hù)空間時(shí);
(3)當(dāng)內(nèi)核代碼塊阻塞在互斥量或者明確地將控制權(quán)交給另外一個(gè)進(jìn)程時(shí)。
如果內(nèi)核代碼正在執(zhí)行時(shí)有高優(yōu)先級(jí)事件產(chǎn)生,該高優(yōu)先級(jí)線(xiàn)程不能搶占正在執(zhí)行中的內(nèi)核代碼,該線(xiàn)程只能等到內(nèi)核代碼明確地交出控制權(quán)才能得到執(zhí)行。在更糟糕的情況下這個(gè)延遲會(huì)達(dá)到上百毫秒或者更大。這在實(shí)時(shí)系統(tǒng)中是不能接受的。
Linux實(shí)時(shí)補(bǔ)丁通過(guò)以下方法將純凈的Linux內(nèi)核轉(zhuǎn)變成一個(gè)完全可搶占的內(nèi)核:
(1)通過(guò)使用rtmutex重新實(shí)現(xiàn)自旋鎖來(lái)實(shí)現(xiàn)內(nèi)核鎖原語(yǔ)的可搶占操作;
(2)為了解決優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題,為內(nèi)核中的自旋鎖和信號(hào)量實(shí)現(xiàn)優(yōu)先級(jí)繼承策略;
(3)將中斷處理程序轉(zhuǎn)換成可搶占的內(nèi)核線(xiàn)程;
(4)提高了用戶(hù)空間POSIX定時(shí)器的精度。
3.2實(shí)時(shí)補(bǔ)丁的具體實(shí)現(xiàn)
(1)可搶占自旋鎖的實(shí)現(xiàn)。以spin_lock_irqsave宏函數(shù)為例:
#define spin_lock_irqsave(lock, flags)
在對(duì)spin_lock()函數(shù)的調(diào)用上沒(méi)有任何區(qū)別,主要區(qū)別在spin_lock函數(shù)的實(shí)現(xiàn):
首先,普通的自旋鎖的實(shí)現(xiàn)如下:
#define spin_lock (lock) _spin_lock(lock)
void__lockfunc_spin_lock(spinlock_t*lock)
{
preempt_disable();
_raw_spin_lock(lock);
}
在自旋鎖普通的實(shí)現(xiàn)中,最先通過(guò)調(diào)用preempt_disable()是禁止進(jìn)程搶占,再調(diào)用獲取自旋鎖的_raw_spin_lock()函數(shù)。而可搶占實(shí)時(shí)補(bǔ)丁中自旋鎖的實(shí)現(xiàn)如下代碼所示:
#define spin_lock(lock)
可搶占內(nèi)核用rt_spin_lock()重新改寫(xiě)了自旋鎖的實(shí)現(xiàn)。在rt_spin_lock()函數(shù)的實(shí)現(xiàn)中調(diào)用了rt_spin_lock_fastlock()函數(shù),而rt_spin_lock_fastlock()函數(shù)是自旋鎖可搶占實(shí)現(xiàn)的關(guān)鍵代碼,因?yàn)樵谠摵瘮?shù)中調(diào)用了might_sleep()函數(shù),might_sleep()這個(gè)函數(shù)的作用是指示當(dāng)前進(jìn)程可以睡眠,可以睡眠意味這可以交出CPU的控制權(quán),即,該進(jìn)程可以被搶占。該函數(shù)的實(shí)現(xiàn)代碼如下所示:
static inline void rt_spin_lock_fastlock ()
{
might_sleep();
……
}
might_sleep()的函數(shù)的實(shí)現(xiàn)如下代碼所示:
#define might_sleep() do{ might_resched(); } while (0)
通過(guò)對(duì)可搶占實(shí)時(shí)補(bǔ)丁的源代碼的分析可以看出在該補(bǔ)丁中對(duì)自旋鎖的實(shí)現(xiàn)完全拋開(kāi)了非搶占內(nèi)核中對(duì)自旋鎖實(shí)現(xiàn)的方式,并且保留了非搶占自旋鎖的實(shí)現(xiàn)。所以可以繼續(xù)使用_raw_spin_lock()函數(shù)創(chuàng)建不可搶占的內(nèi)核區(qū)域。
(2)優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題的解決。在uc/OS-II中不支持優(yōu)先級(jí)繼承,使用的是優(yōu)先級(jí)天花板方式解決的優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題。這種方法存在的問(wèn)題是,只要有進(jìn)程訪(fǎng)問(wèn)可能引起優(yōu)先級(jí)發(fā)轉(zhuǎn)的資源時(shí),不論是否發(fā)生優(yōu)先級(jí)反轉(zhuǎn),都會(huì)對(duì)該進(jìn)程的優(yōu)先級(jí)進(jìn)行調(diào)整,浪費(fèi)了許多CPU資源,也影響了系統(tǒng)的實(shí)時(shí)性[7]。而Linux在中采用優(yōu)先級(jí)繼承的解決方法時(shí),只有在低優(yōu)先級(jí)進(jìn)程占用資源并阻塞高優(yōu)先級(jí)進(jìn)程時(shí)才會(huì)對(duì)占有該資源低優(yōu)先級(jí)進(jìn)程的優(yōu)先級(jí)的調(diào)整,這樣可以減少不必要的CPU資源消耗??蓳屨紝?shí)時(shí)補(bǔ)丁實(shí)現(xiàn)的優(yōu)先級(jí)繼承策略已經(jīng)被內(nèi)核項(xiàng)目接收,成為內(nèi)核源碼的一部分,其實(shí)現(xiàn)在/kernel/rtmutex.c文件中。
(3)中斷線(xiàn)程化。中斷線(xiàn)程化包括兩部分:硬中斷線(xiàn)程化和軟中斷線(xiàn)程化。
軟中斷的線(xiàn)程化在spawn_ksoftirqd()中完成,該函數(shù)在內(nèi)核初始化的時(shí)候執(zhí)行,他通過(guò)kthread_create()調(diào)用run_ksoftirqd()創(chuàng)建相應(yīng)的軟中斷線(xiàn)程,設(shè)置中斷線(xiàn)程的優(yōu)先級(jí),軟中斷線(xiàn)程采用SCHED_FIFO實(shí)時(shí)調(diào)度策略。軟中斷線(xiàn)程化后,所有的軟中斷都轉(zhuǎn)到線(xiàn)程中去處理。其執(zhí)行時(shí)機(jī)是當(dāng)硬中斷處理完后,在irq_exit()中調(diào)用do_softirqd()通過(guò)wakeup_softirq()喚醒相應(yīng)的中斷處理程序。
硬中斷的線(xiàn)程化在__setup_irq()中完成,通過(guò)kthread_create()調(diào)用irq_thread()創(chuàng)建相應(yīng)的處理線(xiàn)程,硬中斷線(xiàn)程也是采用SCHED_FIFO的調(diào)度策略。其線(xiàn)程的優(yōu)先級(jí)比軟中斷線(xiàn)程的優(yōu)先級(jí)要高,為用戶(hù)線(xiàn)程優(yōu)先級(jí)的一半。__setup_irq()被setup_irq()、request_irq()或request_threaded_irq()調(diào)用。中斷發(fā)生時(shí),硬中斷的處理在do_IRQ()中完成,最后通過(guò)handle_IRQ_event()喚醒相應(yīng)的中斷線(xiàn)程來(lái)處理。
需要注意的是:并不是所有的中斷都可線(xiàn)程化,例如時(shí)鐘中斷具有最高優(yōu)先級(jí),用于驅(qū)動(dòng)整個(gè)系統(tǒng),就不能被線(xiàn)程化。對(duì)于不能被線(xiàn)程化的中斷需要在中斷的irqaction結(jié)構(gòu)體中對(duì)flags成員加上IRQF_NODELAY標(biāo)記。對(duì)于時(shí)鐘中斷,因?yàn)镮RQF_TIMER標(biāo)記包含了IRQF_NODELAY標(biāo)記,只需要加上IRQF_TIMER標(biāo)記即可。
4基于實(shí)時(shí)搶占補(bǔ)丁的系統(tǒng)平臺(tái)的構(gòu)建
RT-Preempt在TI AM 3358平臺(tái)的移植過(guò)程中的關(guān)鍵技術(shù)為高精度時(shí)鐘的實(shí)現(xiàn),因?yàn)橛嘘P(guān)任務(wù)調(diào)度和中斷線(xiàn)程的調(diào)度都與時(shí)鐘有關(guān)。在內(nèi)核文件kernel/sched_clock.c中,有一個(gè)平臺(tái)無(wú)關(guān)的sched_clock()函數(shù)的實(shí)現(xiàn),該函數(shù)的關(guān)鍵代碼為:
(jiffies-INITIAL_JIFFIES)*(NSEC_PER_SEC/HZ);
從該語(yǔ)句中可以看出,該實(shí)現(xiàn)基于系統(tǒng)的jiffies,而jiffies與Hz有關(guān),即jiffies=1/Hz秒。若使用高精度的時(shí)鐘定時(shí)器,必須實(shí)現(xiàn)TI AM3358平臺(tái)的sched_clock()函數(shù)。
TI AM 3358處理器的主頻為720MHz,可以提供高達(dá)1/(720×106)=1.4ns的計(jì)時(shí)分辨率。
sched_clock()函數(shù)實(shí)現(xiàn)偽代碼:
unsigned long long notrace sched_clock (void)
{
u32 cyc = 0;
_ raw_spin_lock(&lock);
cyc = 讀取定時(shí)器時(shí)間戳;
_ raw_spin_unlock(&lock);
return cyc_2_ns(cyc, (u32)~0);
}
實(shí)現(xiàn)該分辨率時(shí)鐘,首先讀取定時(shí)器的時(shí)間戳,然后將時(shí)間戳轉(zhuǎn)換成ns并返回,cyc_2_ns()函數(shù)的實(shí)現(xiàn)可以參考公式(1)。
ns=(cycles·mult)>>shift
(1)
在該公式中shift的取值為(u32)~0,mult被限制為32位的整數(shù)。
為了使Linux實(shí)時(shí)可搶占補(bǔ)丁生效,需要對(duì)內(nèi)核做相應(yīng)的配置:
(1)使能CONFIG_PREEMPT選項(xiàng)。在3.x版本的內(nèi)核需要開(kāi)啟以下三個(gè)選項(xiàng),它們是:
CONFIG_PREEMPT=y
CONFIG_PREEMPT_RT_BASE=y
CONFIG_PREEMPT_RT_FULL=y
(2)激活高精度時(shí)鐘選項(xiàng)。
CONFIG_HIGH_RES_TIMERS=y
(3)禁用所有的電源管理選項(xiàng)。例如,ACPI和APM等。
5實(shí)時(shí)性能測(cè)試及分析
一般來(lái)講對(duì)實(shí)時(shí)系統(tǒng)的“實(shí)時(shí)性”的衡量指標(biāo)主要有兩個(gè):一是任務(wù)調(diào)度延遲,二是中斷處理延遲[8]。此外優(yōu)先級(jí)反轉(zhuǎn)也是影響實(shí)時(shí)系統(tǒng)性能重要因素之一。
任務(wù)調(diào)度延遲是指任務(wù)從需要被調(diào)度到任務(wù)實(shí)際被調(diào)度的時(shí)間段。圖1和圖2是分別對(duì)Linux重CPU負(fù)載的情況下使用clock_nanosleep(TIME_ABSTIME)和POSIX interval timer定時(shí)器對(duì)任務(wù)調(diào)度延遲進(jìn)行的測(cè)試。從測(cè)試結(jié)果中可以看出在使用clock_nanosleep定時(shí)器測(cè)試時(shí),實(shí)時(shí)可搶占內(nèi)核的Linux系統(tǒng)的最小、平均和最大任務(wù)調(diào)度延遲都小于普通Linux內(nèi)核的最小、平均和最大延遲,尤其是最大任務(wù)調(diào)度延遲實(shí)時(shí)可搶占內(nèi)核的延遲比普通內(nèi)核的最大調(diào)度延遲小兩個(gè)數(shù)量級(jí)。在使用POSIX interval timer定時(shí)器的測(cè)試中,雖然實(shí)時(shí)可搶占的Linux內(nèi)核的最小和平均延遲比標(biāo)準(zhǔn)Linux內(nèi)核略大,但是還是在同一個(gè)數(shù)量級(jí)內(nèi)(100μs以?xún)?nèi)),而在最大延遲方面可搶占實(shí)時(shí)Linux內(nèi)核比普通Linux內(nèi)核同樣是小了兩個(gè)數(shù)量級(jí)——實(shí)時(shí)可搶占Linux內(nèi)核的最大延遲為105μs,而普通Linux內(nèi)核的最大延遲為2353μs,這遠(yuǎn)遠(yuǎn)超過(guò)了該實(shí)時(shí)系統(tǒng)的要求(系統(tǒng)的任務(wù)調(diào)度周期是1ms)。
圖1 clock_nanosleep在兩種系統(tǒng)上的對(duì)比
圖2 POSIX timer在兩種系統(tǒng)上的對(duì)比
中斷處理延遲是指從中斷產(chǎn)生到該中斷得到響應(yīng)的時(shí)間間隔。Linux中斷分為上半部和下半部,上半部對(duì)中斷信號(hào)進(jìn)行響應(yīng),但是具體的中斷處理工作將會(huì)有下半部執(zhí)行,中斷處理程序不會(huì)立刻被執(zhí)行,而是被放在等待隊(duì)列中,等CPU空閑時(shí)才會(huì)得到執(zhí)行[9]。
對(duì)用于工業(yè)控制系統(tǒng)來(lái)說(shuō)對(duì)中斷響應(yīng)的延遲要求比較高,如果中斷得不到及時(shí)的響應(yīng)很可能會(huì)造成災(zāi)難性的后果。所以中斷響應(yīng)也是對(duì)實(shí)時(shí)系統(tǒng)測(cè)試的一個(gè)重要標(biāo)準(zhǔn)。原基于X86的RTAI/Linux實(shí)時(shí)數(shù)控系統(tǒng)對(duì)中斷響應(yīng)周期為2ms,而標(biāo)準(zhǔn)的Linux內(nèi)核對(duì)2ms周期的中斷響應(yīng)時(shí)存在中斷丟失的情況。該系統(tǒng)平臺(tái)使用FPGA編程負(fù)責(zé)產(chǎn)生2ms/次的中斷,該硬件每2ms向CPU其中的一個(gè)寄存器中寫(xiě)入連續(xù)的數(shù)字,并且每40ns向CPU的另外一個(gè)寄存器也寫(xiě)入一個(gè)連續(xù)的數(shù)字,由內(nèi)核中的中斷處理程序?qū)拇嫫渲械臄?shù)據(jù)進(jìn)行讀取并計(jì)算數(shù)字的連續(xù)性和兩次中斷響應(yīng)的時(shí)間間隔。根據(jù)下面的公式計(jì)算兩次響應(yīng)的時(shí)間間隔和中斷響應(yīng)的抖動(dòng)時(shí)間。
ΔT=Tnew-Told
(2)
ΔTjitter=ΔT×40-2000000
(3)
通過(guò)公式(2)計(jì)算出兩次響應(yīng)的寄存器中的時(shí)間間隔,該寄存器由FPGA負(fù)責(zé)修改,每40ns修改一次。公式(3)用于計(jì)算這兩次響應(yīng)的真實(shí)的時(shí)間間隔與中斷周期2ms之間的差值,該值即為中斷響應(yīng)的時(shí)間抖動(dòng)值,如圖3所示。該圖為2ms中斷響應(yīng)周期條件下對(duì)2ms/次的中斷響應(yīng)時(shí)間的抖動(dòng)值,從圖中可以看出最大的抖動(dòng)值在300μs左右,在以2ms為中斷周期的條件下,該中斷響應(yīng)延遲在CNC系統(tǒng)中是可以接受。為了取得更好的測(cè)試效果,本次實(shí)驗(yàn)中嘗試了使用1ms中斷響應(yīng)周期對(duì)2ms/次的中斷進(jìn)行響應(yīng),其測(cè)試結(jié)果如圖4所示。從實(shí)驗(yàn)結(jié)果中可以看出在1ms中斷響應(yīng)周期下對(duì)中斷的響應(yīng)延遲在1.5μs以?xún)?nèi),可以滿(mǎn)足中檔數(shù)控系統(tǒng)實(shí)時(shí)加工的需求。
圖3 2ms中斷響應(yīng)周期抖動(dòng)圖
圖4 1ms中斷響應(yīng)周期抖動(dòng)圖
優(yōu)先級(jí)反轉(zhuǎn)對(duì)于實(shí)時(shí)系統(tǒng)來(lái)說(shuō)同樣是致命的。對(duì)實(shí)時(shí)可搶占Linux系統(tǒng)的優(yōu)先級(jí)反轉(zhuǎn)的測(cè)試如圖5所示。在該優(yōu)先級(jí)反轉(zhuǎn)的測(cè)試中,每組有三個(gè)線(xiàn)層:低優(yōu)先級(jí)線(xiàn)程、中優(yōu)先級(jí)線(xiàn)程和高優(yōu)先級(jí)線(xiàn)程。中優(yōu)先級(jí)線(xiàn)程執(zhí)行時(shí)由低優(yōu)先級(jí)進(jìn)程持有mutex,這時(shí)高優(yōu)先級(jí)線(xiàn)程申請(qǐng)mutex時(shí)會(huì)被阻塞,同時(shí)低優(yōu)先級(jí)線(xiàn)程會(huì)繼承高優(yōu)先級(jí)線(xiàn)程的優(yōu)先級(jí),直到低優(yōu)先級(jí)線(xiàn)程執(zhí)行完畢并釋放mutex時(shí),高優(yōu)先級(jí)線(xiàn)程才能得到執(zhí)行,避免死鎖。從執(zhí)行結(jié)果中可以看出,在2min的時(shí)間內(nèi)總共進(jìn)行了773018組測(cè)試,并沒(méi)有發(fā)生死鎖問(wèn)題。可以知道實(shí)時(shí)可搶占Linux內(nèi)核已經(jīng)解決了系統(tǒng)中優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題。
圖5 RT-Preempt Linux系統(tǒng)優(yōu)先級(jí)反轉(zhuǎn)測(cè)試
6結(jié)論
本文首先分析了嵌入式Linux實(shí)時(shí)系統(tǒng)的實(shí)現(xiàn)方法,著重分析了RT-Preempt實(shí)時(shí)補(bǔ)丁的實(shí)現(xiàn)原理,在基于ARM cortex-A8內(nèi)核的TI AM3358處理器平臺(tái)采用Linux實(shí)時(shí)可搶占補(bǔ)丁的方法構(gòu)建了嵌入式實(shí)時(shí)系統(tǒng)平臺(tái),并對(duì)該系統(tǒng)平臺(tái)設(shè)計(jì)和進(jìn)行了實(shí)時(shí)性測(cè)試。實(shí)驗(yàn)結(jié)果表明基于ARM處理器TI AM3358的嵌入式RT-Preempt+Linux實(shí)時(shí)系統(tǒng)可以滿(mǎn)足工業(yè)級(jí)實(shí)時(shí)性的要求,實(shí)現(xiàn)數(shù)控系統(tǒng)的實(shí)時(shí)加工。本課題對(duì)數(shù)控系統(tǒng)向小型化和經(jīng)濟(jì)化的發(fā)展有著重要的參考價(jià)值。
[參考文獻(xiàn)]
[1] 蘇宇. 基于Xenomai的實(shí)時(shí)Linux系統(tǒng)的研究[J].計(jì)算機(jī)技術(shù)與發(fā)展,2013,23(10):1-5.
[2] 陸小虎,劉玉香,于東,等.基于CORTEX-A8處理器的嵌入式數(shù)控系統(tǒng)試試平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[J].小型微型計(jì)算機(jī)系統(tǒng),2013,34(7): 1689-1692.
[3] 劉濤. 一種嵌入式實(shí)時(shí)Linux的設(shè)計(jì)與實(shí)現(xiàn)[D]. 成都:電子科技大學(xué),2007.
[4] 陳曾漢. 基于Xenomai的實(shí)時(shí)測(cè)控系統(tǒng)的研究與實(shí)現(xiàn)[J]. 計(jì)算機(jī)應(yīng)用與軟件. 2009,26(5):162-165.
[5] 黃芳. 基于S3C2440和RTAI的實(shí)時(shí)平臺(tái)的設(shè)計(jì)與實(shí)現(xiàn)[J].組合機(jī)床與自動(dòng)化加工技術(shù),2014(2):83-89.
[6] 吳章金. Linux實(shí)時(shí)搶占補(bǔ)丁的研究與實(shí)踐[D].蘭州: 蘭州大學(xué),2010.
[7] 秦邵華. 關(guān)于uc/os-II中優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題[J]. 單片機(jī)與嵌入式系統(tǒng)應(yīng)用,2005(2):71-71.
[8] 余兵. Linux操作系統(tǒng)實(shí)時(shí)性分析[J]. 計(jì)算機(jī)技術(shù)與發(fā)展, 2007,17(9):41-47.
[9] 李江. Linux系統(tǒng)實(shí)時(shí)性測(cè)試及分析[J]. 計(jì)算機(jī)應(yīng)用, 2005,25(7):1679-1681.
(編輯李秀敏)