當(dāng)前位置:首頁(yè) > 嵌入式 > 嵌入式教程
[導(dǎo)讀]改進(jìn)型時(shí)間觸發(fā)嵌入式系統(tǒng)編程模式

摘要:對(duì)于成本敏感的嵌入式系統(tǒng),通常因?yàn)橘Y源有限而難以采用搶先式實(shí)時(shí)多任務(wù)操作系統(tǒng)。傳統(tǒng)的基于超級(jí)循環(huán)的前后臺(tái)編程方法和基于時(shí)間觸發(fā)的合作式多任務(wù)編程方法對(duì)任務(wù)的劃分需要較高的技巧。本文通過(guò)對(duì)基于時(shí)間觸發(fā)合作式調(diào)度器的改進(jìn),建立了一種適用于小型嵌入式系統(tǒng)的通用編程模式,使這類系統(tǒng)的編程變得清晰、簡(jiǎn)單。
關(guān)鍵詞:時(shí)間觸發(fā);合作式調(diào)度器;多任務(wù);嵌入式系統(tǒng);單片機(jī)

引言
    目前,RTOS特別是搶先式RTOS在嵌入式系統(tǒng)中的應(yīng)用越來(lái)越廣泛,但是還有很大一部分產(chǎn)品使用是小型單片機(jī)。這些系統(tǒng)由于成本的限制,通常資源非常有限,比如ROM往往小丁32 KB,RAM小于2 KB,由于RTOS對(duì)每個(gè)任務(wù)都要開(kāi)辟單獨(dú)內(nèi)存區(qū)域,存放任務(wù)的上下文和各任務(wù)獨(dú)立的堆棧,所以在這種系統(tǒng)中使用RTOS非常勉強(qiáng)。對(duì)于這些低成本資源受限系統(tǒng)通常采用“前后臺(tái)”(或者叫“超級(jí)循環(huán)”)結(jié)構(gòu)進(jìn)行編程,這實(shí)際上是一種事件觸發(fā)的編程模式,當(dāng)中斷數(shù)目較多且系統(tǒng)完成的功能相對(duì)復(fù)雜時(shí),就會(huì)使系統(tǒng)的程序編寫(xiě)變得非常復(fù)雜并使系統(tǒng)運(yùn)行的可預(yù)測(cè)性迅速下降。
    針對(duì)這個(gè)問(wèn)題,Michael J.Pont提出了一種“基于時(shí)間觸發(fā)的編程模式”,這種方法有助于降低CPU的負(fù)荷并減少存儲(chǔ)器的使用量,提高系統(tǒng)行為的可預(yù)測(cè)性,并使程序的結(jié)構(gòu)變得簡(jiǎn)潔。但是在實(shí)際使用中,當(dāng)系統(tǒng)中不同的任務(wù)對(duì)時(shí)間要求差異較大時(shí),“基于時(shí)間觸發(fā)的編程模式”難以給出簡(jiǎn)單有效的解決方案。為此,對(duì)“基于時(shí)間觸發(fā)的編程模式”進(jìn)行了改進(jìn),使之適應(yīng)性更強(qiáng),可以為成本和資源受限的小型嵌入式系統(tǒng)提供統(tǒng)一且有效的編程模式。

