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

          新聞中心

          EEPW首頁 > 嵌入式系統 > 設計應用 > 嵌入式軟件中延遲回調的設計和應用

          嵌入式軟件中延遲回調的設計和應用

          作者:胡丙龍時間:2013-02-27來源:電子產品世界收藏

            引言

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

            系統通常由處理器外掛多種周邊芯片構成,工程師需要花較多的時間來設計和調試這些外圍芯片的驅動程序,驅動程序的性能將直接決定系統能否穩定運行和達成設計目標。一般地,處理器廠家會將目標應用中用到的外設驅動打包成板級支持包(board support package),該提供標準的API給用戶,開發人員只需按指定方式調用相應的函數獲取服務,從而簡化系統設計,而廠家在發布包前會做一些測試來確保功能和性能。也有例外,工程師有時不得不定制或重新開發驅動程序,例如: 1)廠家提供的驅動程序是針對某一操作系統的,而用戶的系統則是經過充分裁剪甚至無操作系統;2)用戶程序框架很成熟,新的驅動程序需要修改以匹配該軟件框架,并只使用現有的系統服務。

            一個架構良好的軟件,能提供的系統服務將涵蓋現時用到的全部功能,并支持有序擴充,為嵌入式系統設計系統服務最重要的是框架簡潔高效。驅動程序則是構筑在系統服務之上,為應用程序提供簡單易用的與外設通訊的接口,如圖1所示?! ?/p>

           

            在事件驅動的應用中,需要用到的系統服務就包括回調函數(callback functions),它被廣泛使用來簡化驅動程序的設計。以UART驅動程序為例: 應用程序首先向系統申請DMA服務, 由DMA控制器從內存中將一個100字節的包順序從UART控制器發出,發送過程可能會持續1000ms, 發送完成才可以執行后續相關任務。如果內核此時通過查詢方式獲取發送狀態,無疑將大大地降低系統運行效率。更簡便高效的方式是引入回調函數機制,在初始化時提供回調函數,請求的任務完成時該回調函數將被自動調用。

            事件的處理過程一般和硬件中斷關聯在一起。高優先級的處理任務需要直接放在中斷服務程序中執行,對于實時性要求很高的應用,中斷服務程序中應盡可能短小。而大量的、長時間的處理則可以放入回調函數中,以較低優先級(通常是軟件中斷級)運行,并隨時可以被高優先級的其它硬件中斷搶占。這樣的機制要求對所有的回調函數統一管理和分派,有些可能還要求能設置回調函數的優先級。此時,回調函數并不是在請求的事件發生時馬上被執行,而是延遲至合理的被調度時刻運行。這稱為延遲回調(DCB, deferred callback)。

            以高性能Blackfin和SHARC處理器平臺為例,ADI公司提供了完備的系統服務和驅動包(System Service & Device Driver),它能夠獨立運行,也可與操作系統協同工作,其中就包括高效率的延遲回調服務,用戶編寫驅動程序的工作被大大簡化。不過,一些高實時系統比如電機驅動器無需操作系統,類似的框架在實際應用中仍顯復雜。這里介紹的方法以最簡潔的方式實現延遲回調服務,可單獨封裝成模塊,應用于任何處理器。

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


          關鍵詞: 嵌入式 BSP

          評論


          相關推薦

          技術專區

          關閉
          看屁屁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); })();