唤醒程序在多平台的运行调试总结
唤醒的本质在于关键字识别(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
2:tutorials
3:next
4:mbed提供两种编译方式,在线和离线,选择离线方式
5: ARM mbedCLI的安装过程取决于您的操作系统。请选择您的主机操作系统。每个操作系统的安装说明将引导您了解如何在本地安装mbedCLI。选择windows
依次下载安装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上的指导
在efm32上运行唤醒程序
我们知道,支持mbed的开发板有多种,EFM32GG_STK3700就是其一,EFM32GG_STK3700基于EFM32GG990F1024芯片,cotex—m3内核,我们的板子使用的是EFM32GG330F1024芯片,使用mbed编译时目标板型号最相近只能选择EFM32GG_STK370,