1 傳統(tǒng)編程結(jié)構(gòu)的局限性
    當(dāng)不使用RTOS時(shí),嵌入式軟件通常采用兩種傳統(tǒng)的編程結(jié)構(gòu)進(jìn)行編程,一種叫“前后臺(tái)廳式”或者叫“超級(jí)循環(huán)結(jié)構(gòu)”,本質(zhì)上是事件觸發(fā)的編程方式;另一種叫時(shí)間觸發(fā)編程模式,Michael J.Pont的“基于時(shí)間觸發(fā)的編程模式”即屬于此。
    在實(shí)際工作中,當(dāng)系統(tǒng)稍微復(fù)雜時(shí),會(huì)發(fā)現(xiàn)這兩種方式都有一定局限性,下面以一個(gè)實(shí)際產(chǎn)品設(shè)計(jì)中遇到的問(wèn)題為例來(lái)說(shuō)明。在設(shè)計(jì)一個(gè)用于配電柜的壁裝式智能配電儀表時(shí),CPU的程序設(shè)計(jì)需完成以下任務(wù):
    ①每半秒對(duì)前顯示屏的顯示數(shù)據(jù)進(jìn)行一次刷新。
    ②每0.1 s對(duì)DI/DO進(jìn)行一次刷新。
    ③每0.2 s對(duì)鍵盤(pán)進(jìn)行一次掃描。
    ④每半秒對(duì)測(cè)量數(shù)據(jù)進(jìn)行一次重新采集和計(jì)算。
    ⑤異步串行口與上位機(jī)使用Modhus通信,速率最高1 9 200 bps。
    ⑥CPU通過(guò)I2C總線與時(shí)鐘芯片和EEPROM通信。
    ⑦CPU通過(guò)SPI總線與LED數(shù)碼管及采集芯片通信。
    ⑧CPU要對(duì)所采集的6路信號(hào)進(jìn)行FFT變換
    ⑨當(dāng)系統(tǒng)掉電時(shí),CPU要能快速響應(yīng),把當(dāng)前的電度底數(shù)寫(xiě)入EEPROM中。
    上述任務(wù)中,任務(wù)⑤和任務(wù)⑨是強(qiáng)實(shí)時(shí)性的,如果對(duì)串口的收發(fā)事件得不到及時(shí)響應(yīng),接收時(shí)會(huì)導(dǎo)致字節(jié)丟失,發(fā)送時(shí)會(huì)導(dǎo)致字節(jié)間時(shí)間間隔太大,造成接收方的Modbus幀定界錯(cuò)誤,對(duì)系統(tǒng)掉電事件如果不能及時(shí)響應(yīng)會(huì)造成EEPROM的寫(xiě)入失敗。其他任務(wù)只要在指定的周期內(nèi)能得到執(zhí)行就行,但是任務(wù)⑧比較特殊,使用通常的8位CPU進(jìn)行6種信號(hào)的FFT變換,哪怕每種信號(hào)只做128點(diǎn)的FFT,運(yùn)算一次也要好幾秒。下面來(lái)看用傳統(tǒng)編程結(jié)構(gòu)實(shí)現(xiàn)上述設(shè)計(jì)時(shí)遇到的困擾。
