《嵌入式 - 语音识别TWen-ASR-ONE开发笔记》第3章 TWen-ASR-ONE 多线程和消息队列

article/2025/11/8 19:05:46

3.1 Scratch简介

在开始本章之前,需要介绍下TWen-ASR-ONE的用户开发语言-Scratch,Scratch是麻省理工学院开发的一款简易图形化编程工具主要是为青少年开发的一种编程工具,它图形化编程工具当中最广为人知的一种形式,所有人都可以在软件中创作自己的程序。

TWen-ASR-ON的开发者通过Scratch编程的方式将软件逻辑构建出来后,天问Block IDE再将其转换为C语言而已,只是不对开发者开放而已,Scratch很简单,你只有创意,只需在IDE上拉动模块,像搭积木的方式构建一个个逻辑块即可。对于笔者来说,我是不屑玩这个的,无奈官方不开发底层接口,关于Scratch我就不去细讲了,只要有编程基础的,一看就会,我觉得细讲是对大家的侮辱,因此,关于语言本身我是不会讲了。

官网地址

3.2多线程基础

TWen-ASR-ON的内部是基于FreeRTOS,因此,TWen-ASR-ON是可以使用多线程,关于线程,笔者本不想多讲的,毕竟能看到我的文章的人都是有一定的编程基础的,但笔者正在这里还是简单讲解吧。
我们想要做多件事情的时候,就需要创建多任务来并发执行,但需要注意的是,对于单核CPU而言:多线程就是一个CPU在来回的切换,在交替执行。对于多核CPU而言:多线程就是同时有多条执行路径在同时(并行)执行,每个核执行一个线程,多个核就有可能是一块同时执行的,对于TWen-ASR-ON来说,是一个单核,因此当你创建多个任务后,看着好像是多个任务在一起执行,其实是CPU在不断地切换任务,每个线程有自己的堆栈和局部变量,线程由CPU独立调度执行,所以说线程是程序执行时的最小单位

FreeRTOS 是一个抢占式的实时多任务系统, 那么其任务调度器也是抢占式的,运行过程如图所示:

在这里插入图片描述

在上图中,高优先级的任务可以打断低优先级任务的运行而取得 CPU 的使用权,这样就保证了那些紧急任务的运行。 这样我们就可以为那些对实时性要求高的任务设置一个很高的优先级,比如自动驾驶中的障碍物检测任务等。 高优先级的任务执行完成以后重新把 CPU 的使用权归还给低优先级的任务,这个就是抢占式多任务系统的基本原理。

3.3 TWen-ASR-ONE多线程实现

TWen-ASR-ON多线程实现很简单,通过天问Block IDE组合出相应的逻辑块即可。

在这里插入图片描述

可以看到多线程模块创建线程的逻辑块很少,主要是消息相关的,新建线程很简单,主需要将‘新建线程’代码块拖到工作区即可。

在这里插入图片描述

新建线程块之后,可根据实际需要修改线程名、优先级、内存小大和延时时间,接下来就是实现线程逻辑代码。

为了方便,笔者接下来就是用官方的范例。

在这里插入图片描述

该范例新建了两个线程,分别是蓝灯和绿灯每个一定时间不停地闪烁。其余的代码和上一章的一样。
最后编译下载运行效果如下:

在这里插入图片描述

字符代码如下:

#include "asr.h"
#include "setup.h"uint32_t snid;
void ASR_CODE();//{ID:250,keyword:"命令词",ASR:"最大音量",ASRTO:"音量调整到最大"}
//{ID:251,keyword:"命令词",ASR:"中等音量",ASRTO:"音量调整到中等"}
//{ID:252,keyword:"命令词",ASR:"最小音量",ASRTO:"音量调整到最小"}
void LED_1_app(){while (1) {digitalWrite(12,1);delay(700);digitalWrite(12,0);delay(700);}
vTaskDelete(NULL);
}
void LED_2_app(){while (1) {digitalWrite(14,1);delay(300);digitalWrite(14,0);delay(300);}
vTaskDelete(NULL);
}
/*描述该功能...
*/
void ASR_CODE(){switch (snid) {case 4:digitalWrite(13,1);break;case 6:digitalWrite(13,0);break;}
}void setup()
{//{speak:小蝶-清新女声,vol:10,speed:10}//{playid:10001,voice:欢迎使用智能管家,用智能管家唤醒我。}//{playid:10002,voice:我退下了,用智能管家唤醒我}//{ID:2,keyword:"唤醒词",ASR:"智能管家",ASRTO:"我在"}//{ID:4,keyword:"命令词",ASR:"打开红灯",ASRTO:"好的,马上打开红灯"}//{ID:6,keyword:"命令词",ASR:"关闭红灯",ASRTO:"好的,马上关闭红灯"}xTaskCreate(LED_1_app,"LED_1_app",128,NULL,4,NULL);xTaskCreate(LED_2_app,"LED_2_app",128,NULL,4,NULL);
}

