你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32超低功耗平台上的RTOS培训 -- 实验3 消息队列

[复制链接]
TLLED 发布时间:2018-4-18 21:43
本帖最后由 TLLED 于 2018-4-18 21:42 编辑 9 |4 T+ u8 r/ v7 H
0 h* C# @  j9 d& [, `; M; V* l
    队列是主要的任务间通讯方式。消息队列就是通过 RTOS 内核提供的服务,任务或中断程序可以将一个消息放入到队列。同样,一个或者多个任务可以通过 RTOS 内核服务从队列中得到消息。通过这个方式实现任务之间的数据传递。; T& |1 H6 F1 \& K
    程序任务框图:                下图是本次程序实现任务之间消息队列传递数据的框图
6 @+ g. m8 v4 @7 t, l* w
& e  h& g/ n' ?& `
    1.png
3 r* r6 p( p$ ?# s9 i, T    程序执行条件:8 K" D) o4 H5 N; k% a
    > 创建消息队列:" P  ?0 D8 [8 e
        通过调用 xQueueCreate()函数来创建消息队列。- [4 L: k& Y1 c! X% g7 U, \
    > 任务创建:
- \! G1 D) p" i1 ^        > 任务1:vAppStartTask 实现LED等闪烁,和消息队列无关联。
  w) g( ~5 z0 j. A: R        > 任务2:vAppQueueProducer 实现 向消息队列放数据。
4 E% J0 ^/ Y1 V' ]        > 任务3:vAppQueueConsumer 实现  从消息队列取数据。
6 l3 w  f, C# }* l0 ~
( s. ]3 O; ]' A' d3 k# p% K* R
    消息队列相关API函数:' }! Y& |7 M0 A) [) t& o* ]- @
    > 函数: xQueueCreate) O% B. v" f7 B6 }
        函数原型:
) _' K5 V/ ]4 T# d; Y       1.png    
, q; q0 r( f0 K: a: C        函数描述:        
7 I! [; O. M- C- E* b( @        #函数 xQueueCreate 用于创建消息队列        & B+ \& a; s7 S+ P, V/ ?/ r
        #第一个参数是消息队列的个数        
- {4 x! W$ Q" k& a        #第二个参数是每个消息的大小,单位是字节。        ! ]* F! t1 S2 X
        #返回值:如果创建成功则返回队列的句柄,如果返回NULL,则表示没有足够的堆空间来分配,队列创建失败;         
       
& h* l) N6 U4 q, c; n    > 函数:xQueueSend
+ f& A, O5 r: R4 b& T) w: _" j) f- Q        函数原型:% s8 l+ Y! ^0 w4 J
         1.png : c1 T% _6 w# d7 f' W
        函数描述:        
. D% g- f- R" [2 M  ?9 M, f        #函数 xQueueSend用于消息发送。        7 r. U; U! d4 R4 y* M6 W
        #第一个参数是消息队列句柄
+ c* d. R! c" ]- l6 G        #第二个参数是要传递数据地址,每次发送都是将消息队列创建函数xQueueCreate所指定的单个消息大小复制到消息队列空间中。        
* Z! r$ ~# P# D% l        #返回,若消息队列创建成功会返回消息队列的句柄。8 v0 g3 s+ a4 O
    > 函数:xQueueReceive* Y9 @! Y! t7 x
        函数原型:
" C7 z) w0 F/ S1 B! L% A         1.png ( k* }$ }9 Q3 {/ I0 \% y8 @
        函数描述:        
* d' s$ Z7 p- S: }2 |" M+ ^3 X! P        #函数 xQueueReceive用于接收消息队列中的数据。        
/ g: p0 n! A* @& l3 t. D        #第一个参数是消息队列句柄。5 z2 Y" E6 V$ }) s( ~0 T
        #第二个参数是数据缓冲区指针,用来保存从队列读取出来的数据;
( I. L. H6 N# E0 F( j, c! m  g        #第三个参数是阻塞超时时间,如果写入队列时,队列已满,那么这个时间就是任务处于阻塞状态等待队列空间有效的最长等待时间,使用时经常利用portTICK_RATE_MS转换为ms;- S$ n3 z9 d) x9 I/ L# K" k
        # 返回值:
         
, L! b0 J! \$ \- S' ?. H$ R! b6 ]8 i4 t
          1. pdPASS:表示数据成功写入队列,返回值为pdPASS; ; z& K7 t7 V4 j9 S6 j8 N8 A
          2. errQUEUE_EMPTY:表示队列已空,无法读出数据;

- M) ^) v" Z$ X6 G
! o, `" y4 u( J

  m2 \- Y$ D1 M6 T3 s    程序代码截图:        $ S- @( ]8 S' j- s0 ]* o4 j
        创建消息队列,创建3个任务。6 I- z4 W' _0 z* d
         5.jpg 4 ]8 s8 M6 c+ O. Z) Y" X; u
        任务1函数:vAppStartTask 实现LED等闪烁,和消息队列无关联。
6 K0 v) j+ I/ E) P' Q8 Z! {
         4.jpg 3 @! x7 r' m1 e- w0 d3 K
        任务2函数:vAppQueueProducer 实现 将变量ProducerValue的值放入向消息队列。
6 h/ q0 D+ `2 ~$ s         3.jpg 8 q" G, Q; d" ~0 H. @8 D0 s
        任务3函数:vAppQueueConsumer 实现  从消息队列取数据并串口打印。
% }6 }: ~( l; N; G; I# N/ F! y         2.jpg
) ?2 M% q5 ^, o( t6 ?( S; W1 F

. j- S! b# g" r( C; x( ?        程序执行结果:
0 A# ~& r/ P: Z6 p0 ]        任务三不断输出从任务2放入消息队列的数据。
  ~% K$ C7 c& W& |* y& X" h5 r         5.jpg
/ q5 w5 B5 n9 ]' J9 H/ i7 l; ]
1 u4 L) K# |- ]6 D$ p4 M        
! `; S& ]0 n" D6 d2 y/ ~3 O      
9 F: _* P" N. M
* j( l8 W" ]* t7 i, F; m2 `
  i# p" G- V- h/ y1 q$ p

9 D  v+ K; r* {! P, J' F) o
% l; P2 l, H2 h' C+ a0 L0 p

/ X4 f: A: G% t4 l0 o/ `( ^
/ l; l4 J( W- j0 Z* M$ Y
& w& C) E+ ~  }! k" P, p

- ?8 `! z" }. W
2 ?! a! }. W; {% [5 C* ?
% W+ U; h- T9 O" z8 m( ~

) [) m" m$ h: R  i; G  i' m4 C6 ^4 K/ P& `9 p7 A

$ _- D2 M( B" Y( x" q0 X. t
: Q  O7 q+ i' k& f' E5 d8 G

& _$ A$ V" r# z3 ^* B! _: U. E( t  F
+ q1 U  f  F. L* e; w% {2 U! S
' F2 c: D# Y/ |6 c, x  H8 v( N+ k+ y
/ y( q$ C# [2 x/ j

3 F# N, l8 j6 ~
6 K6 I# f2 L% m) ]; Z! p, Q& c0 W8 k, E! {* _

# V! {0 t1 d2 ~( Z0 j) P/ L. R1 Y6 u/ m8 }

8 i" i" a) R: ~  e* ^4 U, @7 E5 h0 o% B" c
收藏 评论1 发布时间:2018-4-18 21:43

举报

1个回答
寂寞,点燃一支烟 回答时间:2018-4-19 09:09:47

所属标签

相似分享

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版