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

          新聞中心

          EEPW首頁 > 嵌入式系統(tǒng) > 牛人業(yè)話 > 注冊機(jī)制與消息機(jī)制-嵌入式微系統(tǒng)連載之七

          注冊機(jī)制與消息機(jī)制-嵌入式微系統(tǒng)連載之七

          作者: 時間:2014-09-15 來源:網(wǎng)絡(luò) 收藏

            在嵌入式編程中很少提到,但回調(diào)函數(shù)大家經(jīng)常接觸,以軟件定時器為例:

          本文引用地址:http://www.ex-cimer.com/article/262928.htm

            

           

            軟件定時器設(shè)備通過函數(shù)Start把FunctionCallback作為參數(shù)傳入定時器設(shè)備中保存,之后開啟定時器,延時1000ms之后,定時器就會直接調(diào)用FunctionCallback,所以這個FunctionCallback就叫做回調(diào)函數(shù)。類似處理器的中斷一樣。

            類似回調(diào)函數(shù)性質(zhì),只是把概念擴(kuò)展到變量,上層應(yīng)用通過注冊函數(shù)地址或者變量地址到設(shè)備中保存,當(dāng)設(shè)備中這個地址對應(yīng)的函數(shù)被激活或者變量值有改變,就調(diào)用這個函數(shù)或者更改這個變量值,以此達(dá)到底層對上層的信息傳遞。

            以設(shè)備為例,我們看一下的應(yīng)用。首先在設(shè)備device_adc.c中定義一個用于注冊變量地址的指針數(shù)組RegisterPointerBlock,初始值必須要指向一個空變量,否則若指向了一些有用的地址而導(dǎo)致這個地址對應(yīng)的數(shù)據(jù)改變,會引起不可預(yù)測問題。

            

           

            在設(shè)備中引入注冊機(jī)制,應(yīng)用層只需要把變量的地址注冊到設(shè)備中,設(shè)備自己可以通過這個地址修改數(shù)據(jù),這樣解放了應(yīng)用層,讓應(yīng)用層不需要關(guān)心如何獲取數(shù)據(jù)。但是,注冊機(jī)制也存在一些缺陷,那就是操作的數(shù)據(jù),必須要原子操作,否則會導(dǎo)致兩個應(yīng)用層與設(shè)備同時修改一個數(shù)據(jù)的異常存在,出現(xiàn)數(shù)據(jù)錯誤,這個是需要避免的。

            相對注冊機(jī)制,消息機(jī)制是大家所熟悉的一種底層向上層傳遞的方式,msOS采用uC/OS-II,標(biāo)配為業(yè)務(wù)邏輯與菜單界面兩個任務(wù),業(yè)務(wù)邏輯為高優(yōu)先級,支持消息隊(duì)列,設(shè)備發(fā)送的消息,都在業(yè)務(wù)邏輯中處理。

            

           

            需要注意的是,msOS是采用的是uC/OS-II,它屬于RTOS,業(yè)務(wù)邏輯與菜單界面雖然是兩個獨(dú)立的任務(wù),但并不是同時運(yùn)行的,一個時刻只能運(yùn)行一個任務(wù),業(yè)務(wù)邏輯的任務(wù)優(yōu)先級高于菜單界面,所以在沒有消息的時候,業(yè)務(wù)邏輯任務(wù)(LogicTask)在PendMessageQueue函數(shù)中掛起等待消息到來,這個時候退到菜單界面任務(wù)(MenuTask)執(zhí)行,一旦按鍵設(shè)備檢測到按鍵并通過PostMessageToLogicTask發(fā)送消息,就會激活業(yè)務(wù)邏輯任務(wù),讓業(yè)務(wù)邏輯任務(wù)搶占菜單界面任務(wù)運(yùn)行。按鍵設(shè)備的運(yùn)行是基于系統(tǒng)節(jié)拍的,它是在中斷中運(yùn)行,優(yōu)先級比任務(wù)高,不會被任務(wù)搶占。



          評論


          相關(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); })();