當(dāng)前位置:首頁 > 消費(fèi)電子 > 消費(fèi)電子
[導(dǎo)讀]Linux以其功能強(qiáng)大、源代碼開放、支持多種硬件平臺、模塊化設(shè)計方案以及豐富的開發(fā)工具支持等特點(diǎn)廣泛應(yīng)用在嵌入式系統(tǒng)領(lǐng)域。作為嵌入式產(chǎn)品的操作系統(tǒng)平臺,具有較好的實(shí)時

Linux以其功能強(qiáng)大、源代碼開放、支持多種硬件平臺、模塊化設(shè)計方案以及豐富的開發(fā)工具支持等特點(diǎn)廣泛應(yīng)用在嵌入式系統(tǒng)領(lǐng)域。作為嵌入式產(chǎn)品的操作系統(tǒng)平臺,具有較好的實(shí)時性、系統(tǒng)可靠性、任務(wù)處理隨機(jī)性是系統(tǒng)追求的目標(biāo),目前商業(yè)嵌入式操作系統(tǒng)實(shí)時性能可以滿足嵌入式領(lǐng)域的需求,但由于其價格昂貴,應(yīng)用受到了限制。而嵌入式Linux以其非常低廉的價格,可以大大地降低成本,逐漸成為嵌入式操作系統(tǒng)的首選。但由于其在實(shí)時應(yīng)用領(lǐng)域的技術(shù)障礙,要應(yīng)用在嵌入式領(lǐng)域,還必須對Linux內(nèi)核作必要的改進(jìn)。本文以S3C2410+Linux作為移動機(jī)器人操作平臺,為了提高機(jī)器人任務(wù)處理的實(shí)時性,針對影響Linux OS實(shí)時性能的若干方面進(jìn)行研究,并利用相應(yīng)的解決方法基于標(biāo)準(zhǔn)Linux2.6內(nèi)核加以實(shí)現(xiàn),最后通過測試,驗(yàn)證了此改進(jìn)方法的效果。

1 Linux內(nèi)核實(shí)時性分析

1.1 Linux內(nèi)核制約實(shí)時性的因素

衡量操作系統(tǒng)實(shí)時性的指標(biāo)主要有中斷延遲和搶占延遲。嵌入式系統(tǒng)中很多實(shí)時任務(wù)是靠中斷驅(qū)動的,中斷事件必須在限定的時限內(nèi)處理,否則將產(chǎn)生災(zāi)難性的后果。大多數(shù)實(shí)時系統(tǒng)都是處理一些周期性的或非周期性的重復(fù)事件,事件產(chǎn)生的頻度就確定了任務(wù)的執(zhí)行時限,因此每次事件發(fā)生時,相應(yīng)的處理任務(wù)必須及時響應(yīng)處理,否則將無法滿足時限 。搶占延遲就反映了系統(tǒng)的響應(yīng)及時程度。針對Linux內(nèi)核,中斷關(guān)閉及中斷優(yōu)先級執(zhí)行機(jī)制、內(nèi)核不可搶占性、自旋鎖(spinlock)及大內(nèi)核鎖及一些O(n)的任務(wù)調(diào)度算法影響了系統(tǒng)的實(shí)時性能。

1.2 現(xiàn)存增強(qiáng)Linux內(nèi)核實(shí)時性的技術(shù)

