天天看點

在RDA上使用mbed編譯運作KWS

喚醒程式在多平台的運作調試總結

喚醒的本質在于關鍵字識别(keyword spotting),即kws。我們的工作基于GitHub上的kws開源項目。

首先進入網址https://github.com/ARM-software/ML-KWS-for-MCU/tree/master/Deployment,上面給出了在基于arm的開發闆上運作kws的詳細指導及源碼,進入example目錄可以看到,源碼分為兩個例程,分别為simple_test和realtime_test,二者都是kws程式,差別在于在第一個程式中,KWS是在通過.h檔案提供的音頻資料上運作的;後一個程式則是實時kws。

工作的第一步:編譯

程式使用mbed進行編譯,什麼是mbed?

簡而言之,mbed就是一個開發平台,一個面向ARM處理器的原型開發平台,它具體包括免費的軟體庫(SDK),硬體參考設計(HDK)和線上工具(Web)三部分内容,各個部分的具體介紹如下:

SDK:mbed設計了一個硬體抽象層,進而屏蔽了不同mcu廠商提供了微處理之間的差異,對于使用者來說,他隻需要和這個硬體抽象層打交道即可,也就是說,使用者基于mbed開發的應用可以很友善地更換使用不同廠商的arm微處理器,進而留給使用者更多的選擇。

HDK:HDK是mbed提供的硬體參考設計,它是面向使用者開發設計的,是以HDK提供了統一了程式上載接口,單步調試接口,序列槽調試接口,使用者無需購買其它硬體就可以開始軟體開發工作。

WEB:為了省去使用者開發環境安裝的麻煩,mbed提供了一個完備的基于浏覽器的微處理器軟體開發環境,包括代碼編寫,程式編譯,版本控制等功能,使用者隻要上網就可以開發,編譯結果隻要下載下傳儲存到mbed開發闆上即可工作,非常友善。

對于沒接觸過mbed的同學來說,聽了這些,依然困惑,但是我們隐約感到,就和我們寫java前需要安裝jdk和eclipse,寫C語言需要安裝vcc一樣,反正看樣子想幹什麼總得先整個環境出來,來誰的地盤就得遵守誰的規則。同樣的,使用mbed也得先安裝相關環境,so,怎麼裝?裝什麼?

進入網址https://github.com/ARMmbed/mbed-cli,上面的第一個短視訊就是安裝教程。如果不想看視訊,也可以登入mbed官網,一樣有指導,走一遍:

1:點開get started

在RDA上使用mbed編譯運作KWS

2:tutorials

在RDA上使用mbed編譯運作KWS

3:next

在RDA上使用mbed編譯運作KWS

4:mbed提供兩種編譯方式,線上和離線,選擇離線方式

在RDA上使用mbed編譯運作KWS

5: ARM mbedCLI的安裝過程取決于您的作業系統。請選擇您的主機作業系統。每個作業系統的安裝說明将引導您了解如何在本地安裝mbedCLI。選擇windows

在RDA上使用mbed編譯運作KWS

依次下載下傳安裝Mbed CLI,Python, Pip,GNU Arm Embedded version 6,另需安裝兩款版本管理工具git和mercurial即可,至此環境搭建完成。

下面編譯過程:

1:下載下傳github上的工程;

2:進入網址https://github.com/ARM-software/CMSIS_5.git下載下傳CMSIS-5庫;

什麼是cmsis庫呢?

ARM® Cortex™ 微控制器軟體接口标準 (CMSIS) 是 Cortex-M 處理器系列的與供應商無關的硬體抽象層。CMSIS 可實作與處理器和外設之間的一緻且簡單的軟體接口,進而簡化軟體的重用,縮短微控制器開發人員新手的學習過程,并縮短新裝置的上市時間。

軟體的建立是嵌入式産品行業的一個主要成本因素。通過跨所有 Cortex-M 晶片供應商産品将軟體接口标準化(尤其是在建立新項目或将現有軟體遷移到新裝置時),可以大大降低成本。

我們知道,不同廠家,比如FSL,ST,Energy Micro等不同廠家的核心都是使用Cortex M,但是這些MCU的外設卻大相徑庭,外設的設計、接口、寄存器等都不一樣,是以,一個能夠非常熟練使用STM32軟體程式設計的工程師很難快速地上手開發一款他不熟悉的,盡管是Cortex M核心的晶片。而CMSIS的目的是讓不同廠家的Cortex M的MCU至少在核心層次上能夠做到一定的一緻性,提高軟體移植的效率。

