www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式教程
[導(dǎo)讀]嵌入式Linux實(shí)時(shí)技術(shù)改進(jìn)與實(shí)現(xiàn)

1、簡(jiǎn)介

隨著微處理器技術(shù)的發(fā)展,嵌入式系統(tǒng)已經(jīng)成為計(jì)算機(jī)應(yīng)用領(lǐng)域的一個(gè)重要的組成部分。Linux雖然為分時(shí)操作系統(tǒng),但由于其功能強(qiáng)大、源代碼開放以及可移植性強(qiáng)等優(yōu)勢(shì),已成為日益流行的嵌入式實(shí)時(shí)操作系統(tǒng)的解決方案,然而,在實(shí)時(shí)方面它還不能很好地滿足實(shí)時(shí)系統(tǒng)方面的需要,其本身僅僅提供了一些實(shí)時(shí)處理的支持。為使Linux滿足實(shí)時(shí)應(yīng)用的要求,常用的方法是通過對(duì)Linux的內(nèi)核進(jìn)行裁減和修改,使其能夠滿足實(shí)時(shí)性的要求。目前,我們根據(jù)實(shí)際需要對(duì)于Linux采用以下方法進(jìn)行改進(jìn)。

2、實(shí)現(xiàn)低延遲

使用兩種方法來(lái)實(shí)現(xiàn)低延遲:一種就是鎖分解,即把大循環(huán)中保持的鎖分解為每一輪循環(huán)中都獲得鎖和釋放鎖,典型的代碼結(jié)構(gòu)示例如下:

鎖分解前:

spin_lock(&x_lock);

for (…) {some operations;

…}

spin_unlock(&x_lock);

鎖分解后:

for (…) {  spin_lock(&x_lock);

some operations;

spin_unlock(&x_lock);}

另一種是增加搶占點(diǎn),即自愿被搶占。增加搶占點(diǎn)之后:

/* Do the write .. */

for (;;) {

size_t size = count;

if (size > chunk)

size = chunk;

ret = -EFAULT;

if (copy_from_user(tty->write_buf, buf, size))

break;

lock_kernel();

ret = write(tty, file, tty->write_buf, size);

unlock_kernel();

if (ret <= 0)

break;

written += ret;

buf += ret;

count -= ret;

if (!count)

break;

ret = -ERESTARTSYS;

if (signal_pending(current))

break;

cond_resched();

}

語(yǔ)句cond_resched()將判斷是否有進(jìn)程需要搶占當(dāng)前進(jìn)程,如果是將立即發(fā)生調(diào)度,這就是增加的搶占點(diǎn),它支持四種搶占模式:[!--empirenews.page--]

(1).No Forced Preemption (Server),這種模式等同于沒有使能搶占選項(xiàng)的標(biāo)準(zhǔn)內(nèi)核,主要適用于科學(xué)計(jì)算等服務(wù)器環(huán)境。

(2).Voluntary Kernel Preemption (Desktop),這種模式使能了自愿搶占,但仍然失效搶占內(nèi)核選項(xiàng),它通過增加搶占點(diǎn)縮減了搶占延遲,因此適用于一些需要較好的響應(yīng)性的環(huán)境,如桌面環(huán)境,當(dāng)然這種好的響應(yīng)性是以犧牲一些吞吐率為代價(jià)的。

(3).Preemptible Kernel (Low-Latency Desktop),這種模式既包含了自愿搶占,又使能了可搶占內(nèi)核選項(xiàng),因此有很好的響應(yīng)延遲,實(shí)際上在一定程度上已經(jīng)達(dá)到了軟實(shí)時(shí)性。它主要適用于桌面和一些嵌入式系統(tǒng),但是吞吐率比模式2更低。

(4).Complete Preemption (Real-Time),這種模式使能了所有實(shí)時(shí)功能,因此完全能夠滿足軟實(shí)時(shí)需求,它適用于延遲要求為100微秒或稍低的實(shí)時(shí)系統(tǒng)。

