嵌入式軟件中延遲回調(diào)的設(shè)計和應(yīng)用
引言
本文引用地址:http://cafeforensic.com/article/142446.htm嵌入式系統(tǒng)通常由處理器外掛多種周邊芯片構(gòu)成,工程師需要花較多的時間來設(shè)計和調(diào)試這些外圍芯片的驅(qū)動程序,驅(qū)動程序的性能將直接決定嵌入式系統(tǒng)能否穩(wěn)定運行和達成設(shè)計目標。一般地,處理器廠家會將目標應(yīng)用中用到的外設(shè)驅(qū)動打包成板級支持包BSP(board support package),該BSP提供標準的API給用戶,開發(fā)人員只需按指定方式調(diào)用相應(yīng)的函數(shù)獲取服務(wù),從而簡化系統(tǒng)設(shè)計,而廠家在發(fā)布BSP包前會做一些測試來確保功能和性能。也有例外,工程師有時不得不定制或重新開發(fā)驅(qū)動程序,例如: 1)廠家提供的驅(qū)動程序是針對某一操作系統(tǒng)的,而用戶的系統(tǒng)則是經(jīng)過充分裁剪甚至無操作系統(tǒng);2)用戶程序框架很成熟,新的驅(qū)動程序需要修改以匹配該軟件框架,并只使用現(xiàn)有的系統(tǒng)服務(wù)。
一個架構(gòu)良好的嵌入式軟件,能提供的系統(tǒng)服務(wù)將涵蓋現(xiàn)時用到的全部功能,并支持有序擴充,為嵌入式系統(tǒng)設(shè)計系統(tǒng)服務(wù)最重要的是框架簡潔高效。驅(qū)動程序則是構(gòu)筑在系統(tǒng)服務(wù)之上,為應(yīng)用程序提供簡單易用的與外設(shè)通訊的接口,如圖1所示?! ?/p>
在事件驅(qū)動的應(yīng)用中,需要用到的系統(tǒng)服務(wù)就包括回調(diào)函數(shù)(callback functions),它被廣泛使用來簡化驅(qū)動程序的設(shè)計。以UART驅(qū)動程序為例: 應(yīng)用程序首先向系統(tǒng)申請DMA服務(wù), 由DMA控制器從內(nèi)存中將一個100字節(jié)的包順序從UART控制器發(fā)出,發(fā)送過程可能會持續(xù)1000ms, 發(fā)送完成才可以執(zhí)行后續(xù)相關(guān)任務(wù)。如果內(nèi)核此時通過查詢方式獲取發(fā)送狀態(tài),無疑將大大地降低系統(tǒng)運行效率。更簡便高效的方式是引入回調(diào)函數(shù)機制,在初始化時提供回調(diào)函數(shù),請求的任務(wù)完成時該回調(diào)函數(shù)將被自動調(diào)用。
事件的處理過程一般和硬件中斷關(guān)聯(lián)在一起。高優(yōu)先級的處理任務(wù)需要直接放在中斷服務(wù)程序中執(zhí)行,對于實時性要求很高的應(yīng)用,中斷服務(wù)程序中應(yīng)盡可能短小。而大量的、長時間的處理則可以放入回調(diào)函數(shù)中,以較低優(yōu)先級(通常是軟件中斷級)運行,并隨時可以被高優(yōu)先級的其它硬件中斷搶占。這樣的機制要求對所有的回調(diào)函數(shù)統(tǒng)一管理和分派,有些可能還要求能設(shè)置回調(diào)函數(shù)的優(yōu)先級。此時,回調(diào)函數(shù)并不是在請求的事件發(fā)生時馬上被執(zhí)行,而是延遲至合理的被調(diào)度時刻運行。這稱為延遲回調(diào)(DCB, deferred callback)。
以高性能Blackfin和SHARC處理器平臺為例,ADI公司提供了完備的系統(tǒng)服務(wù)和驅(qū)動包(System Service & Device Driver),它能夠獨立運行,也可與操作系統(tǒng)協(xié)同工作,其中就包括高效率的延遲回調(diào)服務(wù),用戶編寫驅(qū)動程序的工作被大大簡化。不過,一些高實時系統(tǒng)比如電機驅(qū)動器無需操作系統(tǒng),類似的框架在實際應(yīng)用中仍顯復雜。這里介紹的方法以最簡潔的方式實現(xiàn)延遲回調(diào)服務(wù),可單獨封裝成模塊,應(yīng)用于任何處理器。
linux操作系統(tǒng)文章專題:linux操作系統(tǒng)詳解(linux不再難懂)
評論