1.1 使用“前后臺(tái)方式”進(jìn)行編程
    使用“前后臺(tái)方式”進(jìn)行編程時(shí),為保證任務(wù)⑤的及時(shí)性,使用了UART中斷,當(dāng)UART完成一個(gè)字節(jié)的收發(fā)后產(chǎn)生中斷,在中斷程序中將接收到的字符保存在接收緩沖區(qū)或從發(fā)送緩沖區(qū)取下一個(gè)待發(fā)字符裝入U(xiǎn)ART進(jìn)行發(fā)送,對(duì)Modbus協(xié)議的處理可以單獨(dú)用一個(gè)任務(wù)在中斷外處理,這保證了巾斷程序的簡(jiǎn)短。為保證任務(wù)⑨響應(yīng)的及時(shí)性,也必須為它安排一個(gè)中斷。因?yàn)楫?dāng)系統(tǒng)掉電時(shí),系統(tǒng)只有不到10 ms的過(guò)渡時(shí)間,系統(tǒng)如果不能在這個(gè)時(shí)間內(nèi)完成相關(guān)的操作,系統(tǒng)電壓將跌落至有效電壓以下而喪失工作能力。
    安排好了后臺(tái)的中斷任務(wù)后再來(lái)看看前臺(tái)的任務(wù)如何完成。這里遇到的最大的挑戰(zhàn)是對(duì)任務(wù)⑧的處理,因?yàn)槿蝿?wù)⑧需要的執(zhí)行時(shí)間太長(zhǎng)了,簡(jiǎn)單的把它當(dāng)成一個(gè)任務(wù)處理將影響系統(tǒng)對(duì)其他任務(wù)的響應(yīng),在超級(jí)循環(huán)中的代碼結(jié)構(gòu)如下:
    while(1){
          任務(wù)①;
          任務(wù)②;
          ……
         任務(wù)⑧;
    }[!--empirenews.page--]
    由于任務(wù)⑧執(zhí)行一次要幾秒鐘的時(shí)間,整個(gè)超級(jí)循環(huán)執(zhí)行一次至少大于任務(wù)⑧需要的時(shí)間,也就是說(shuō)這個(gè)超級(jí)循環(huán)循環(huán)一次要幾秒鐘時(shí)間,將滿足不了各任務(wù)響應(yīng)時(shí)間的要求。
    要解決這個(gè)問(wèn)題,只有把任務(wù)⑧拆分成很多個(gè)子任務(wù),將每個(gè)子任務(wù)的耗時(shí)壓縮到10 ms左右,并定義好各個(gè)子任務(wù)完成后的狀態(tài),在超級(jí)大循環(huán)中每次根據(jù)狀態(tài)只執(zhí)行一個(gè)子任務(wù),程序結(jié)構(gòu)如下:
    while(1){
          任務(wù)①;
          任務(wù)②;
          ……
          switch(子任務(wù)狀態(tài)){
             case  子任務(wù)狀態(tài)①:
                   子任務(wù)①;
                   break;
             ……
             case  子任務(wù)狀態(tài)②:
                   子任務(wù)②;
                   break;
             ……
             case  子任務(wù)狀態(tài):
                   子任務(wù);
                   break;
           }
    }
    這樣,就需要把一個(gè)耗時(shí)幾秒的FFT運(yùn)算任務(wù)拆分成幾百個(gè)耗時(shí)10 ms左有的子任務(wù),這顯然是不可接受的。除此之外,超級(jí)大循環(huán)結(jié)構(gòu)隱含的一個(gè)缺點(diǎn)就是隨著任務(wù)的增加,循環(huán)體的執(zhí)行時(shí)間是線性增加的,在實(shí)際設(shè)計(jì)中即使沒(méi)有像任務(wù)⑧那樣的高耗時(shí)任務(wù),當(dāng)系統(tǒng)功能增加時(shí)要保證系統(tǒng)響應(yīng)的及時(shí)性也是一個(gè)不小的挑戰(zhàn)。
1.2 使用“時(shí)間觸發(fā)編程模式”進(jìn)行編程
    “時(shí)間觸發(fā)編程模式”的核心是建立一個(gè)基丁時(shí)間觸發(fā)的合作式的任務(wù)調(diào)度器,在系統(tǒng)中盡量減少事件觸發(fā)(減少中斷的使用),系統(tǒng)通過(guò)任務(wù)調(diào)度器完成各任務(wù)的調(diào)度執(zhí)行,下面是“時(shí)間觸發(fā)編程模式”的典型程序結(jié)構(gòu):
