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

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > DSP/BIOS中的I/O設(shè)備驅(qū)動(dòng)編程技術(shù)

          DSP/BIOS中的I/O設(shè)備驅(qū)動(dòng)編程技術(shù)

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

          摘要:介紹了/BIOS中I/O設(shè)備驅(qū)動(dòng)程序的編寫,并給出了一個(gè)在TMS320C5402 DSK上開發(fā)語(yǔ)音處理程序的實(shí)例。

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

          關(guān)鍵詞:器() 實(shí)時(shí)操作系統(tǒng) I/O設(shè)備驅(qū)動(dòng) 應(yīng)用程序接口(API)

          近年來(lái),隨著信息技術(shù)的飛速發(fā)展,在航空、航天、雷達(dá)、通信、消費(fèi)類電子設(shè)備等方面都得到了廣泛應(yīng)用;同時(shí),DSP的運(yùn)算能力也越大越強(qiáng)大,TI公司新推出的TMS320C6400系列的運(yùn)算能力可以達(dá)到8800MIPS。這些都要求開發(fā)DSP的應(yīng)用程序要縮短開發(fā)時(shí)間,增加軟件的可編護(hù)性和可重用性。語(yǔ)音壓縮、語(yǔ)音識(shí)別、圖像處理等方面的應(yīng)用要求DSP的開發(fā)盡可能簡(jiǎn)單,還要求代碼的執(zhí)行效率高。

          DSP/BIOS是TI公司推出的一個(gè)實(shí)時(shí)操作系統(tǒng)。DSP/BIOS與TI的CCS(Code Composer Studio)集成在一起。目前最新的版本是CCS 1.2中的DSP/BIOS II。應(yīng)用DSP/BIOS可以大大簡(jiǎn)化DSP應(yīng)用程序的開發(fā)和調(diào)試。與外部設(shè)備的I/O接口是DSP應(yīng)用開發(fā)中不可缺少的重要部分?;贒SP/BIOS的I/O設(shè)備驅(qū)動(dòng)將軟件與硬件分離,提高了軟件的可重用性,在軟件或硬件改動(dòng)時(shí)可使相互的影響降為最小。

          1 DSP/BISO操作系統(tǒng)簡(jiǎn)介

          DSP/BIOS實(shí)際上是一組可重復(fù)調(diào)用的系統(tǒng)模塊API的集合。只占用DSP很少的資源,可以滿足DSP實(shí)時(shí)運(yùn)行時(shí)的調(diào)試性能分析,編寫高效的程序。例如,在TMS320C6211上運(yùn)行printf()函數(shù)需花費(fèi)4000個(gè)周期,而運(yùn)行LOG_printf()只花費(fèi)36個(gè)周期,可printf()要比LOG_pfrintf()多花費(fèi)100倍以上的時(shí)間。下面只對(duì)與I/O設(shè)備驅(qū)動(dòng)有關(guān)的模塊作簡(jiǎn)要介紹。

          1.1 任務(wù)調(diào)度模塊(HWI/SWI/TSK)

          在DSP/BIOS中,任務(wù)的調(diào)度是通過(guò)HWI、SWI和TSK三個(gè)模塊實(shí)現(xiàn)的。HWI(硬件中斷管理模塊)管理硬件中斷,主要負(fù)責(zé)DSP與外設(shè)的交互,從外設(shè)中讀寫數(shù)據(jù)。由于硬件中斷直接與硬件打交道,對(duì)應(yīng)的中斷服務(wù)程序ISR應(yīng)盡可能短小精焊。HWI不引起任務(wù)調(diào)度,它在處理完數(shù)據(jù)的輸入輸出后調(diào)用SWI_post()來(lái)調(diào)度相應(yīng)的軟件中斷SWI完成數(shù)據(jù)處理工作。

          DSP/BIOS提供兩類優(yōu)先線程:SWI(軟件中斷管理模塊)和TSK(任務(wù)管理模塊)。SWI是DSP/BIOS任務(wù)調(diào)度的核心,SWI任務(wù)是搶斷式的,即高優(yōu)先級(jí)的任務(wù)可以搶斷低優(yōu)先級(jí)的任務(wù)。但是SWI任務(wù)是不可阻塞的,所有SWI任務(wù)共享一個(gè)堆棧,SWI任務(wù)只能在程序編制時(shí)預(yù)先定義好。DSP/BIOS中對(duì)任務(wù)的動(dòng)態(tài)產(chǎn)生和對(duì)阻塞狀態(tài)的支持是通過(guò)TSK模塊來(lái)實(shí)現(xiàn)的。TSK也是可以搶斷的,但每個(gè)TSK任務(wù)使用獨(dú)立的堆棧。

          1.2 通訊模塊(PIP/SIO)

          PIP(帶緩沖管道管理模塊)和SIO(流輸入輸出管理模塊)是DSP/BIOS提供的兩個(gè)接口對(duì)象,用于支持DSP與外設(shè)之間 數(shù)據(jù)交換。PIP對(duì)象帶有一個(gè)緩沖隊(duì)列,可以執(zhí)行帶緩沖的讀任務(wù)和寫任務(wù)。SIO沒(méi)有緩沖隊(duì)列,SIO的操作get()和put()在應(yīng)用程序和驅(qū)動(dòng)程序之間交換緩沖的指針,而不是數(shù)據(jù)的拷貝,因此執(zhí)行效率比PIP高。

          PIP和SIO對(duì)象支持基于幀的信號(hào)處理系統(tǒng)的實(shí)現(xiàn)。在多速率系統(tǒng)中需要使用優(yōu)先級(jí)線程來(lái)統(tǒng)一端口通信,在其它需要處理不同尺寸、不同速率的幀的系統(tǒng)中,優(yōu)先級(jí)線程也是必須的。PIP對(duì)象可被SWI或TSK線程使用,而SIO對(duì)象只能被TSK使用。

          2 低級(jí)設(shè)備驅(qū)動(dòng)(LIO)

          LIO(Low Level I/O)是一組基于DSP/BIOS設(shè)計(jì)的API函數(shù)。它由控制函數(shù)、I/O緩沖區(qū)管理函數(shù)、信令函數(shù)組成,如表1所示。應(yīng)用程序可以通過(guò)LIO函數(shù)控制一個(gè)或多個(gè)外設(shè)通道。

          表1 LIO API函數(shù)

          函 數(shù)函數(shù)類型描 述

          Open
          Close
          Cntl
          Start
          Stop
          GetBuf
          PutBuf
          IsEmpty
          IsFull
          SetCallback

          控制
          控制
          控制
          控制
          控制
          緩沖區(qū)隊(duì)列
          緩沖區(qū)隊(duì)列
          緩沖區(qū)隊(duì)列
          緩沖區(qū)隊(duì)列
          信令

          分配資源,初始化設(shè)備
          釋放資源,復(fù)位設(shè)備
          設(shè)備特殊操作
          緩沖區(qū)傳送使能
          緩沖區(qū)傳送使不能
          從設(shè)備輸出隊(duì)列重新得到緩沖區(qū)
          將緩沖區(qū)放入設(shè)備輸入隊(duì)列
          若設(shè)備輸出隊(duì)列為空返回真
          若設(shè)備輸入隊(duì)列為滿返回真
          當(dāng)傳送畢,設(shè)置函數(shù)為調(diào)用

          LIO函數(shù)不考慮數(shù)據(jù)的轉(zhuǎn)送方向,也就是說(shuō)僅執(zhí)行輸出設(shè)備、僅執(zhí)行輸入設(shè)備和能執(zhí)行輸入、輸出的設(shè)備執(zhí)行的是同樣的函數(shù)。輸入與輸出之間的主要不同點(diǎn)是傳送到緩沖區(qū)隊(duì)列函數(shù)的參數(shù)意義不同。既然所有其它的操作都是同樣的,大多數(shù)控制代碼能在單個(gè)驅(qū)動(dòng)程序中被所有通道共享。

          2.1 總體設(shè)計(jì)、設(shè)想和命名規(guī)范

          所有的驅(qū)動(dòng)程序函數(shù)都不能設(shè)置成全局中斷。驅(qū)動(dòng)程序應(yīng)不影響全局中斷使能標(biāo)記的狀態(tài),僅影響由它控制的外設(shè)所能觸發(fā)的中斷所對(duì)應(yīng)使能標(biāo)記的狀態(tài)。這樣可以阻止一個(gè)驅(qū)動(dòng)程序與其它驅(qū)動(dòng)程序或應(yīng)用程序爭(zhēng)奪CPU資源。

          為了避免由不同驅(qū)動(dòng)程序使用同一函數(shù)名引起的命名空間沖突,也為了改變驅(qū)動(dòng)程序而不需再編譯應(yīng)用程序代碼,可以通過(guò)函數(shù)表訪問(wèn)驅(qū)動(dòng)程序函數(shù)。用這種方式,僅需要為每個(gè)驅(qū)動(dòng)程序定義一個(gè)外部符號(hào)。這種符號(hào)有其命名規(guī)范。此命名規(guī)范通過(guò)接線板、在片外設(shè)、LIO接口等來(lái)區(qū)分。如包含應(yīng)用程序注釋的源代碼為TI TMS320VC5402 DSK的AD50音頻編解碼器執(zhí)行基于DMA的驅(qū)動(dòng)程序,驅(qū)動(dòng)程序函數(shù)表名是DSK5402_DMA_AD50_TI_ILIO。

          設(shè)備驅(qū)動(dòng)程序支持的各通道半雙工(輸入或輸出)通道。每個(gè)函數(shù)對(duì)應(yīng)一個(gè)通道變量。一個(gè)能執(zhí)行輸入和輸出的物理設(shè)備,如連接到音頻編解碼器的DSP串口,可通過(guò)兩個(gè)半雙工通道(一個(gè)輸入,一個(gè)輸出)來(lái)訪問(wèn)。一個(gè)驅(qū)動(dòng)程序支持多少個(gè)物理設(shè)備和通道依具體實(shí)現(xiàn)而實(shí)。一般一個(gè)驅(qū)動(dòng)程序應(yīng)能控制一個(gè)物理設(shè)備,此設(shè)備可能有多個(gè)通道。通道號(hào)與物理設(shè)備通道的映射執(zhí)行時(shí)確定。通道號(hào)應(yīng)約定從0開始。對(duì)I/O設(shè)備,一般約定偶數(shù)號(hào)為輸入,奇數(shù)號(hào)為輸出。

          2.2 三類函數(shù)

          LIO接口中有三類函數(shù):控制函數(shù)、緩沖區(qū)和隊(duì)列管理函數(shù)、信令函數(shù)。

          2.2.1 控制函數(shù)

          控制函數(shù)用來(lái)實(shí)現(xiàn)設(shè)備的啟動(dòng)、關(guān)閉和控制。其初始函數(shù)為驅(qū)動(dòng)程序保存資源(物理外設(shè)和內(nèi)存)。它使用結(jié)構(gòu)指針作為可選變量,此結(jié)構(gòu)是一種設(shè)備的特殊變量結(jié)構(gòu)。

          2.2.2 隊(duì)列管理

          假定每個(gè)設(shè)備至少有一個(gè)用來(lái)傳送數(shù)據(jù)的緩沖區(qū)。許多設(shè)備(如McBSP和DMA)帶有允許雙緩沖的緩沖隊(duì)列。圖1是一個(gè)有三個(gè)存儲(chǔ)單元的LIO驅(qū)動(dòng)程序,驅(qū)動(dòng)程序中有:由外設(shè)填滿或清空的緩沖區(qū)“todevice”(到設(shè)備)隊(duì)列,將傳送的緩沖區(qū)返回到應(yīng)用程序的緩沖區(qū)管理程序的“from device”(來(lái)自設(shè)備)隊(duì)列和當(dāng)前傳送數(shù)據(jù)的緩沖區(qū)。在虛線框里的認(rèn)為是在驅(qū)動(dòng)程序里面。當(dāng)前傳送數(shù)據(jù)的緩沖一般由外設(shè)寄存器控制,如DMA源寄存器或目標(biāo)寄存器,在圖1中畫在“外設(shè)”中。含硬件隊(duì)列(如DMA重新如載寄存器)的設(shè)備也會(huì)含一個(gè)或多個(gè)存儲(chǔ)單元用業(yè)存儲(chǔ)指針為以后傳送用,此隊(duì)列為“to device”隊(duì)列。能包含緩沖區(qū)指針的第三個(gè)存儲(chǔ)單元是“from device”隊(duì)列,在驅(qū)動(dòng)程序中為一變量。當(dāng)設(shè)備準(zhǔn)備傳送緩沖區(qū)時(shí),緩沖區(qū)從輸入隊(duì)列傳送到外設(shè)寄存器。這些緩沖區(qū)然后移到輸出隊(duì)列以完成傳送,作為對(duì)CPU中斷的響應(yīng)。

          PutBuf()將緩沖區(qū)從應(yīng)用程序傳送到驅(qū)動(dòng)程序的輸入隊(duì)列。GetBuf()從輸出隊(duì)列得到緩沖區(qū)。IsEmpty()和IsFull()返回輸入隊(duì)列、輸出隊(duì)列的狀態(tài)。如果輸入隊(duì)列滿,因?yàn)闊o(wú)空間裝新緩沖區(qū),調(diào)用putBuf()會(huì)返回錯(cuò)誤代碼。若IsFull()返回false,接下來(lái)可調(diào)用putBuf()。如果IsFull()返回true,但若在IsFull()返回true和調(diào)用putBuf()之間完成傳送,則調(diào)用putBuf()也可能會(huì)成功。

          2.2.3 信令

          如圖1所示,當(dāng)傳送結(jié)束一般會(huì)觸發(fā)CPU中斷。此中斷會(huì)使應(yīng)用程序?qū)魉偷木彌_區(qū)轉(zhuǎn)移到輸出隊(duì)列,然后調(diào)用calback()傳到驅(qū)動(dòng)程序。Callback()應(yīng)向應(yīng)用程序發(fā)信號(hào)告知傳送完畢。

          3 LIO驅(qū)動(dòng)程序例子

          音頻處理如語(yǔ)音壓縮、呼叫過(guò)程音調(diào)檢測(cè)等,是DSP的一般應(yīng)用。本例是使用TMS320C5402 DSK上的DMA將音頻編解碼數(shù)據(jù)從McBSP移到緩沖區(qū)中。

          當(dāng)驅(qū)動(dòng)程序響應(yīng)應(yīng)用程序調(diào)用和設(shè)備中斷時(shí),采用數(shù)據(jù)結(jié)構(gòu)跟蹤驅(qū)動(dòng)程序的狀態(tài)。有效狀態(tài)是設(shè)備驅(qū)動(dòng)程序緩沖區(qū)隊(duì)列的狀態(tài),如圖1所示。

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

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

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

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

          Typedef struct drv_state{

          Bool enabled;

          Ptr currentBuffer;

          Uns currentSize;

          Ptr fullBuffer;

          Uns fullSize;

          LIO_TcallBack callback;

          Arg calbackArg;

          } LIO_Obj;

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

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



          評(píng)論


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