<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > DSP/BIOS中的IO設備驅動(dòng)編程技術(shù)

DSP/BIOS中的IO設備驅動(dòng)編程技術(shù)

作者: 時(shí)間:2010-12-22 來(lái)源:網(wǎng)絡(luò ) 收藏

圖2給出了此模式中最簡(jiǎn)單的傳送狀態(tài)集。圓圈中單詞表示設備驅動(dòng)程序緩沖區隊列的狀態(tài)。第一個(gè)單詞是“to device”隊列,第二個(gè)表示外設占用緩沖區指針,第三個(gè)是“from device”隊列,第二個(gè)表示外設占用緩沖區指針,第三個(gè)是“from device”隊列。E表示空,F表示滿(mǎn),EEE是起始狀態(tài)。

每個(gè)隊列可以是空(E),滿(mǎn)(F),非空非滿(mǎn)(N)。應用程序調用PutBuf()將緩沖區放到“to device”隊列中。驅動(dòng)程序立即將緩沖區放進(jìn)外設,轉移到狀態(tài)“EFE”。當傳送完畢,外設向驅動(dòng)程序發(fā)中斷信號,然后驅動(dòng)中斷處理程序將緩沖區從外設寄存器轉移到“from device”隊列,轉移到狀態(tài)“EEF”,接著(zhù)調用應用程序的回調函數?;卣{函數調用GetBuf()從驅動(dòng)程序的“from device”隊列重新得到緩沖區,驅動(dòng)程序返回起始狀態(tài)。

如果驅動(dòng)程序支持硬件排隊,則當一個(gè)緩沖區正由外設傳送時(shí),“to device”隊列能控制另一個(gè)緩沖區。與圖2中狀態(tài)轉移不同,應用程序現在可能向“to device”隊列增加另一個(gè)緩沖區。驅動(dòng)程序將此緩沖區指針存進(jìn)一個(gè)隊列,此時(shí)狀態(tài)為“FFE”,“to device”隊列為滿(mǎn),外設正在傳送一個(gè)緩沖區,“from device”隊列為空。使用C數據結構實(shí)現這種狀態(tài)機器的狀態(tài)向量。

使用DMA全局重新加載寄存器來(lái)控制“to device”隊列,狀態(tài)結構如下所示。

Typedef struct drv_state{

Bool enabled;

Ptr currentBuffer;

Uns currentSize;

Ptr fullBuffer;

Uns fullSize;

LIO_TcallBack callback;

Arg calbackArg;

} LIO_Obj;

第一個(gè)字段“enabled”是一個(gè)布爾值,表示程序的開(kāi)始或結束。下面兩個(gè)字段“currentBuffer”“currentSize”控制當前傳送緩沖區的起始地址和尺寸。當傳送完畢,它們轉移到“from device”隊列。“fullBuffer”“fullSize”字段實(shí)現長(cháng)度為1的“from device”隊列。Callback()的地址和參數通過(guò)setCallback()存儲在狀態(tài)結構中。

驅程序對每個(gè)緩沖區只接收一個(gè)中斷,而不是每個(gè)采樣一個(gè)斷。發(fā)生中斷時(shí),驅動(dòng)程序已經(jīng)知道緩沖區傳送完畢,重新加載,DMA不需再重新編程。中斷處理程序首先將currentBuffer內容移到fullBuffer中。如果緩沖區已在“to device”隊列中,即已使用重新加載的DMA,則新緩沖區指針和長(cháng)度記錄進(jìn)currentBuffer字段中,然后調用callback()。一旦定義了基本的狀態(tài)機器,相似硬件的新驅動(dòng)程序就很容易寫(xiě)出。


上一頁(yè) 1 2 3 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>