飛凌嵌入式乾貨分享丨如何在iMX8MQ 核心板上實現低功耗音訊播放
飛凌嵌入式FETMX8MQ-C核心板基於NXP i.MX8MQ處理器設計,該處理器擁有4個Cortex-A53處理器(工業級主頻最高為1.3GHz、商業級主頻最高為1.5GHz)+1個Cortex-M4處理器。本文將系統講解——如何在FETMX8MQ-C核心板上實現低功耗音訊播放。
01、低功率音訊應用概述
在這個應用中,i.MX8處理器A53核心會向M4核心傳送請求,然後休眠。M4核獨立播放或錄製音訊,操作完成後喚醒A53核。
五個軟體元件被建立來實現這個功能:
- Linux的Play和 record應用
- Linux RPMSG 字元裝置驅動
- Linux 遠端核心共享記憶體驅動程式
- FreeRTOS 音訊服務
低功率音訊程式
02、軟體設計
❶ RPMSG字元裝置驅動程式
i.MX8上,核心間使用RPMSG機制來進行訊息通訊。RPMSG是基於MU模組實現的。
❷ 遠端核心共享記憶體驅動程式
在低功耗音訊應用中,Linux需要建立一個非緩衝、非快取和連續的記憶體來儲存解碼的音訊資料。M4core只能處理這樣的記憶體空間。
此外,Linux需要獲得記憶體的實體地址並將其傳遞給M4核心。
通常,在Linux中,我們有兩種方法來建立這樣的記憶體空間。
- 使用DMA記憶體空間,這是使用CMA(連續記憶體分配器)。
- 在DTS檔案中預定義了一個保留的記憶體空間。
這裡我們建議使用DMA記憶體空間。它更靈活。我們不需要分配一個保留的記憶體空間,我們可以釋放分配的空間。同時,我們可以得到實際地址。
對於這種情況,函式dma_alloc_coherent()是一個理想的函式。
在此基礎上,我們建立了一個遠端核心共享記憶體驅動程式,它可以幫助使用者分配、讀寫DMA相干記憶體空間。
❸ AMP最佳化
預設情況下,當檢測到M4時,核心啟用所有模組的時鐘。所以SOC電流會很大。在i.mx8M上,電流大約是500毫安。
因此在核心中,我們需要啟用m4程式所需的時鐘,並對所有其他模組的時鐘進行使能。
❹ Linux低功率音訊應用程式設計
下圖表明低功耗播放音訊功能的模組間的關係
1. 低功耗播放程式
低功耗播放程式將解碼mp3檔案,並在M4核心上播放該檔案。
在本程式中,我們將:
- 解碼mp3音訊檔案。
- 複製解碼資料到共享記憶體空間。
- 將已分配緩衝區的實體地址傳送到M4核心。
- Linux休眠,等待喚醒訊號。
- 當播放結束時,MU中斷訊號喚醒Linux。
2.低功耗錄音程式
低功耗錄音程式將接收M4核心上的聲音,並在“A53”核心上儲存PCM原始資料。
程式將:
- 分配足夠的共享記憶體空間。
- 將已分配緩衝區的實體地址傳送到M4核心。
- Linux休眠,等待喚醒訊號。
- 當錄音完成時,MU中斷訊號喚醒Linux。
- 從共享記憶體空間獲得音訊資料並儲存到檔案。
3.Decode mp3音訊檔案
在這個程式中,我們使用gstreamer解碼mp3檔案到PCM原始資料。
4.複製解碼資料到共享記憶體空間
在這裡,我們將使用遠端核心共享記憶體驅動程式將PCM原始資料複製到一個連續的記憶體空間。
5.將已分配緩衝區的實體地址傳送到M4核心
使用RPMSG字元裝置傳送實體地址的緩衝區到M4核心。
這裡我們強調,通常,在一個核心和M4核心之間應該有一個協議。使用RPMSG字元裝置,可以在使用者空間中實現協議。例如,在低功耗播放程式中,為了訪問遠端M4核上的音訊裝置,我們建立了一個音訊請求和響應協議。
6. Linux 核心休眠
在Linux中進入掛起模式的命令是:
echomem > /sys/power/state
7. Linux 核心喚醒
在ATF補丁中,我們新增了MU中斷作為喚醒源。當Linux核心從M4核得到MU中斷時,它將被喚醒。
03、執行低功率音訊的程式示例
本章介紹了執行低功率音訊的程式示例
❶ ATF 低功耗補丁
ATF實現了功率狀態協調介面(PowerState Coordination Interface, PSCI),並具有低功耗的特性。
在預設BSP發行版的Linux核心中,它將會使Cortex-A53核心和Cortex-M4核心同時處於掛起模式。因此ATF需要一個補丁來配合低功耗應用。
ATF補丁將阻止DDR進入retention模式,並且不禁用PLLs
❷ 重新編譯核心和驅動
在核心中,加上RPMSG字元裝置驅動程式和遠端核心共享記憶體驅動程式的補丁。
❸ 編譯低功耗音訊應用
編譯低功耗音訊應用
❹ 編譯Cortex-M4核應用
Cortex-M4應用是由IAR開發的,IAR並開啟音訊伺服器示例並編譯。
❺ 準備好測試環境
連線好A核和M4核除錯串列埠
❻ 啟動uboot執行M4核音訊服務程式
在M4核除錯串列埠可以看到
❼ 執行低功耗音訊應用
當音訊服務在M4核心上執行時,在u-boot中引導核心。
安裝RPMSG字元裝置和遠端核心共享記憶體驅動程式。
執行./lp_play./ xxxxx .mp3啟動低功耗播放。
執行./lp_play./ xxxxx .mp3啟動低功耗播放。除錯資訊:
除錯資訊:
解碼
播放並睡眠
喚醒
執行./lp_record啟動低功耗錄音。錄音的資料將儲存為audio_rect.tmp。
04、時間消耗
在低功率音訊解決方案中,資料在A53核解碼,然後M4核播放。在核之間的協議通訊中有一些時間損失。我們試著計算一下這個解的時間損失。
在這個例子中,我們將以兩種方式播放48kbps,22050 Hz的steromp3檔案,A53核直接播放和M4核透過RPMSG播放。將比較從使用gstreamer開啟檔案到播放的持續時間。僅對播放進行測試,使用者可以根據回放情況對錄音進行評估。
由於低功耗音訊播放將做額外的操作,如解碼mp3到檔案,分配CMA緩衝區,將音訊資料從檔案到緩衝區,然後從緩衝區到CMA緩衝區,需要一些額外的時間,大約350毫秒。
可以對低功耗播放的其他操作進行一些最佳化,比如在GST解碼中使用appsync,它將把mp3資料直接解碼到緩衝區中,透過這種方式,額外的時間可以減半。
05、功耗測試
本章對使用或不使用低功率音訊比較了功耗。僅對播放進行測試,使用者可以根據播放情況對錄音進行評估。
正常播放
低功耗音訊播放
注:本文來自NXP提供的ApplicationsNote AN1219
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69989429/viewspace-2741187/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- ReactNative乾貨分享——視訊播放器AppReact播放器APP
- 基於飛凌FETA40i-C核心板實現的呼吸機解決方案
- 飛凌嵌入式i.MX6UL核心板引腳功能複用表使用說明
- 基於飛凌i.MX 8M Plus核心板實現的商用車智慧駕駛終端
- 乾貨丨遊戲音訊與聲音設計相關書籍推薦遊戲音訊
- 基於飛凌i.MX8M Mini核心板的加油機方案
- 乾貨丨windows核心www漏洞利用手法Windows
- 飛凌基於瑞薩 RZ G2L的核心板今日正式釋出
- 乾貨分享|使用 Istio 實現灰度釋出
- 帶你用AVPlayer實現音訊和視訊播放音訊
- 乾貨丨RK3399開發板android系統下實現影像識別Android
- 乾貨分享:Air780E開發板如何使用?AI
- 飛凌工程師分享全志A40i系列開發板常用小知識工程師
- HTML5 實現的音樂播放器分享HTML播放器
- 播放SD卡上全部音訊檔案SD卡音訊
- AI客服上線 乾貨 乾貨 全是乾貨!AI
- imx8mq開發板如何在SPI匯流排上新增裝置MQ
- 分享乾貨啦!
- iMX8MP 測評|飛凌FETMX8MP-C核心板多媒體功能測評
- 上乾貨!大廠面試走心經驗分享!面試
- 乾貨分享!JAVA診斷工具Arthas在Rainbond上實踐~JavaAI
- (乾貨)Ai音響和Linux音訊驅動小談AILinux音訊
- 嵌入式ARM核心板介紹
- 飛凌搭載TI AM62x的ARM核心板/開發板首發上市,亮相Embedded World 2022
- 視音訊播放音訊
- 如何在小程式上增加音視訊?
- SSLO如何實現會話保持?技術乾貨線上分享會話
- 純乾貨分享: 如何在 React 框架中使用SpreadJSReact框架JS
- 賦能安防監控|嵌入式ARM核心板實現的NVR方案VR
- H5頁面實現滑動控制音訊播放H5音訊
- 11.QT-ffmpeg+QAudioOutput實現音訊播放器QT音訊播放器
- DM6446的音訊編解碼及播放實現音訊
- iOS開發:音訊播放、錄音、視訊播放、拍照、視訊錄製iOS音訊
- Asp.Net音訊檔案上傳和播放ASP.NET音訊
- vue2.x 音訊播放器 使用element ui + Audio實現一款完整的音訊播放器Vue音訊播放器UI
- 乾貨分享 | 3個Zbrush實用減面工具分享ZBrush
- 讓Elasticsearch飛起來!——效能優化實踐乾貨Elasticsearch優化
- 讓 Elasticsearch 飛起來!——效能優化實踐乾貨Elasticsearch優化