實(shí)現(xiàn)實(shí)時(shí)是以犧牲系統(tǒng)的吞吐率為代價(jià)的,因此實(shí)時(shí)性越好,系統(tǒng)吞吐率就越低。

3、中斷線程

中斷線程化是實(shí)現(xiàn)Linux實(shí)時(shí)性的一個(gè)重要步驟,在Linux標(biāo)準(zhǔn)內(nèi)核中,中斷是最高優(yōu)先級(jí)的執(zhí)行單元,不管內(nèi)核當(dāng)時(shí)處理什么,只要有中斷事件,系統(tǒng)將立即響應(yīng)該事件并執(zhí)行相應(yīng)的中斷處理代碼,除非當(dāng)時(shí)中斷關(guān)閉。因此,如果系統(tǒng)有嚴(yán)重的網(wǎng)絡(luò)或I/O負(fù)載,中斷將非常頻繁,后發(fā)生的實(shí)時(shí)任務(wù)將很難有機(jī)會(huì)運(yùn)行,也就是說,毫無(wú)實(shí)時(shí)性可言。中斷線程化之后,中斷將作為內(nèi)核線程運(yùn)行而且賦予不同的實(shí)時(shí)優(yōu)先級(jí),實(shí)時(shí)任務(wù)可以有比中斷線程更高的優(yōu)先級(jí),這樣,實(shí)時(shí)任務(wù)就可以作為最高優(yōu)先級(jí)的執(zhí)行單元來(lái)運(yùn)行,即使在嚴(yán)重負(fù)載下仍有實(shí)時(shí)性保證。

中斷線程化的另一個(gè)重要原因是spinlock被mutex取代。中斷處理代碼中大量地使用了spinlock,當(dāng)spinlock被mutex取代之后,中斷處理代碼就有可能因?yàn)榈貌坏芥i而需要被掛到等待隊(duì)列上,但是只有可調(diào)度的進(jìn)程才可以這么做,如果中斷處理代碼仍然使用原來(lái)的spinlock,則spinlock取代mutex的努力將大打折扣,因此為了滿足這一要求,中斷必須被線程化,包括IRQ和softirq。