CMSIS的結構,CMSIS 包含以下元件:

CMSIS-CORE:提供與 Cortex-M0、Cortex-M3、Cortex-M4、SC000 和 SC300 處理器與外圍寄存器之間的接口

CMSIS-DSP:包含以定點(分數 q7、q15、q31)和單精度浮點(32 位)實作的 60 多種函數的 DSP 庫

CMSIS-RTOS API:用于線程控制、資源和時間管理的實時作業系統的标準化程式設計接口

CMSIS-SVD:包含完整微控制器系統(包括外設)的程式員視圖的系統視圖描述 XML 檔案

簡言之,cmsis屏蔽底層硬體,開發者隻需要指定具體開發闆型号即可。

3:運作指令mbed deploy,此指令進行mbed部署,下載下傳工程需要的mbed庫,如果本地已經有了mbed檔案包,略過此步;

4:運作形如mbed compile -m NUCLEO_F411RE -t GCC_ARM –source . \

–source ../Source/KWS –source ../Source/NN –source ../Source/MFCC \

–source ../Source/local_NN –source ../Examples/simple_test \

–source ../CMSIS_5/CMSIS/NN/Include –source ../CMSIS_5/CMSIS/NN/Source \

–source ../CMSIS_5/CMSIS/DSP/Include –source ../CMSIS_5/CMSIS/DSP/Source \

–source ../CMSIS_5/CMSIS/Core/Include \

-c -v

的指令,mbed compile為編譯指令,-m指定開發闆型号,如後續的rda晶片對應的闆子型号為UNO_91H,-t指定編譯器,我們使用的為arm編譯器GCC_ARM,–source指定需要編譯的目錄,如–source ../Source/KWS即指定編譯上層目錄的Source檔案夾下的KWS檔案夾,其餘類同,-c意為編譯前擦除以前編譯痕迹(我們知道,每次編譯都會生成個BUILD檔案夾),-v意為編譯時顯示詳細資訊。

至此編譯完成。

在rda上實作喚醒程式:

由于之前曾使用mbed編譯rda程式,是以适用于rda的mbed os可以拿來使用。

1:建立檔案夾,拷貝mbed os到此目錄下:

2:拷貝Source檔案夾;

此檔案夾中包含MFCC,KWS,NN等,是喚醒的具體實作函數,mfcc特征提取,kws推斷等等,至關重要

3:拷貝CMSIS-5檔案夾;

雖然mbed os中已有cmsis檔案夾,但此程式需要用到CMSIS-5中的部分檔案mbed os中沒有,且二者目錄結構不同整合可能繁瑣,于是二者都保留

4: 拷貝喚醒主程式到此目錄下;

5:運作編譯指令(類似這樣,source參數後的目錄視具體情況而定)

mbed compile -t ARM -m UNO_91H –source simple_test –source Source/KWS –source Source/NN –source Source/MFCC –source Source/local_NN –source CMSIS_5/CMSIS/NN/Include –source CMSIS_5/CMSIS/NN/Source –source CMSIS_5/CMSIS/DSP/Include –source CMSIS_5/CMSIS/DSP/Source –source CMSIS_5/CMSIS/Core/Include –source mbed-os -DRDA_SMART_CONFIG -c -v

即可

6:将編譯後的.bin檔案下載下傳到rda闆子上即可運作

使用與rda配套的下載下傳軟體flashtest下載下傳,下載下傳前需要用别針捅一下闆上的孔reset方可,而後通過序列槽調試助手就可以看到程式運作結果,實時喚醒也可以将喚醒結果列印到序列槽顯示。

以上為在rda上編譯運作喚醒程式的全過程。

當然難點在于正确編譯,編譯過程中會遇到各種error,筆者就曾經遇到,大多是由于移植産生的檔案或者函數沖突,由于此文檔為事後撰寫,調試過程中的具體問題難以重制,見諒!

在stm32f7上實作喚醒程式

選用闆子型号為DISCO_F746NG,編譯過程如前所述,也可參考github上的指導

在RDA上使用mbed編譯運作KWS

在efm32上運作喚醒程式

我們知道,支援mbed的開發闆有多種,EFM32GG_STK3700就是其一,EFM32GG_STK3700基于EFM32GG990F1024晶片,cotex—m3核心,我們的闆子使用的是EFM32GG330F1024晶片,使用mbed編譯時目标闆型号最相近隻能選擇EFM32GG_STK370,

繼續閱讀