字符代码可能看起来更清切写,是不是很简单。

3.4 TWen-ASR-ONE消息队列的使用

消息队列放到了线程的模块中,那么肯定是和线程有关的,所谓消息队列,其实就是一种常用于线程(任务)间通信的数据结构,TWEN-ASR ONE 与消息队列相关的逻辑块如下:

在这里插入图片描述

既然是一种数据结构,肯定就有新建,而消息队列是一种通信手段,那么就会有接收,有发送。

至于中断你唤醒消息,是在CPU休眠后,可通过该方式将其唤醒。

接下来还是通过实例讲解吧,还是使用官方的例子。

在这里插入图片描述

这里创建了两个消息队列和两个线程,当语言识别ID为4时,将ID值写入消息队列1中,如果消息队列中有消息,则将消息通串口输出,另外一个同理,关于串口在后面的内容讲解。

最后编译下载。效果如下:

我:智能管家
TWen-ASR-ONE:我在
我:打开红灯
TWen-ASR-ONE:好的,马上打开红灯

在这里插入图片描述

我:关闭红灯
TWen-ASR-ONE:好的,马上关闭红灯

在这里插入图片描述




欢迎访问我的网站

BruceOu的哔哩哔哩
BruceOu的主页
BruceOu的博客
BruceOu的CSDN博客
BruceOu的简书
BruceOu的知乎


欢迎订阅我的微信公众号

在这里插入图片描述


http://chatgpt.dhexx.cn/article/hNitpeWb.shtml

相关文章

Android导航语音识别——语音听写(嵌入式)

嵌入式项目之Android导航语音识别——语音听写 文章目录 系列文章目录前言一、原理流程图二、语音听写 1.初始化无ui识别听写2.设置识别监听器3.启动功能总结 前言 最近在学习嵌入式系统的一个功能——导航语音识别,该功能是基于Android和科大讯飞语音识别语音合成…

static的三个作用

static作用 一、修饰局部变量-静态局部变量二、修饰全局变量-静态全局变量三、修饰函数-静态函数四、总结和注意点 一、修饰局部变量-静态局部变量 static修饰局部变量时,改变了变量的生命周期,让静态局部变量出了作用域依然存在,到程序结束&…

java中的静态变量的作用域_详解JAVA中static的作用

1、深度总结 引用一位网友的话,说的非常好,如果别人问你static的作用;如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的;如果是说 可以构成 静态代码块,那别人认为你还可以; 如果你说可以构成 静态内部类, 那别人认为你不错;如果你说了静态导包,那别人认为你…

express.static 作用及用法

express相信是很多人用nodejs搭建服务器的首选框架,相关教程有很多,也教会了大家来如何使用。如果你想更深的了解他的细节,不妨和我一起来研究一下。 先来看一个每个人都用到的方法app.use(express.static(__dirname/public)); 你肯定在你的a…

java static的作用

static是什么 static是java中的关键字,static表示”全局”、“静态”的意思,用来修饰成员变量和成员方法,定义的变量,我们通常将用static修饰的成员称为静态变量,静态方法或者静态成员。 static的作用 被static修饰…

static的作用有哪些?

C语言中的static的作用有:1.修饰局部变量。2.修饰全局变量。3.修饰函数。 1.修饰局部变量。 如图: 当只用int 定义变量a时,此时程序运行结果为: 程序运行结果为10个2,这是为什么呢?? 原因是此时的变量a为…

C语言中 static作用

在C语言中,static的字面意思很容易把我们导入歧途,其实它的作用有三条。隐藏保持数据持久初始化为0 该图是下面文字的总结: 1.先来介绍它的第一条也是最重要的一条:隐藏。 当我们同时编译多个文件时,所有未加static前…

C语言中static作用

1,static修饰局部变量 在局部变量之前加上关键字static,局部变量就被定义成为一个局部静态变量。 特点如下: 1)存储区:由于栈变为静态存储区rw data,生存期为整个源程序,只能在定义该变量的函数内使用。退出该函…