[!--empirenews.page--]
    系統(tǒng)中每個(gè)任務(wù)都定義了優(yōu)先級(jí)、任務(wù)循環(huán)周期和任務(wù)延遲時(shí)間,系統(tǒng)定時(shí)器中斷程序SCH Updatc()按設(shè)定的節(jié)拍對(duì)任務(wù)隊(duì)列進(jìn)行刷新,在超級(jí)大循環(huán)中只執(zhí)行任務(wù)調(diào)度器SCH_Dispatch_Tasks(),根據(jù)任務(wù)隊(duì)列的狀念安排任務(wù)的執(zhí)行。
    這種編程結(jié)構(gòu)避免了超級(jí)大循環(huán)結(jié)構(gòu)循環(huán)時(shí)間隨代碼量的增加而線性增加的問(wèn)題,但是由于任務(wù)是不可剝奪的,一旦任務(wù)啟動(dòng)執(zhí)行,任務(wù)調(diào)度器只有在當(dāng)前任務(wù)完成后才有機(jī)會(huì)執(zhí)行,這就要求每個(gè)任務(wù)占用CPU的時(shí)間不能太長(zhǎng),否則將影響整個(gè)系統(tǒng)的響應(yīng)速度。所以,F(xiàn)FT運(yùn)算在這種編程模式下還是必須進(jìn)行有效的拆分,否則就必須提高CPU的檔次或使用可剝奪型的搶先式RTOS,這勢(shì)必造成系統(tǒng)成本的增加。那么有沒(méi)有更好的解決辦法呢?
    下面的編程結(jié)構(gòu)塒“時(shí)間觸發(fā)編程模式”進(jìn)行了改進(jìn),使之在不提高硬件成本的情況下,使編程人員更直觀地定義任務(wù),減少任務(wù)特性對(duì)系統(tǒng)程序結(jié)構(gòu)的沖擊,使程序結(jié)構(gòu)簡(jiǎn)單、明了并提高系統(tǒng)的實(shí)時(shí)響應(yīng)速度。

