嵌入式軟件中延遲回調的設計和應用
引言
本文引用地址:http://www.ex-cimer.com/article/142446.htm嵌入式系統通常由處理器外掛多種周邊芯片構成,工程師需要花較多的時間來設計和調試這些外圍芯片的驅動程序,驅動程序的性能將直接決定嵌入式系統能否穩定運行和達成設計目標。一般地,處理器廠家會將目標應用中用到的外設驅動打包成板級支持包BSP(board support package),該BSP提供標準的API給用戶,開發人員只需按指定方式調用相應的函數獲取服務,從而簡化系統設計,而廠家在發布BSP包前會做一些測試來確保功能和性能。也有例外,工程師有時不得不定制或重新開發驅動程序,例如: 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不再難懂)
評論