基于ARM9處理器S3C2410的數(shù)字多路語音記錄器
AC48304是一種專用的語音處理DSP芯片,需要運行相應(yīng)的DSP程序。正常運行前, AC48304有兩個程序需要下載:kernel(內(nèi)核)程序和application(應(yīng)用)程序。kernel程序是個只有幾百字節(jié)的小程序,完成DSP的初始化工作,為下載應(yīng)用程序做準備。application程序則完成AC48304的所有功能,在kernel程序程序下載完成后,才可以下載application程序。AC48304有4個工作模式:內(nèi)核下載模式、程序下載模式、初始化模式、運行模式。其中運行模式有兩個狀態(tài):空閑狀態(tài)和激活狀態(tài),用戶只能在空閑狀態(tài)改變芯片的工作參數(shù)。
4. 軟件設(shè)計
4.1Linux中的驅(qū)動程序設(shè)計
操作系統(tǒng)采用的是嵌入式Linux操作系統(tǒng)。Linux具有效率高、內(nèi)核小的優(yōu)點,且開放源代碼,完全免費。在Linux操作系統(tǒng)下,應(yīng)用程序不能直接訪問硬件,盡管Linux在ARM平臺上有較完整的板級支持包,但在該系統(tǒng)的開發(fā)工作中仍然要完成部分設(shè)備的驅(qū)動程序設(shè)計,包括AC48304驅(qū)動程序、LE58QL021驅(qū)動程序、S-EEPROM驅(qū)動程序等。
設(shè)備驅(qū)動程序要為應(yīng)用軟件提供設(shè)備打開、關(guān)閉、設(shè)備控制及數(shù)據(jù)讀/寫等接口, 即一些類似于open、close、read和write的函數(shù),在主程序中直接采用文件讀寫的方式實現(xiàn)數(shù)據(jù)的收發(fā)。LE58QL021與ARM處理器之間采用MPI串行控制總線,MPI驅(qū)動接口結(jié)構(gòu)定義如下:
static file_operations mpi_ctl_fops = {
ioctl:mpi_ctl_ioctl, //設(shè)備控制
open:mpi_open, //打開設(shè)備
close:mpi
_ close, //關(guān)閉設(shè)備
}
linux提供ioremap函數(shù)將I/O內(nèi)存資源的物理地址映射到核心虛地址空間,然后可像操作寄存器那樣進行數(shù)據(jù)讀寫。編寫驅(qū)動程序的時候,必須提供兩個函數(shù),一個是module_init(),insmod在加載此模塊的時候自動調(diào)用,負責(zé)進行設(shè)備驅(qū)動程序的初始化工作,一個函數(shù)是module_exit,在模塊被卸載時調(diào)用,負責(zé)進行設(shè)備驅(qū)動程序的清除工作。
4.2 AC48304的數(shù)據(jù)讀寫實現(xiàn)
每個AC48304可同時進行4個通道的語音編/解碼,片內(nèi)有數(shù)據(jù)緩存區(qū),編碼后的語音數(shù)據(jù)先存儲在各通道的緩存區(qū),然后依次拷貝到輸出緩沖區(qū)。表1為本系統(tǒng)支持的幾種主要語音編碼格式的相關(guān)參數(shù)。其中G.711的A/u律數(shù)據(jù)量最大為64kbps,每個通道每秒有8000字節(jié)的數(shù)據(jù),而AC48304的數(shù)據(jù)讀取區(qū)的有效量為80字節(jié),即每秒鐘要進行100次的讀取操作,對每個AC48304而言每秒鐘要進行400次讀取操作才能保證數(shù)據(jù)及時讀取。由于語音編碼包是以恒定的速率產(chǎn)生的,因此每2.5毫秒必須對DSP進行一次讀取操作。本平臺的Linux內(nèi)核中,進
程調(diào)度算法的時間單位為10毫秒,在進程中執(zhí)行數(shù)據(jù)的讀取操作很難保證數(shù)據(jù)及時讀取,如果某個服務(wù)進程或者是本進程中的某個控制操作執(zhí)行時間過長,就會造成語音數(shù)據(jù)的丟失。
表1:語音數(shù)據(jù)特性
Linux中程序運行的環(huán)境分為內(nèi)核空間和用戶空間,內(nèi)核空間的程序優(yōu)先級高于用戶空間。為保證編碼數(shù)據(jù)被及時讀取,需在內(nèi)核級別的進程中定時讀取AC48304產(chǎn)生的數(shù)據(jù)。有兩種方式可將用戶程序加入到內(nèi)核空間中運行:修改Linux內(nèi)核源代碼,直接將用戶程序代碼編譯到內(nèi)核中;利用Linux的模塊機制,動態(tài)的將用戶程序代碼添加到內(nèi)核空間中運行。第一種方法實現(xiàn)難度比較大,而且容易出錯。第二種方法實現(xiàn)難度小,效果與第一種相同,本系統(tǒng)中采用的是第二種方法。
將AC48304的讀取操作作為驅(qū)動程序進行設(shè)計,使用insmod命令動態(tài)加載到內(nèi)核中去,在定時中斷的服務(wù)函數(shù)中讀取AC48304的數(shù)據(jù)。S3C2410中有5個用戶可編程的時鐘中斷,中斷優(yōu)先級別高,中斷的頻率可編程控制,其中時鐘中斷Timer3已用于DMA控制,Tmer4用于進程調(diào)度。本系統(tǒng)的程序設(shè)計中使用Timer2,通過配置相關(guān)控制寄存器將Timer2的中斷頻率設(shè)為500HZ,適當?shù)脑黾幼x取查詢操作頻率,保證數(shù)據(jù)及時讀取。中斷服務(wù)函數(shù)是由內(nèi)核來執(zhí)行的,優(yōu)先級高于用戶程序,可保證讀取操作的實時性。為AC48304的每個通道分配一個數(shù)據(jù)緩沖區(qū),定時中斷函數(shù)中讀取的數(shù)據(jù)先保存在緩沖區(qū)中,用戶程序通過讀取該緩沖區(qū)獲得語音數(shù)據(jù),這樣對外部用戶而言,語音數(shù)據(jù)沒有丟失,語音延遲在毫秒級別,完全可以滿足需求。
評論