中斷線程化的實(shí)現(xiàn)方法是:對(duì)于IRQ,在內(nèi)核初始化階段init(該函數(shù)在內(nèi)核源碼樹的文件init/main.c中定義)調(diào)用init_hardirqs(該函數(shù)在內(nèi)核源碼樹的文件kernel/irq/manage.c中定義)來(lái)為每一個(gè)IRQ創(chuàng)建一個(gè)內(nèi)核線程,IRQ號(hào)為0的中斷賦予實(shí)時(shí)優(yōu)先級(jí)49,IRQ號(hào)為1的賦予實(shí)時(shí)優(yōu)先級(jí)48,依次類推直到25,因此任何IRQ線程的最低實(shí)時(shí)優(yōu)先級(jí)為25。原來(lái)的do_IRQ被分解成兩部分,架構(gòu)相關(guān)的放在類似于arch/*/kernel/irq.c的文件中,名稱仍然為do_IRQ,而架構(gòu)獨(dú)立的部分被放在IRQ子系統(tǒng)的位置kernel/irq/handle.c中,名稱為_do_IRQ。當(dāng)發(fā)生中斷時(shí),CPU將執(zhí)行do_IRQ來(lái)處理相應(yīng)的中斷,do_IRQ將做了必要的架構(gòu)相關(guān)的處理后調(diào)用_do_IRQ。函數(shù)_do_IRQ將判斷該中斷是否已經(jīng)被線程化(如果中斷描述符的狀態(tài)字段不包含SA_NODELAY標(biāo)志說明中斷被線程化了),如果是將喚醒相應(yīng)的處理線程,否則將直接調(diào)用handle_IRQ_event(在IRQ子系統(tǒng)位置的kernel/irq/handle.c文件中)來(lái)處理。對(duì)于已經(jīng)線程化的情況,中斷處理線程被喚醒并開始運(yùn)行后,將調(diào)用do_hardirq(在源碼樹的IRQ子系統(tǒng)位置的文件kernel/irq/manage.c中定義)來(lái)處理相應(yīng)的中斷,該函數(shù)將判斷是否有中斷需要被處理(中斷描述符的狀態(tài)標(biāo)志IRQ_INPROGRESS),如果有就調(diào)用handle_IRQ_event來(lái)處理。handle_IRQ_event將直接調(diào)用相應(yīng)的中斷處理句柄來(lái)完成中斷處理。

如果某個(gè)中斷需要被實(shí)時(shí)處理,它可以用SA_NODELAY標(biāo)志來(lái)聲明自己非線程化,例如:系統(tǒng)的時(shí)鐘中斷就是,因?yàn)樗挥脕?lái)維護(hù)系統(tǒng)時(shí)間以及定時(shí)器等,所以不應(yīng)當(dāng)被線程化。

static struct irqaction irq0=

{ timer_interrupt, SA_INTERRUPT | SA_NODELAY, CPU_MASK_NONE, "timer", NULL, NULL};

這是在靜態(tài)聲明時(shí)指定不要線程化,也可以在調(diào)用request_irq時(shí)指定,如:

request_irq (HIGHWIRE_SMI_IRQ,highwire_smi_interrupt,SA_NODELAY, "System Management Switch", NULL))

對(duì)于softirq,標(biāo)準(zhǔn)Linux內(nèi)核已經(jīng)使用內(nèi)核線程的方式來(lái)處理,為了使其易于被搶占,改進(jìn)實(shí)時(shí)性,具體的修改包括:把ksoftirqd的優(yōu)先級(jí)設(shè)置為nice值為-10,即它的優(yōu)先級(jí)高于普通的用戶態(tài)進(jìn)程和內(nèi)核態(tài)線程,但它不是實(shí)時(shí)線程,因此這樣一來(lái)softirq對(duì)實(shí)時(shí)性的影響將顯著減小。在處理軟中斷期間,搶占是使能的,這使得實(shí)時(shí)性更進(jìn)一步地增強(qiáng)。在處理軟中斷的函數(shù)_do_softirq中,每次處理完一個(gè)待處理的軟中斷后,都將調(diào)用cond_resched_all(),這顯著地增加了調(diào)度點(diǎn)數(shù),提高了整個(gè)系統(tǒng)的實(shí)時(shí)性。[!--empirenews.page--]

4、spinlock轉(zhuǎn)換成mutex

spinlock是一個(gè)高效的共享資源同步機(jī)制,在SMP(對(duì)稱多處理器Symmetric Multiple Proocessors)的情況下,它用于保護(hù)共享資源,如全局的數(shù)據(jù)結(jié)構(gòu)或一個(gè)只能獨(dú)占的硬件資源。但是spinlock保持期間將使搶占失效,用spinlock保護(hù)的區(qū)域稱為臨界區(qū)(Critical Section),在內(nèi)核中大量地使用了spinlock,有大量的臨界區(qū)存在,因此它們將嚴(yán)重地影響著系統(tǒng)的實(shí)時(shí)性。為此使用mutex來(lái)替換spinlock,它的意圖是讓spinlock可搶占,但是可搶占后將產(chǎn)生很多后續(xù)影響。

Spinlock失效搶占的目的是避免死鎖。Spinlock如果可搶占了,一個(gè)spinlock的競(jìng)爭(zhēng)者將可能搶占該spinlock的保持者來(lái)運(yùn)行,但是由于得不到spinlock將自旋在那里,如果競(jìng)爭(zhēng)者的優(yōu)先級(jí)高于保持者的優(yōu)先級(jí),將形成一種死鎖的局面,因?yàn)楸3终邿o(wú)法得到運(yùn)行而永遠(yuǎn)不能釋放spinlock,而競(jìng)爭(zhēng)者由于不能得到一個(gè)不可能釋放的spinlock而永遠(yuǎn)自旋在那里。

由于中斷處理函數(shù)也可以使用spinlock,如果它使用的spinlock已經(jīng)被一個(gè)進(jìn)程保持,中斷處理函數(shù)將無(wú)法繼續(xù)進(jìn)行,從而形成死鎖,這樣的spinlock在使用時(shí)應(yīng)當(dāng)中斷失效來(lái)避免這種死鎖的情況發(fā)生。標(biāo)準(zhǔn)linux內(nèi)核就是這么做的,中斷線程化之后,中斷失效就沒有必要,因?yàn)橛龅竭@種狀況后,中斷線程將掛在等待隊(duì)列上并放棄CPU讓別的線程或進(jìn)程來(lái)運(yùn)行。

等待隊(duì)列就是解決這種死鎖僵局的方法,讓每個(gè)spinlock都有一個(gè)等待隊(duì)列,該等待隊(duì)列是按進(jìn)程或線程的優(yōu)先級(jí)排隊(duì)的。如果一個(gè)進(jìn)程或線程競(jìng)爭(zhēng)的spinlock已經(jīng)被另一個(gè)線程保持,它將把自己掛在該spinlock的優(yōu)先級(jí)化的等待隊(duì)列上,然后發(fā)生調(diào)度把CPU讓給別的進(jìn)程或線程。

5、優(yōu)先級(jí)繼承和死鎖檢測(cè)

spinlock被mutex化后會(huì)產(chǎn)生優(yōu)先級(jí)逆轉(zhuǎn)(Priority Inversion)現(xiàn)象。所謂優(yōu)先級(jí)逆轉(zhuǎn),就是優(yōu)先級(jí)高的進(jìn)程由于優(yōu)先級(jí)低的進(jìn)程保持了競(jìng)爭(zhēng)資源被迫等待,而讓中間優(yōu)先級(jí)的進(jìn)程運(yùn)行,優(yōu)先級(jí)逆轉(zhuǎn)將導(dǎo)致高優(yōu)先級(jí)進(jìn)程的搶占延遲增大,中間優(yōu)先級(jí)的進(jìn)程的執(zhí)行時(shí)間的不確定性導(dǎo)致了高優(yōu)先級(jí)進(jìn)程搶占延遲的不確定性,因此為了保證實(shí)時(shí)性,必須消除優(yōu)先級(jí)逆轉(zhuǎn)現(xiàn)象。

優(yōu)先級(jí)繼承協(xié)議(Priority Inheritance Protocol)和優(yōu)先級(jí)頂棚協(xié)議(Priority Ceiling Protocol)就是專門針對(duì)優(yōu)先級(jí)逆轉(zhuǎn)問題提出的解決辦法。

所謂優(yōu)先級(jí)繼承,就是spinlock的保持者將繼承高優(yōu)先級(jí)的競(jìng)爭(zhēng)者進(jìn)程的優(yōu)先級(jí),從而能先于中間優(yōu)先級(jí)進(jìn)程運(yùn)行,盡可能快地釋放鎖,這樣高優(yōu)先級(jí)進(jìn)程就能很快得到競(jìng)爭(zhēng)的spinlock,使得搶占延遲更確定,更短。

所謂優(yōu)先級(jí)頂棚,就是根據(jù)靜態(tài)分析確定一個(gè)spinlock的可能擁有者的最高優(yōu)先級(jí),然后把spinlock的優(yōu)先級(jí)頂棚設(shè)置為該確定的值,每次當(dāng)進(jìn)程獲得該spinlock后,就將該進(jìn)程的優(yōu)先級(jí)設(shè)置為spinlock的優(yōu)先級(jí)頂棚值。

Spinlock被mutex化后引入的另一個(gè)問題就是死鎖,典型的死鎖有兩種:

一種為自鎖,即一個(gè)spinlock保持者試圖獲得它已經(jīng)保持的鎖,很顯然,這會(huì)導(dǎo)致該進(jìn)程無(wú)法運(yùn)行而死鎖。另一種為非順序鎖而導(dǎo)致的,即進(jìn)程P1已經(jīng)保持了spinlock LOCKA但是要獲得進(jìn)程P2已經(jīng)保持的spinlock LOCKB,而進(jìn)程P2要獲得進(jìn)程P1已經(jīng)保持的spinlock LOCKA,這樣進(jìn)程P1和P2都將因?yàn)樾枰玫綄?duì)方擁有的但永遠(yuǎn)不可能釋放的spinlock而死鎖。對(duì)這兩種情況都要進(jìn)行檢測(cè),一旦發(fā)生這種死鎖,內(nèi)核將輸出死鎖執(zhí)行路徑并panic。

6、大內(nèi)核鎖可搶占

大內(nèi)核鎖(BKL---Big Kernel Lock)實(shí)質(zhì)上也是spinlock,只是它一般用于保護(hù)整個(gè)內(nèi)核,該鎖的保持時(shí)間比較長(zhǎng),因此它對(duì)整個(gè)系統(tǒng)的實(shí)時(shí)性影響是非常大的,大內(nèi)核鎖使用了semaphore來(lái)實(shí)現(xiàn),如果內(nèi)核配置為前面三種搶占模式,struct semaphore是架構(gòu)相關(guān)的,如對(duì)于x86,結(jié)構(gòu)定義如下:

struct semaphore {

atomic_t count;

int sleepers;

wait_queue_head_t wait;

};

但對(duì)于第四種搶占模式,其結(jié)構(gòu)為:

struct semaphore {

atomic_t count;

struct rt_mutex lock;

};

注意新的spinlock定義也包含字段struct rt_mutex lock,因此可搶占大內(nèi)核鎖和新的spinlock共用了低層的處理代碼。使用semaphore之后,大內(nèi)核鎖就可搶占了。

7、結(jié)論

Linux實(shí)時(shí)性能的逐步完善,必將大大促進(jìn)嵌入式Linux在工業(yè)控制、后PC時(shí)代信息電器等領(lǐng)域的廣泛應(yīng)用,應(yīng)用的需要也會(huì)進(jìn)一步促進(jìn)大量新型實(shí)時(shí)算法的出現(xiàn)。通過對(duì)Linux的改動(dòng),就可以開發(fā)出一種可靠的且廉價(jià)的硬實(shí)時(shí)操作系統(tǒng),具有很好的發(fā)展和應(yīng)用前景。本文作者的創(chuàng)新點(diǎn):通過改進(jìn)延遲,優(yōu)先級(jí)繼承并增加搶占機(jī)制,改善了系統(tǒng)的實(shí)時(shí)性,為嵌入式系統(tǒng)開發(fā)打下了基礎(chǔ)。

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

(全球TMT2022年10月17日訊)日前,德勤中國(guó)旗下德勤管理咨詢中國(guó)數(shù)據(jù)科學(xué)卓越中心所出品的"機(jī)器學(xué)習(xí)推薦算法"論文被第十三屆IEEE 知識(shí)圖譜國(guó)際會(huì)議(簡(jiǎn)稱"ICKG")收錄。ICKG是知識(shí)圖譜研究領(lǐng)域的國(guó)際權(quán)威...

關(guān)鍵字: 機(jī)器學(xué)習(xí) IC CK MULTI

上海2022年10月17日 /美通社/ -- 日前,德勤中國(guó)迎來(lái)喜訊:旗下德勤管理咨詢中國(guó)數(shù)據(jù)科學(xué)卓越中心所出品的"機(jī)器學(xué)習(xí)推薦算法"論文被第十三屆IEEE 知識(shí)圖譜國(guó)際會(huì)議(以下簡(jiǎn)稱"IC...

關(guān)鍵字: 機(jī)器學(xué)習(xí) IC CK FM

上海2022年10月11日 /美通社/ -- 全球領(lǐng)先金融科技公司Airwallex空中云匯今日宣布完成1億美元E2輪融資?,F(xiàn)有投資方Square Peg、Salesforce Ventures、紅杉中國(guó)、Lone Pi...

關(guān)鍵字: AIR CK AC API

當(dāng)使用導(dǎo)線連接外部設(shè)備或芯片時(shí),導(dǎo)線不可過長(zhǎng),一般控制在 20CM 以內(nèi),IIC、SPI、UART 等數(shù)字接口數(shù)據(jù)線驅(qū)動(dòng)能力有限,過長(zhǎng)的導(dǎo)線會(huì)導(dǎo)致通訊波形遲緩。當(dāng)導(dǎo)線確實(shí)無(wú)法縮短時(shí),可通過降低通訊速率的方法來(lái)解決、緩解通...

關(guān)鍵字: 可編程USB UART I2C SMBusS SPI

據(jù)天眼查APP信息,9月27日,江蘇和府餐飲管理有限公司(和府撈面運(yùn)營(yíng)主體)新增一條商標(biāo)注冊(cè)信息,該商標(biāo)為“HF PICK ME咖啡便利店”。此前,該公司就曾申請(qǐng)注冊(cè)過多個(gè)“和府一杯咖啡”和“和府一杯拉面”商標(biāo)。(知消)...

關(guān)鍵字: APP PIC CK

默沙東(MSD)和國(guó)藥集團(tuán)聯(lián)合宣布,雙方簽署合作框架協(xié)議,默沙東將其和Ridgeback公司合作研發(fā)的抗新冠病毒口服藥物莫諾拉韋的經(jīng)銷權(quán)和獨(dú)家進(jìn)口權(quán)授予國(guó)藥集團(tuán),同時(shí)雙方將評(píng)估技術(shù)轉(zhuǎn)讓的可行性,以便該藥物在中國(guó)境內(nèi)生產(chǎn)、...

關(guān)鍵字: SD GE CK AC

法拉第未來(lái)大股東FF Top Holding LLC 與公司達(dá)成公司治理重組協(xié)議,包括執(zhí)行董事長(zhǎng)Sue Swenson和董事Brian Krolicki在達(dá)成一定條件下的辭職。FF Top將會(huì)不晚于2022年9月27日偏...

關(guān)鍵字: 法拉第未來(lái) TOP IC CK

(全球TMT2022年9月20日訊)全球性電子競(jìng)技俱樂部Gen.G與國(guó)際運(yùn)動(dòng)品牌PUMA宣布雙方將全球合作伙伴關(guān)系延長(zhǎng)至數(shù)年。2020年6月開啟合作的Gen.G與PUMA將以本次續(xù)約作為墊腳石,持續(xù)進(jìn)行融合游戲、電競(jìng)文...

關(guān)鍵字: GEN 電子競(jìng)技 MT CK

紀(jì)念全球合作伙伴關(guān)系的延長(zhǎng),推出新的休閑生活系列 通過多樣的合作活動(dòng),擴(kuò)大電競(jìng)文化影響力,提高雙方品牌價(jià)值 上海 2022年9月20日 /美通社/ -- 全球性電子競(jìng)技俱樂部Gen.G...

關(guān)鍵字: GEN 電子競(jìng)技 CK BSP

芯片選擇下拉框內(nèi)列出的每一個(gè)備選芯片的驅(qū)動(dòng)文件和數(shù)據(jù)手冊(cè)位于S2STool 工具文件夾中的chips 文件夾內(nèi),每一個(gè)芯片需要 1 個(gè)驅(qū)動(dòng)文件和 1 個(gè)數(shù)據(jù)手冊(cè)文件,用戶可自行打開編輯,或者創(chuàng)建新的芯片驅(qū)動(dòng)文件。

關(guān)鍵字: 可編程USB UART I2C SMBusS SPI

嵌入式教程

6897 篇文章

關(guān)注

發(fā)布文章

編輯精選

技術(shù)子站

關(guān)閉