<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è) > 嵌入式系統 > 設計應用 > 采用ARM9處理器S3C2410的數字多路語(yǔ)音記錄器設計

采用ARM9處理器S3C2410的數字多路語(yǔ)音記錄器設計

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

AC48304是一種專(zhuān)用的處理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è)通道的編/解碼,片內有數據緩存區,編碼后的數據先存儲在各通道的緩存區,然后依次拷貝到輸出緩沖區。表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的數據。中有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)足需求。


評論


相關(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>