<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計應(yīng)用 > 改進型時間觸發(fā)嵌入式系統(tǒng)編程模式

          改進型時間觸發(fā)嵌入式系統(tǒng)編程模式

          作者: 時間:2012-07-18 來源:網(wǎng)絡(luò) 收藏

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

          引言
          目前,RTOS特別是搶先式RTOS在嵌入式系統(tǒng)中的應(yīng)用越來越廣泛,但是還有很大一部分產(chǎn)品使用是小型單片機。這些系統(tǒng)由于成本的限制,通常資源非常有限,比如ROM往往小丁32 KB,RAM小于2 KB,由于RTOS對每個任務(wù)都要開辟單獨內(nèi)存區(qū)域,存放任務(wù)的上下文和各任務(wù)獨立的堆棧,所以在這種系統(tǒng)中使用RTOS非常勉強。對于這些低成本資源受限系統(tǒng)通常采用“前后臺”(或者叫“超級循環(huán)”)結(jié)構(gòu)進行編程,這實際上是一種事件觸發(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ā)的編程模式”進行了改進,使之適應(yīng)性更強,可以為成本和資源受限的小型嵌入式系統(tǒng)提供統(tǒng)一且有效的編程模式。

          1 傳統(tǒng)編程結(jié)構(gòu)的局限性
          當(dāng)不使用RTOS時,嵌入式軟件通常采用兩種傳統(tǒng)的編程結(jié)構(gòu)進行編程,一種叫“前后臺廳式”或者叫“超級循環(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ù)進行一次刷新。
          ②每0.1 s對DI/DO進行一次刷新。
          ③每0.2 s對鍵盤進行一次掃描。
          ④每半秒對測量數(shù)據(jù)進行一次重新采集和計算。
          ⑤異步串行口與上位機使用Modhus通信,速率最高1 9 200 bps。
          ⑥CPU通過I2C總線與時鐘芯片和EEPROM通信。
          ⑦CPU通過SPI總線與LED數(shù)碼管及采集芯片通信。
          ⑧CPU要對所采集的6路信號進行FFT變換。
          ⑨當(dāng)系統(tǒng)掉電時,CPU要能快速響應(yīng),把當(dāng)前的電度底數(shù)寫入EEPROM中。
          上述任務(wù)中,任務(wù)⑤和任務(wù)⑨是強實時性的,如果對串口的收發(fā)事件得不到及時響應(yīng),接收時會導(dǎo)致字節(jié)丟失,發(fā)送時會導(dǎo)致字節(jié)間時間間隔太大,造成接收方的Modbus幀定界錯誤,對系統(tǒng)掉電事件如果不能及時響應(yīng)會造成EEPROM的寫入失敗。其他任務(wù)只要在指定的周期內(nèi)能得到執(zhí)行就行,但是任務(wù)⑧比較特殊,使用通常的8位CPU進行6種信號的FFT變換,哪怕每種信號只做128點的FFT,運算一次也要好幾秒。下面來看用傳統(tǒng)編程結(jié)構(gòu)實現(xiàn)上述設(shè)計時遇到的困擾。
          1.1 使用“前后臺方式”進行編程
          使用“前后臺方式”進行編程時,為保證任務(wù)⑤的及時性,使用了UART中斷,當(dāng)UART完成一個字節(jié)的收發(fā)后產(chǎn)生中斷,在中斷程序中將接收到的字符保存在接收緩沖區(qū)或從發(fā)送緩沖區(qū)取下一個待發(fā)字符裝入UART進行發(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ù)⑧;
          }

          linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)

          上一頁 1 2 3 4 下一頁

          評論


          相關(guān)推薦

          技術(shù)專區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();