找回密码
 注册
关于网站域名变更的通知
查看: 614|回复: 3
打印 上一主题 下一主题

TWEN-ASR ONE 语音识别系列教程(4)---多线程与消息队列使用

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-7-2 16:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 Heaven_1 于 2021-7-2 17:22 编辑
8 [0 y) i+ V8 O2 D# U6 B+ R$ p) n( t% H, A! |
TWEN-ASR ONE 语音识别系列教程(4)—多线程与消息队列使用1 t6 [; O9 h5 }0 Z5 z5 b
提示:作者使用 TWEN-ASR ONE V1.0开发板进行开发学习。: ~+ i  v+ y( f2 F
7 V- y4 N5 B3 ~6 A1 _/ Q
文章目录
3 C  W3 P, F( v2 `& t0 k前言8 m) G! u: Y: `  @$ f2 p  j
一、多线程的使用与测试
# B) V- I7 K7 l2 c& M1.1线程使用说明
2 X1 ]+ @4 ?( k) S# u8 H4 Z1.2线程代码编写
8 z* N) [4 @8 F4 X2 C5 Y7 ^) }1.3线程代码分析, h; c  ]: Z) t6 K
1.4线程运行测试2 Y+ ]/ i8 X9 `& V
二、消息队列的使用与测试0 E& n5 I' R2 T& Y# U( J
2.1消息队列使用说明1 I8 y4 D# u# ]+ ~: \( a; g& ~5 s; i
2.2消息队列代码编写
" _1 n! Z* d) V* _2.3消息队列代码分析
; P2 O7 M% @+ v0 u$ R; }2.4消息队列运行测试
; l: T5 S( |/ E- P% i三、总结
: c" Q) P) N  B前言
" N( q% D& D, }+ W* l# d- Y8 D3 I    经过前面的学习,对ASR程序结构有一定的了解。前面有些代码已经使用了线程,可见线程在ASR程序设计里面的重要性。不禁心里会有些疑问,线程工作原理是什么?多线程谁会先执行?多线程之间是否可以进行信息交换?信息交换是不是队列消息?带着这些问题,在本文尝试找到答案。本文主要内容有:! |% I" V" @8 S2 _6 H% m* c/ I

0 r" f% g3 l# T" ]) B7 z1 ?线程的原理与应用;
! O: M/ k0 b5 [2 e5 U队列消息的原理与应用。
6 W) H) T+ S8 Q( g一、多线程的使用与测试
5 P- v- z0 O: X; V# h6 `  {; L1.1线程使用说明
" w$ _9 X- @# e: }2 {9 R& T% S     线程是独立调度和分派的基本单位,是操作系统能够进行运算调度的最小单位。线程和线程之间互不干扰。把需要执行的任务,放在线程块里面,如下图所示:& \6 S5 V+ s& R0 T# _3 \

" m5 u: a' [+ G, I' {# u5 B, U( l$ E; p8 C
图1.1 新建线程程序块1 P" j. a) T% B4 s/ A
线程名称、优先级、占用内存是新建线程时需要设置的。线程名称建议用有含义的字符名称,如该线程执行的功能名称。优先级就是执行线程的起始顺序,在很短的时间里,线程执行的顺序,我们人感受不到,因为操作系统有调度。占用内存可根据程序内容进行设置,建议设置128字节以上。线程里一般是重复执行的程序块,重复的程序块里一般放有延时函数。为了线程执行更顺畅。" N9 z3 v! r1 B
     多线程的建立。如下图所示,有两个线程,线程的程序是独立的。9 Z  r3 S& M" s/ M
4 ]% \6 Q& M. x3 ~* U
, K- H  g3 e: O- s
图1.2 多线程示意图% K) N1 o: F2 T5 F9 L/ c
多线程的工作原理:线程执行通过系统的调度完成的。系统有一个时间Tick,时间Tick到切换任务,优先级高的先执行,任务不断切换如此重复执行。例如:图1.2任务A和任务B(除了任务A和任务B,其他任务忽略)。任务A开始执行(因为优先级高),时间Tick到,调用任务B,任务B开始执行。时间Tick到,调用任务A,任务A接着刚才执行,时间Tick到,调用任务B,任务B接着刚才执行。如此类推。由于时间Tick很短,人会觉得两个任务同时执行。这就是多线程的工作原理,也是系统调度最简单的过程。任务调度的过程可参考下面两张图[1]。多线程调度(1)(2)。
% B  _" u: n- x0 y- _: V0 R; E
& J: C) w# a' F$ Z$ a' S2 g" y
1 d! n4 H: {; Q0 e9 a图1.3 多线程调度(1)示意图  t5 D! D: B  T0 e/ a# E

9 |# L6 f8 L2 ^1 N( s/ l2 K
1 d& J: M! f! E7 g! G" Y9 a8 V图1.4 多线程调度(2)示意图
. S0 D5 k% n2 v3 Z: L' A7 }总之,多线程是独立运行的。可以完成各自的任务。9 U  O, Z( [! g  n8 N

1 b  a/ M% q/ B. i1 R1.2线程代码编写
# t! x  r( ^. A7 u3 V
    本文多线程使用程序参考官方【5.多线程使用–LED演示范例】。 程序主要是实现蓝灯和绿灯不同频率闪烁,变化时间分别是700毫秒,300毫秒。
/ m/ U. n( ^+ k# V& o" e
2 F0 ~' c% k) ~( y# F  p
( q! n; y7 h2 r3 [图1.5 多线程使用示例程序9 y: {" {7 t! t- Z: N6 u
1.3线程代码分析, w, N: v6 v' F$ D0 ~
    设置了不同的线程名称,优先级一样,占用内容为128字节。如果优先级设置不一样跟容易理解。- K" [0 O, H8 e5 z
* v' E8 [8 I3 b

8 A! f! I8 u3 h! o; W1 |2 F& Q
* k) P# l) y- a  x- |& u: ?/ Y
图1.6 多线程使用示例程序的注释
# ^2 \* P0 ]! B1.4线程运行测试
4 d* v/ q: R% v2 y! |     蓝灯和绿灯闪烁的节奏不一样,如下图所示。从实验现象我们可以看出,两个线程的程序都在运行,并且互不干扰。
4 {" p5 b2 e; u8 Q
. p3 ?* V# ?$ }2 ?: x2 l# Y  {2 ?2 t+ y& i: f2 T$ |6 O2 w, z
2 |4 P" x) w* I, u' x
二、消息队列的使用与测试
; g: M1 b9 G( t  {4 t* f; Y8 }2.1消息队列使用说明+ H9 F" _; t4 Z6 i; q4 B+ ]
     消息队列是一种常用于任务间通信的数据结构,队列可以在任务与任务间、中断和任务间传送信息,实现了任务接收来自其他任务或中断的不固定长度的消息。任务能够从队列里面读取消息,当队列中的消息是空时,挂起读取任务,用户还可以指定挂起的任务时间;当队列中有新消息时,挂起的读取任务被唤醒并处理新消息,消息队列是一种异步的通信方式[2]。
# B3 M6 @' E# z+ k9 L     TWEN-ASR ONE 可用程序块有4个,如下图所指示。* q4 j1 A4 L3 D. @' B1 E- W

, h" P9 _* R# V- m
3 g3 r5 ]4 w/ h/ p! N$ E' o图2.1 消息列队相关程序块
* d2 y# J) ?- x: o(1)新建队列消息,可以设置消息长度、队列最多消息数。队列最多消息数默认为5,也就是当消息数为5时,不会再存数据。! e% U6 q, w; w' @$ u) |6 U
(2)发送消息。发送var变量的值。等待时间是当消息数满,是否继续等待,不等待设为0,需要等待根据实际情况设置时间。2 c1 f4 D3 J6 m1 _7 g
(3)接收消息。接收var变量的值。: U4 _1 j( o/ u7 ~6 f# _5 N; Q
(4)中断内发送消息。是否在中断中使用?(作者现在也不是很理解,后续弄明白更新此处)6 Z& ^, m; s* e) M" Y5 C+ ?. Q8 {) x$ Y
3 n: K# J, ?6 Z; p2 u* [' }6 e% \
2.2消息队列代码编写' B. c6 {, L# h/ T; t
    本文消息队列使用程序参考官方【7.多线程使用–消息队列】。 程序主要是实现语音识别后,通过队列消息相关块,根据不同语音ID发送消息到不同线程,线程通过串口打印出来语音ID。。. r# N$ b8 f8 @6 D

6 S8 S4 a% [5 G: p( B1 V+ y. \& C' L 5 T) d$ W7 a; D
图2.2 消息列队示例程序+ z6 Z: I- y2 n" A: f' D2 z6 J
2.3消息队列代码分析
. Q; R' M: D' Y) Q6 o     关键注释如下图所示:
4 z1 d$ v" }7 {7 p/ |$ v
/ I. a, u, g8 U( ]' y) _- k7 T  j: W7 m( ]6 |- o8 z! l
图2.3 消息列队示例程序的注释
5 X! j& s7 s1 E- K" d& z2.4消息队列运行测试
# Z4 K7 i) u8 O& \    运行测试结果如下:' N( [- I, s' z9 H% N" Y/ K9 ~
/ L* R% ]  {" ]% j. {5 C& e
我:智能管家
& o9 J. v+ ~6 _$ \9 ]
; X% {$ s5 {# R& w. U, W: w! gASR:我在; w4 o  g% t8 U! ^: z8 d6 P- {0 `" G

/ }& X4 u' Y9 h; D3 j我:打开红灯
! H- d& C) O' J; a
+ T& |. `, l: o' R6 l* vASR:好的,马上打开红灯
" x" A2 ~. ?  P: Q4 c; E $ J6 T9 j" ^  T" W

' F( s: {( {# N1 d9 f. c3 n- ~3 d; N2 y" N5 z  c/ G- L
图2.4 打开红灯板子实验现象
1 C5 A# S$ T" f. Q4 c/ x  l此时串口收到4。
2 z+ g# `5 D: f5 Z4 E/ Z  z
. x" J6 E% p. b- j' c9 o( k
$ A: M. W. O5 ~2 V2 D' p* H图2.5 串口收到数据现象( J2 {$ |8 r! x; I6 W7 `/ m- P$ _
我:关闭红灯
& c' \4 z6 R6 i/ ~; n4 P5 ^7 n! r$ W# E+ Z% Q) H

6 K9 i# ~8 U6 H: a+ i) nASR:好的,马上关闭红灯
5 F+ Y9 ^% c+ f9 a$ d
! {" Q/ t; q/ d& K9 {6 ?% H+ F- R! c" B* }% }4 B4 S

/ A7 j/ m+ Q$ w' ?图2.6 关闭红灯板子实验现象
7 y$ |) j% b! ]. \' }1 `此时串口收到6。如图2.5 串口收到数据现象所示。& x7 _0 p( R, a( f6 I
    从测试的实验现象可以看出,打开红灯和关闭红灯会发送消息队列,通过消息队列,不同线程间可以相互共享数据。2 P/ Y6 P4 V) ?9 q9 s+ n& i

* E/ U; v* e5 o9 G3 e三、总结
, _3 N' V* j, \( F" r: C  U    多线程与消息队列在嵌入式操作系统中是很常用的知识。本文简单介绍了多线程与消息队列的使用,在天问Block里面有对应的程序块提供使用,当然我们在弄清楚多线程优先级、消息列队如何共享消息后,可以很好帮助我们的使用。
* n9 F- O9 V  f8 U2 T6 ~  w" D
& a* G. `! Q* q4 S0 E* R3 J+ K  ]- m/ o4 @( h$ R
1 }) |$ p& `! T' e* w1 ]
' Y6 R* u! ]- w

该用户从未签到

2#
发表于 2021-7-2 18:37 | 只看该作者
多线程与消息队列在嵌入式操作系统中是很常用的知识
3 W* i) @: [0 b6 _: W5 B3 d" Y
  • TA的每日心情

    2019-11-20 15:01
  • 签到天数: 1 天

    [LV.1]初来乍到

    3#
    发表于 2021-7-2 18:52 | 只看该作者
    ARM是多线程,需要用操作系统

    该用户从未签到

    4#
     楼主| 发表于 2021-7-5 17:13 | 只看该作者
    谢谢大家浏览,大家有问题可以进QQ技术群1138055784交流哦,现在在做抽奖活动,最高奖1000元现金
    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    关闭

    推荐内容上一条 /1 下一条

    EDA365公众号

    关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

    GMT+8, 2025-10-6 15:07 , Processed in 0.125000 second(s), 23 queries , Gzip On.

    深圳市墨知创新科技有限公司

    地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

    快速回复 返回顶部 返回列表