電子產(chǎn)業(yè)一站式賦能平臺

PCB聯(lián)盟網(wǎng)

搜索
查看: 1588|回復(fù): 0
收起左側(cè)

嵌入式應(yīng)用開發(fā)培訓(xùn)_改進(jìn)型時間觸發(fā)嵌入式系統(tǒng)編程模式

[復(fù)制鏈接]

2607

主題

2607

帖子

7472

積分

高級會員

Rank: 5Rank: 5

積分
7472
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2020-7-25 21:33:41 | 只看該作者 回帖獎勵 |正序瀏覽 |閱讀模式
嵌入式應(yīng)用開發(fā)培訓(xùn)_改進(jìn)型時間觸發(fā)嵌入式系統(tǒng)編程模式,   

  引言

  目前,RTOS特別是搶先式RTOS在嵌入式系統(tǒng)中的應(yīng)用越來越廣泛,但是還有很大一部分產(chǎn)品使用是小型單片機(jī)。這些系統(tǒng)由于成本的限制,通常資源非常有限,比如ROM往往小丁32 KB,RAM小于2 KB,由于RTOS對每個任務(wù)都要開辟單獨內(nèi)存區(qū)域,存放任務(wù)的上下文和各任務(wù)獨立的堆棧,所以在這種系統(tǒng)中使用RTOS非常勉強(qiáng)。對于這些低成本資源受限系統(tǒng)通常采用“前后臺”(或者叫“超級循環(huán)”)結(jié)構(gòu)進(jìn)行編程,這實際上是一種事件觸發(fā)的編程模式,當(dāng)中斷數(shù)目較多且系統(tǒng)完成的功能相對復(fù)雜時,就會使系統(tǒng)的程序編寫變得非常復(fù)雜并使系統(tǒng)運行的可預(yù)測性迅速下降。

  針對這個問題,Michael J.Pont提出了一種“基于時間觸發(fā)的編程模式”,這種方法有助于降低CPU的負(fù)荷并減少存儲器的使用量,提高系統(tǒng)行為的可預(yù)測性,并使程序的結(jié)構(gòu)變得簡潔。但是在實際使用中,當(dāng)系統(tǒng)中不同的任務(wù)對時間要求差異較大時,“基于時間觸發(fā)的編程模式”難以給出簡單有效的解決方案。為此,對“基于時間觸發(fā)的編程模式”進(jìn)行了改進(jìn),使之適應(yīng)性更強(qiáng),可以為成本和資源受限的小型嵌入式系統(tǒng)提供統(tǒng)一且有效的編程模式。

  1 傳統(tǒng)編程結(jié)構(gòu)的局限性

  當(dāng)不使用RTOS時,嵌入式軟件通常采用兩種傳統(tǒng)的編程結(jié)構(gòu)進(jìn)行編程,一種叫“前后臺廳式”或者叫“超級循環(huán)結(jié)構(gòu)”,本質(zhì)上是事件觸發(fā)的編程方式;另一種叫時間觸發(fā)編程模式,Michael J.Pont的“基于時間觸發(fā)的編程模式”即屬于此。

  在實際工作中,當(dāng)系統(tǒng)稍微復(fù)雜時,會發(fā)現(xiàn)這兩種方式都有一定局限性,下面以一個實際產(chǎn)品設(shè)計中遇到的問題為例來說明。在設(shè)計一個用于配電柜的壁裝式智能配電儀表時,CPU的程序設(shè)計需完成以下任務(wù):

 、倜堪朊雽η帮@示屏的顯示數(shù)據(jù)進(jìn)行一次刷新。

 、诿0.1 s對DI/DO進(jìn)行一次刷新。

  ③每0.2 s對鍵盤進(jìn)行一次掃描。

 、苊堪朊雽y量數(shù)據(jù)進(jìn)行一次重新采集和計算。

 、莓惒酱锌谂c上位機(jī)使用Modhus通信,速率最高1 9 200 bps。

 、轈PU通過I2C總線與時鐘芯片和EEPROM通信。

 、逤PU通過SPI總線與LED數(shù)碼管及采集芯片通信。

 、郈PU要對所采集的6路信號進(jìn)行FFT變換。

 、岙(dāng)系統(tǒng)掉電時,CPU要能快速響應(yīng),把當(dāng)前的電度底數(shù)寫入EEPROM中。

  上述任務(wù)中,任務(wù)⑤和任務(wù)⑨是強(qiáng)實時性的,如果對串口的收發(fā)事件得不到及時響應(yīng),接收時會導(dǎo)致字節(jié)丟失,發(fā)送時會導(dǎo)致字節(jié)間時間間隔太大,造成接收方的Modbus幀定界錯誤,對系統(tǒng)掉電事件如果不能及時響應(yīng)會造成EEPROM的寫入失敗。其他任務(wù)只要在指定的周期內(nèi)能得到執(zhí)行就行,但是任務(wù)⑧比較特殊,使用通常的8位CPU進(jìn)行6種信號的FFT變換,哪怕每種信號只做128點的FFT,運算一次也要好幾秒。下面來看用傳統(tǒng)編程結(jié)構(gòu)實現(xiàn)上述設(shè)計時遇到的困擾。

  1.1 使用“前后臺方式”進(jìn)行編程

  使用“前后臺方式”進(jìn)行編程時,為保證任務(wù)⑤的及時性,使用了UART中斷,當(dāng)UART完成一個字節(jié)的收發(fā)后產(chǎn)生中斷,在中斷程序中將接收到的字符保存在接收緩沖區(qū)或從發(fā)送緩沖區(qū)取下一個待發(fā)字符裝入UART進(jìn)行發(fā)送,對Modbus協(xié)議的處理可以單獨用一個任務(wù)在中斷外處理,這保證了巾斷程序的簡短。為保證任務(wù)⑨響應(yīng)的及時性,也必須為它安排一個中斷。因為當(dāng)系統(tǒng)掉電時,系統(tǒng)只有不到10 ms的過渡時間,系統(tǒng)如果不能在這個時間內(nèi)完成相關(guān)的操作,系統(tǒng)電壓將跌落至有效電壓以下而喪失工作能力。

  安排好了后臺的中斷任務(wù)后再來看看前臺的任務(wù)如何完成。這里遇到的最大的挑戰(zhàn)是對任務(wù)⑧的處理,因為任務(wù)⑧需要的執(zhí)行時間太長了,簡單的把它當(dāng)成一個任務(wù)處理將影響系統(tǒng)對其他任務(wù)的響應(yīng),在超級循環(huán)中的代碼結(jié)構(gòu)如下:

  while(1){

  任務(wù)①;

  任務(wù)②;

  ……

  任務(wù)⑧;

  }

  由于任務(wù)⑧執(zhí)行一次要幾秒鐘的時間,整個超級循環(huán)執(zhí)行一次至少大于任務(wù)⑧需要的時間,也就是說這個超級循環(huán)循環(huán)一次要幾秒鐘時間,將滿足不了各任務(wù)響應(yīng)時間的要求。

  要解決這個問題,只有把任務(wù)⑧拆分成很多個子任務(wù),將每個子任務(wù)的耗時壓縮到10 ms左右,并定義好各個子任務(wù)完成后的狀態(tài),在超級大循環(huán)中每次根據(jù)狀態(tài)只執(zhí)行一個子任務(wù),程序結(jié)構(gòu)如下:

  這樣,就需要把一個耗時幾秒的FFT運算任務(wù)拆分成幾百個耗時10 ms左有的子任務(wù),這顯然是不可接受的。除此之外,超級大循環(huán)結(jié)構(gòu)隱含的一個缺點就是隨著任務(wù)的增加,循環(huán)體的執(zhí)行時間是線性增加的,在實際設(shè)計中即使沒有像任務(wù)⑧那樣的高耗時任務(wù),當(dāng)系統(tǒng)功能增加時要保證系統(tǒng)響應(yīng)的及時性也是一個不小的挑戰(zhàn)。

  1.2 使用“時間觸發(fā)編程模式”進(jìn)行編程

  “時間觸發(fā)編程模式”的核心是建立一個基丁時間觸發(fā)的合作式的任務(wù)調(diào)度器,在系統(tǒng)中盡量減少事件觸發(fā)(減少中斷的使用),系統(tǒng)通過任務(wù)調(diào)度器完成各任務(wù)的調(diào)度執(zhí)行,下面是“時間觸發(fā)編程模式”的典型程序結(jié)構(gòu):

    

  系統(tǒng)中每個任務(wù)都定義了優(yōu)先級、任務(wù)循環(huán)周期和任務(wù)延遲時間,系統(tǒng)定時器中斷程序SCH Updatc()按設(shè)定的節(jié)拍對任務(wù)隊列進(jìn)行刷新,在超級大循環(huán)中只執(zhí)行任務(wù)調(diào)度器SCH_Dispatch_Tasks(),根據(jù)任務(wù)隊列的狀念安排任務(wù)的執(zhí)行。

  這種編程結(jié)構(gòu)避免了超級大循環(huán)結(jié)構(gòu)循環(huán)時間隨代碼量的增加而線性增加的問題,但是由于任務(wù)是不可剝奪的,一旦任務(wù)啟動執(zhí)行,任務(wù)調(diào)度器只有在當(dāng)前任務(wù)完成后才有機(jī)會執(zhí)行,這就要求每個任務(wù)占用CPU的時間不能太長,否則將影響整個系統(tǒng)的響應(yīng)速度。所以,F(xiàn)FT運算在這種編程模式下還是必須進(jìn)行有效的拆分,否則就必須提高CPU的檔次或使用可剝奪型的搶先式RTOS,這勢必造成系統(tǒng)成本的增加。那么有沒有更好的解決辦法呢?

  下面的編程結(jié)構(gòu)塒“時間觸發(fā)編程模式”進(jìn)行了改進(jìn),使之在不提高硬件成本的情況下,使編程人員更直觀地定義任務(wù),減少任務(wù)特性對系統(tǒng)程序結(jié)構(gòu)的沖擊,使程序結(jié)構(gòu)簡單、明了并提高系統(tǒng)的實時響應(yīng)速度。
回復(fù)

使用道具 舉報

發(fā)表回復(fù)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表