多年來,Linux實(shí)時性改進(jìn)技術(shù)的發(fā)展主要有兩種技術(shù)方案:(1)直接修改Linux內(nèi)核。針對內(nèi)核數(shù)據(jù)結(jié)構(gòu)、調(diào)度函數(shù)、中斷方式進(jìn)行改動,重新設(shè)計一個由優(yōu)先級驅(qū)動的實(shí)時調(diào)度器,替換原有Linux內(nèi)核中的進(jìn)程調(diào)度器sched.c。這一方案主要是針對中斷機(jī)制、任務(wù)調(diào)度算法進(jìn)行改進(jìn)的,較為成功的案例為Kansas大學(xué)開發(fā)的Kurt-Linux。Kurt提高了Linux系統(tǒng)中的實(shí)時精度,將時鐘芯片設(shè)置為單觸發(fā)狀態(tài)。對于實(shí)時任務(wù)的調(diào)度,Kurt-Linux采用基于時間的靜態(tài)實(shí)時CPU調(diào)度算法。實(shí)時任務(wù)在設(shè)計階段就需要明確地說明其實(shí)時事件要發(fā)生的時間。這種調(diào)度算法對于那些循環(huán)執(zhí)行的任務(wù)能夠取得較好的調(diào)度效果;(2)在Linux內(nèi)核之外進(jìn)行實(shí)時性擴(kuò)展,添加一個實(shí)時內(nèi)核。實(shí)時內(nèi)核接管硬件所有中斷,并依據(jù)是否為實(shí)時任務(wù)給予響應(yīng)。Fsm Labs公司開發(fā)的RTLinux就是依據(jù)這種策略開發(fā)設(shè)計的 。以上論述的兩種技術(shù)方案有其可借鑒之處,但如果綜合考慮任務(wù)響應(yīng)、內(nèi)核可搶占性、實(shí)時調(diào)度策略等都將影響操作系統(tǒng)的實(shí)時性能,因此,這兩種技術(shù)還不能很好地滿足實(shí)時性要求。為了增強(qiáng)嵌入式Linux實(shí)時性能,下面將介紹中斷機(jī)制、內(nèi)核的搶占性以及大內(nèi)核鎖等相關(guān)問題。

2 Linux實(shí)時性改進(jìn)方法

Linux2.4及以前版本內(nèi)核是不可搶占的,在Linux2.6中,內(nèi)核已經(jīng)可以搶占,實(shí)時性有所增強(qiáng)。但是內(nèi)核中仍然有不可搶占的區(qū)域,如自旋鎖spinlock保護(hù)的臨界區(qū)等。另外,影響內(nèi)核實(shí)時性能的因素還有中斷運(yùn)行機(jī)制、大內(nèi)核鎖機(jī)制以及調(diào)度算法等。

2.1 中斷運(yùn)行機(jī)制改進(jìn)

在Linux標(biāo)準(zhǔn)內(nèi)核中,中斷是最高優(yōu)先級的執(zhí)行單元,硬件架構(gòu)決定了硬件中斷到來的時候在該中斷沒有被屏蔽的條件下必須處理。不管內(nèi)核當(dāng)時處理什么,即便是Linux中最高優(yōu)先級的實(shí)時進(jìn)程,只要有中斷發(fā)生,系統(tǒng)將立即響應(yīng)該事件并執(zhí)行相應(yīng)的中斷處理程序,這就大大削弱了Linux的實(shí)時性能。特別是系統(tǒng)有嚴(yán)重的網(wǎng)絡(luò)或I/O負(fù)載時,中斷將非常頻繁,實(shí)時任務(wù)將很難有機(jī)會運(yùn)行,這對于Linux的實(shí)時應(yīng)用來說是不可接受的。Linux采用的關(guān)中斷技術(shù)在關(guān)中斷區(qū)域使相應(yīng)實(shí)時任務(wù)得不到響應(yīng),增加了實(shí)時任務(wù)的中斷延遲。Linux實(shí)時化后自旋鎖變?yōu)榛コ怄i的技術(shù),但由于自旋鎖的中斷處理不能及時響應(yīng),降低了系統(tǒng)的實(shí)時性能。因此,借鑒Ingo Molnar實(shí)時補(bǔ)丁的實(shí)時化方法,采用中斷線程化技術(shù)改進(jìn)中斷運(yùn)行機(jī)制,中斷將作為內(nèi)核線程運(yùn)行而且賦予不同的實(shí)時優(yōu)先級,實(shí)時任務(wù)可以有比中斷線程更高的優(yōu)先級,這樣,實(shí)時任務(wù)就可以作為最高優(yōu)先級的執(zhí)行單元來運(yùn)行了,即使在嚴(yán)重負(fù)載下仍有實(shí)時性保證。另一方面,中斷處理線程也可以因?yàn)樵趦?nèi)核同步中得不到鎖而掛載到鎖的等待隊(duì)列中,很多關(guān)中斷就不必真正的禁止硬件中斷了,而是禁止內(nèi)核進(jìn)程搶占,從而減小了中斷延遲 。

