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

Linux中程序運行的環(huán)境分為內核空間和用戶(hù)空間,內核空間的程序優(yōu)先級高于用戶(hù)空間。為保證編碼數據被及時(shí)讀取,需在內核級別的進(jìn)程中定時(shí)讀取AC48304產(chǎn)生的數據。有兩種方式可將用戶(hù)程序加入到內核空間中運行:修改Linux內核源代碼,直接將用戶(hù)程序代碼編譯到內核中;利用Linux的模塊機制,動(dòng)態(tài)的將用戶(hù)程序代碼添加到內核空間中運行。第一種方法實(shí)現難度比較大,而且容易出錯。第二種方法實(shí)現難度小,效果與第一種相同,本系統中采用的是第二種方法。
將AC48304的讀取操作作為驅動(dòng)程序進(jìn)行設計,使用insmod命令動(dòng)態(tài)加載到內核中去,在定時(shí)中斷的服務(wù)函數中讀取AC48304的數據。S3C2410中有5個(gè)用戶(hù)可編程的時(shí)鐘中斷,中斷優(yōu)先級別高,中斷的頻率可編程控制,其中時(shí)鐘中斷Timer3已用于DMA控制,Tmer4用于進(jìn)程調度。本系統的程序設計中使用Timer2,通過(guò)配置相關(guān)控制寄存器將Timer2的中斷頻率設為500HZ,適當的增加讀取查詢(xún)操作頻率,保證數據及時(shí)讀取。中斷服務(wù)函數是由內核來(lái)執行的,優(yōu)先級高于用戶(hù)程序,可保證讀取操作的實(shí)時(shí)性。為AC48304的每個(gè)通道分配一個(gè)數據緩沖區,定時(shí)中斷函數中讀取的數據先保存在緩沖區中,用戶(hù)程序通過(guò)讀取該緩沖區獲得語(yǔ)音數據,這樣對外部用戶(hù)而言,語(yǔ)音數據沒(méi)有丟失,語(yǔ)音延遲在毫秒級別,完全可以滿(mǎn)足需求。
評論