对DSP的基本了解(一)--DSP是什么?

Preface:在学习一个新东西之前,我们需要对一些基本概念或者专业术语进行基本的理解,这样才能扫除壁垒,让学习更加高效。因此,DSP学习系列首先会比较注重对DSP相关术语上的理解。所以最开始,我们先来学习一些…

DSP学习

DSP数字电源学习一 软件环境搭建相关硬件资源TMS320C28x 32 位 CPU可编程控制律加速器 (CLA)片上存储器时钟和系统控制1.2V 内核、3.3V I/O 设计系统外设通信外设模拟系统 软件相关控制算法数据记录功能代码示例MathWorks Simulink 模型文档 由于最近工作需要,需要学…

DSP/BIOS详解入门

DSP/BIOS详解入门 百度百科DSPBIOS DSP/BIOS是TI公司特别为其TMS320C6000TM,TMS320C5000TM和TMS320C28xTM系列DSP平台所设计开发的一个尺寸可裁剪的实时多任务操作系统内核,是TI公司的Code Composer StudioTM开发工具的组成部分之一。 DSP/BIOS 实时操作…

DSP基础知识回顾

文章目录 1. 什么是DSP2. DSP与其他主流芯片的区别2.1 DSP与MCU的区别2.2 DSP与ARM的区别2.3 DSP与FPGA的区别 3. TI公司DSP具体型号的含义4. TMS320x2814的片内外设4.1 事件管理器4.2 模拟量转换为数字量的ADC采样模块4.3 串行通信接口SCI4.4 串行外围设备接口SPI4.5 局域网通…

DSP学习 -- 前言

已经换工作20天了,感觉又是换行业了一样。跳入DSP和FPGA的大坑了。 除了C语言基础还算可以,其他要学的东西太多了。 也是,终于可以又回到那种能学习和吸取新鲜知识的节奏了。相对来说虽然很累,但是我还是比较喜欢这种状态。总比吃…

最强ADI SHARC系列DSP:ADSP-SC589的开发入门详解

作者的话 ADI的SHARC系列DSP,现阶段最强的型号是SC589,那么我就以SC589为例,写一点资料,让新手能够比较便捷的熟悉开发环境,软硬件,顺利的进入开发。 文档解决的是入门的问题,所以不会深入去写…

嵌入式开发之DSP学习

一、ARM、DSP、FPGA ARM具有比较强的事务管理功能,可以用来跑界面以及应用程序等,其优势主要体现在控制方面;ARM是32位的单片机,其内部硬件资源的性能较高,可以加载操作系统成为其主要特点,有了操作系统&am…

[培训-DSP快速入门-2]:C54x DSP处理器的架构

作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing 本文网址:https://blog.csdn.net/HiWangWenBing/article/details/118889692 目录 1. C54x芯片的总体基本架构 1.1 冯诺依曼结构 1.2 哈佛结构 1.3 混合结构 1.4 C54x芯片结构 …

dsp基础算法

【小编】发现好文一篇,让大家对DSP中的基础算法和模型有一个初步的了解。 (转载请保留原文链接 http://www.techinads.com/archives/41authored by 江申_Johnson) 美国有一家很优秀的DSP公司–M6D(m6d.com)&#xff0c…

初学DSP(1)-TMS320F280049C入门

目录 前提 知识点 深入了解DSP和ARM的关系(相同与区别) DSP CMD学习笔记(连接物理存储和逻辑存储) CMD文件详解与DSP存储空间 DSP 程序远程升级 / Bootloader设计指南(一)—— 初识Bootloader/DSP引导…

【FPGA-DSP】第一期:DSP基础

目录 1. DSP基础 1.1 DSP基本概念 1.2 FPGA实现DSP的特点 2. DSP硬核的结构与使用 3. FPGA设计DSP技术 3.1. 浮点数与定点数的表示与转换 3.1.1. 双精度浮点数表示 3.1.2. 双精度浮点数与定点数的转换 本章作为FPGA数字信号处理的入门介绍课程,将介绍DSP的…

DSP基础知识

1.定义 数字信号处理器(英文:Digital Signal Processor)是集成电路芯片组成的用来完成数字信号处理任务的处理器。 2.功能 2.1ANR/ANC 其原理是降噪系统电路产生降噪MIC接收的外界环境噪音相等的反相信号,将噪声抵消。实现50-2K…