在初始化階段,常規(guī)中斷初始化和中斷線程化的初始化在start_kernel( )函數(shù)中都調(diào)用trap_init( )和init_IRQ( )兩個函數(shù)來初始化irq_desc_t結(jié)構(gòu)體,區(qū)別主要體現(xiàn)在內(nèi)核初始化創(chuàng)建init線程時,中斷線程化的中斷在init( )函數(shù)中還將調(diào)用init_hardirqs(kernel/irq/manage.c)來為每一個IRQ創(chuàng)建一個內(nèi)核線程,最高實(shí)時優(yōu)先級為50,依次類推直到25。因此,任何IRQ線程的最低實(shí)時優(yōu)先級為25,具體實(shí)現(xiàn)是通過kthread_create函數(shù)創(chuàng)建的。功能實(shí)現(xiàn)等同于如下代碼:

void __init init_hardirqs(void)

{ ……

for (i = 0; i 《 NR_IRQS; i++) {

//對于每一個中斷建立一個中斷線程

irq_desc_t *desc = irq_desc + i;

if(desc-》action && !(desc-》status & IRQ_NODELAY))

//有IRQ_NODELAY標(biāo)志的中斷不允許線程化

desc-》thread = kthread_create(do_irqd,

desc, “IRQ %d”, irq); //建立線程

……

}

}

staTIc int do_irqd(void * __desc)

//分配中斷線程優(yōu)先級50~25

{ ……

/*Scale irq thread prioriTIes from prio 50 to prio 25 */

param.sched_priority = curr_irq_prio;

if (param.sched_priority 》 25)

curr_irq_prio = param.sched_priority - 1;

……

}

在中斷處理階段當(dāng)中斷發(fā)生時,CPU調(diào)用do_IRQ( )函數(shù)來處理中斷,do_IRQ( )在做了必要的相關(guān)處理之后調(diào)用_do_IRQ( )。_do_IRQ( )主要功能為判斷該中斷是否已經(jīng)被線程化(核對終端描述符的狀態(tài)字段是否包含IRQ_NODELAY標(biāo)志),對于沒有線程化的中斷,將直接調(diào)用 handle_IRQ_event( )函數(shù)來處理。功能實(shí)現(xiàn)等同于如下代碼:

fastcall notrace unsigned int __do_IRQ(unsigned int irq,

struct pt_regs *regs)

{ ……

if (redirect_hardirq(desc))

//檢測是否為線程化中斷,若是則喚醒中斷線程

goto out_no_end;

……

acTIon_ret = handle_IRQ_event(irq, regs, acTIon);

//處理非線程化中斷

……

}

int redirect_hardirq(struct irq_desc *desc)

//檢測irq_desc結(jié)構(gòu)體,判斷是否線程化

{ ……

if (!hardirq_preemption || (desc-》status & IRQ_

NODELAY) || !desc-》thread)

return 0;

……

if (desc-》thread && desc-》thread-》state != TASK_

RUNNING)

wake_up_process(desc-》thread);

……

}

針對已線程化的情況,調(diào)用wake_up_process( )函數(shù)喚醒中斷處理線程執(zhí)行,內(nèi)核線程將調(diào)用do_hardirq( )來處理相應(yīng)的中斷。具體實(shí)現(xiàn)是通過handle_IRQ_event( )函數(shù)直接調(diào)用相應(yīng)的中斷處理函數(shù)完成的。對于緊急的中斷(如時鐘中斷),內(nèi)核保持原來的中斷處理方式,而不為其創(chuàng)建中斷線程,這樣就保證了緊急中斷的快速響應(yīng)。

2.2 內(nèi)核可搶占性設(shè)計