2 對(duì)“時(shí)間觸發(fā)編程模式”的改進(jìn)
    根據(jù)多年嵌入式系統(tǒng)編程的經(jīng)驗(yàn),通常嵌入系統(tǒng)的任務(wù)可以劃分成3種類型:
    ①及時(shí)型任務(wù)。這類任務(wù)是事件觸發(fā)型的,一旦事件發(fā)生,系統(tǒng)必須在限定的時(shí)間內(nèi)進(jìn)行響應(yīng),對(duì)這類任務(wù),最自然的方法就是使用中斷來(lái)完成,即定義成“前后臺(tái)方式”中的后臺(tái)任務(wù)。
    ②周期型任務(wù)。這類任務(wù)是時(shí)間觸發(fā)式周期型的,系統(tǒng)必須保證在指定的周期內(nèi)執(zhí)行任務(wù),“時(shí)間觸發(fā)編程模式”可以很好地滿足這類任務(wù)的需求。
    ③背景型任務(wù)。這類任務(wù)是非實(shí)時(shí)型的,實(shí)時(shí)性不是非常重要,系統(tǒng)在運(yùn)行過(guò)程中可隨時(shí)中斷這類任務(wù)以便執(zhí)行前兩類任務(wù),系統(tǒng)只要能充分利用資源盡最大可能快速完成這類任務(wù)即可,這類任務(wù)最適合定義成“前后臺(tái)方式”中的前臺(tái)任務(wù)。
     根據(jù)以上任務(wù)分類,對(duì)“時(shí)間觸發(fā)編程模式”的改進(jìn)可概括成以下需求:
    ◆任務(wù)分3類,1類任務(wù)優(yōu)先級(jí)最高,3類任務(wù)優(yōu)先級(jí)最低;
    ◆高優(yōu)先級(jí)的任務(wù)可中斷低優(yōu)先級(jí)任務(wù)的執(zhí)行,同級(jí)的任務(wù)之間不可相互剝奪;
    ◆實(shí)際沒(méi)計(jì)中為提高系統(tǒng)的可預(yù)測(cè)性,應(yīng)盡量減少1類任務(wù)的數(shù)量及1類任務(wù)的執(zhí)行時(shí)間;
    ◆為降低系統(tǒng)資源的占用,系統(tǒng)不給任務(wù)劃分單獨(dú)的堆??臻g。
    以上改進(jìn)的本質(zhì)是設(shè)計(jì)3個(gè)優(yōu)先級(jí)的簡(jiǎn)單的任務(wù)調(diào)度機(jī)制,高優(yōu)先級(jí)的任務(wù)可中斷低優(yōu)先級(jí)的任務(wù),同優(yōu)先級(jí)的任務(wù)之間不能相互剝奪,該調(diào)度機(jī)制不為每個(gè)單獨(dú)的任務(wù)保存任務(wù)上下文和單獨(dú)的堆棧,這樣可以減少該編程模式對(duì)系統(tǒng)資源的需求。
    可剝奪式RTOS中的一個(gè)高優(yōu)先級(jí)任務(wù)中斷一個(gè)低優(yōu)先級(jí)的任務(wù)時(shí),會(huì)保存好低優(yōu)先級(jí)任務(wù)的上下文并把該低優(yōu)先級(jí)任務(wù)的局部變量保存在本任務(wù)單獨(dú)的堆棧中,如果系統(tǒng)不給任務(wù)分配單獨(dú)的堆棧,如何保證高優(yōu)先級(jí)任務(wù)退出后,低優(yōu)先級(jí)任務(wù)執(zhí)行環(huán)境的恢復(fù)呢?
     對(duì)這個(gè)問(wèn)題,可以借鑒中斷的處理機(jī)制用以下辦法予以解決:
    ①在系統(tǒng)中設(shè)計(jì)一個(gè)定時(shí)中斷函數(shù),該函數(shù)的功能就是執(zhí)行周期性任務(wù)的調(diào)度,該定時(shí)中斷在所有中斷中優(yōu)先級(jí)最低。
    ②在系統(tǒng)中設(shè)計(jì)另一個(gè)定時(shí)中斷函數(shù),該函數(shù)的功能是刷新周期型任務(wù)的任務(wù)管理隊(duì)列,為任務(wù)調(diào)度提供支持,本定時(shí)中斷函數(shù)的優(yōu)先級(jí)在系統(tǒng)中次低。
    ③周期型任務(wù)就是一個(gè)函數(shù),該函數(shù)入口的第一個(gè)操作是開(kāi)中斷,允許任務(wù)執(zhí)行期間被中斷以便響應(yīng)及時(shí)型任務(wù)。
    ④背景型任務(wù)就是在主函數(shù)超級(jí)循環(huán)中執(zhí)行的代碼,該代碼可隨時(shí)被及時(shí)型和周期型任務(wù)中斷,當(dāng)系統(tǒng)沒(méi)有及時(shí)型任務(wù)和周期型任務(wù)時(shí)才循環(huán)執(zhí)行背景型任務(wù)的代碼。[!--empirenews.page--]
    通過(guò)以上措施,“改進(jìn)型時(shí)間觸發(fā)編程模式”的程序結(jié)構(gòu)如下:


結(jié)語(yǔ)
    使用“改進(jìn)型時(shí)間觸發(fā)編程模式”進(jìn)行小型嵌入式系統(tǒng)編程,就像使用RTOS進(jìn)行編程一樣,設(shè)計(jì)者規(guī)劃好任務(wù)后,就可以專心于每個(gè)任務(wù)的設(shè)計(jì),任務(wù)對(duì)處理器時(shí)間的占用可以由系統(tǒng)統(tǒng)一管理,減少任務(wù)之間的耦合,使產(chǎn)品的程序設(shè)計(jì)和改動(dòng)都變得簡(jiǎn)潔清楚。使用該編程模式很好地解決了譬裝式智能配電儀表所面臨的復(fù)雜的設(shè)計(jì)問(wèn)題,證明該方法簡(jiǎn)單有效。目前該設(shè)計(jì)模式僅僅設(shè)計(jì)了任務(wù)調(diào)度器,任務(wù)間的變量傳遞還需要使用全局變量,如果能加入信號(hào)量和消息機(jī)制,那么該模式將更加完善。

本站聲明: 本文章由作者或相關(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)系本站刪除。
換一批
延伸閱讀

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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