在Linux標(biāo)準(zhǔn)內(nèi)核中,因不具有可搶占性和導(dǎo)致較大的延遲,增加內(nèi)核的可搶占性能,可提高系統(tǒng)的實(shí)時任務(wù)處理能力。當(dāng)前修改Linux內(nèi)核提高實(shí)時性的方法主要有增加搶占點(diǎn)和改造成搶占式內(nèi)核兩種方法。增加搶占點(diǎn)方法是在內(nèi)核中插入搶占點(diǎn),通過檢測搶占點(diǎn)調(diào)度標(biāo)志來決定是否進(jìn)行實(shí)時任務(wù)的調(diào)度。采用這種方法,在檢測搶占點(diǎn)標(biāo)志時大大增加了系統(tǒng)開銷,因此本方案采用直接改造Linux內(nèi)核的方法,通過修改自旋鎖為互斥鎖來提高內(nèi)核的可搶占性? 。即借鑒Ingo Molnar的實(shí)時補(bǔ)丁的實(shí)時化方法,使用mutex互斥鎖來替換spinlock自旋鎖。使用mutex替換spinlock,可以讓spinlock 可搶占。起初spinlock不可搶占性設(shè)計目的是避免死鎖,可搶占性設(shè)計可能導(dǎo)致競爭者與保持者的死鎖局面。中斷處理函數(shù)中也可以使用 spinlock,如果spinlock已經(jīng)被某一進(jìn)程保持,則中斷處理函數(shù)無法進(jìn)行,從而形成死鎖。中斷線程化以后,中斷線程將掛在等待隊(duì)列上并放棄 CPU讓別的線程或進(jìn)程來運(yùn)行,讓每個spinlock都有一個等待隊(duì)列,該等待隊(duì)列按進(jìn)程或線程優(yōu)先級排隊(duì),如果一個進(jìn)程或線程競爭的spinlock 已經(jīng)被另一個線程保持,它將把自己掛在該spinlock的優(yōu)先級化的等待隊(duì)列上,然后發(fā)生調(diào)度把CPU讓給別的進(jìn)程或線程。mutex替換 spinlock后,spinlock結(jié)構(gòu)定義如下代碼:

typedef struct {

struct rt_mutex lock; //新的實(shí)時互斥鎖

unsigned int break_lock;

} spinlock_t;

其中struct rt_mutex結(jié)構(gòu)如下:

struct rt_mutex {

raw_spinlock_t wait_lock;

struct plist wait_list; //優(yōu)先級等待隊(duì)列

struct task_struct *owner; //擁有該鎖進(jìn)程的信息

int owner_prio;

… …

};

在如上代碼中,類型raw_spinlock_t就是原來的spinlock_t。即代碼中的spinlock_t就是新設(shè)計的自旋鎖。rt_mutex 結(jié)構(gòu)中,wait_list字段為優(yōu)先級等待隊(duì)列。在mutex使用中,當(dāng)遇到鎖住的臨界資源時,任務(wù)被掛起到wait_list中,臨界資源解鎖時等待任務(wù)被激活。臨界資源被保護(hù)的同時可以搶占。

由于Linux內(nèi)核底層的臨界資源是不可搶占的,使用mutex替換spinlock的過程中,這部分可以保留,仍由不可搶占的spinlock保護(hù),如:保護(hù)硬件寄存器的鎖、調(diào)度器的運(yùn)行隊(duì)列鎖等。不可搶占的spinlock被重新命名為raw_spinlock_t。spin_lock被宏定義為:

#define spin_lock(lock) PICK_OP(raw_spinlock_t,spin,_lock,lock)

函數(shù)PICK_OP支持兩種鎖共存機(jī)制,PICK_OP在編譯階段將鎖操作轉(zhuǎn)化為mutex或者spinlock:

#define PICK_OP(type, optype, op, lock)

do {

if (TYPE_EQUAL((lock), type))

_raw_##optype##op((type *)(lock));

else if (TYPE_EQUAL(lock, spinlock_t))

//調(diào)用gcc的內(nèi)嵌函數(shù)__builtin_types_compatible_p()

_spin##op((spinlock_t *)(lock));

else __bad_spinlock_type();

} while (0)

#define TYPE_EQUAL(lock, type)

__builtin_types_compatible_p(typeof(lock), type *)

gcc的內(nèi)嵌函數(shù)__builtin_types_compatible_p用于判斷一個變量的類型是否為某指定的類型,如果類型為 spinlock_t,將運(yùn)行函數(shù)_spin_lock;類型為raw_spinlock_t,將運(yùn)行函數(shù)_raw_spin_lock。

實(shí)時rt_mutex在具體應(yīng)用中,一個高優(yōu)先級任務(wù)搶占該鎖的同時,把先前的鎖擁有者添加到互斥鎖等待隊(duì)列中,并在當(dāng)前擁有該鎖的任務(wù) task_struct中標(biāo)記等待該鎖的所有任務(wù);反之,不能得到該鎖就把當(dāng)前任務(wù)添加到鎖的優(yōu)先級等待隊(duì)列中,直到喚醒執(zhí)行。為了防止優(yōu)先級逆轉(zhuǎn),可以改變鎖的當(dāng)前擁有者的優(yōu)先級為鎖的等待隊(duì)列中任務(wù)的最高優(yōu)先級。

rt_mutex可以使高優(yōu)先級任務(wù)利用搶占鎖進(jìn)入臨界區(qū),這樣內(nèi)核不可搶占區(qū)的數(shù)量和范圍大大縮小,內(nèi)核可搶占性有了很大的提高,且降低了實(shí)時高優(yōu)先級任務(wù)的搶占延遲,改善了系統(tǒng)的實(shí)時性能。

2.3 可搶占大內(nèi)核鎖設(shè)計

大內(nèi)核鎖BKL(Big Kernel Lock)實(shí)質(zhì)上也是spinlock,它用于保護(hù)整個內(nèi)核,該鎖保持時間較長,對系統(tǒng)的實(shí)時性能影響很大 。采用Ingo Molnar的實(shí)時化方法,BKL使用semaphore實(shí)現(xiàn),結(jié)構(gòu)定義如下代碼:

struct semaphore {

atomic_t count;

struct rt_mutex lock; //實(shí)時互斥鎖的使用

};

由結(jié)構(gòu)體發(fā)現(xiàn),在BKL實(shí)現(xiàn)中利用了實(shí)時互斥鎖rt_mutex,在改進(jìn)后的spinlock結(jié)構(gòu)體spinlock_t中也利用了實(shí)時互斥鎖 rt_mutex,因此可搶占大內(nèi)核鎖和新的spinlock共用了低層的處理代碼。使用semaphore之后,大內(nèi)核鎖就可搶占了。

3 內(nèi)核實(shí)時性測試

針對Linux2.6內(nèi)核,本文并沒有作出對內(nèi)核調(diào)度算法的修正,只是探討了中斷運(yùn)行機(jī)制、自旋鎖及大內(nèi)核鎖技術(shù)在系統(tǒng)實(shí)時性能上的局限性,所以實(shí)驗(yàn)測試主要測試中斷延遲時間和任務(wù)響應(yīng)時間。實(shí)驗(yàn)環(huán)境: Intel 2 GHz CPU,256 DDR內(nèi)存,Kernel 2.6.22版本。測試結(jié)果。

由表可知,在中斷服務(wù)程序中寫入標(biāo)記,測試中斷觸發(fā)至中斷服務(wù)程序執(zhí)行平均響應(yīng)時間,標(biāo)準(zhǔn)Linux2.6內(nèi)核平均中斷響應(yīng)時間為182 μs,改進(jìn)后Linux2.6內(nèi)核為14 μs。采用開源軟件LMbench3.0 測試系統(tǒng)任務(wù)調(diào)度延遲時間,標(biāo)準(zhǔn)Linux2.6內(nèi)核平均任務(wù)響應(yīng)時間為1 260 μs,改進(jìn)后Linux2.6內(nèi)核為162μs。由此可見,改進(jìn)策略在一定程度上大大減小了中斷延遲和任務(wù)調(diào)度時間,有利于改善移動機(jī)器人任務(wù)處理的實(shí)時性能。

本文基于Linux2.6內(nèi)核的關(guān)中斷、中斷優(yōu)先級、內(nèi)核的不可搶占性以及大內(nèi)核鎖保持時間過長等問題進(jìn)行了實(shí)時性分析,提出了相應(yīng)的改進(jìn)方法。利用中斷線程化、互斥鎖的應(yīng)用及大內(nèi)核鎖的改進(jìn)等技術(shù)提高了系統(tǒng)的實(shí)時性能,降低了內(nèi)核中斷延遲和調(diào)度延遲。改進(jìn)后的內(nèi)核在移動機(jī)器人控制器平臺中有很好的應(yīng)用價值,提高了機(jī)器人控制的實(shí)時性能。

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫?dú)角獸公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認(rèn)證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運(yùn)行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機(jī) 衛(wèi)星通信

要點(diǎn): 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實(shí)提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅(jiān)持高質(zhì)量發(fā)展策略,塑強(qiáng)核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運(yùn)營商 數(shù)字經(jīng)濟(jì)

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團(tuán))股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