电子产业一站式赋能平台

PCB联盟网

搜索
查看: 16|回复: 0
收起左侧

嵌入式软件,使用消息队列处理事件的例子。

[复制链接]

599

主题

599

帖子

5042

积分

四级会员

Rank: 4

积分
5042
发表于 昨天 17:51 | 显示全部楼层 |阅读模式
我是老温,一名热爱学习的嵌入式工程师关注我,一起变得更加优秀!
) I) [" ^; b, m+ k! }2 |, a# T0 Q在嵌入式中开发应用消息队列处理事件主要是为了解耦,减少模块与模块之间的耦合。. Q9 X- S# X5 y6 D+ E
实现数据结构:
3 p" M6 E$ ?( xtypedef struct msg_node{6 \& G$ z7 c' U- U2 C9 _5 b6 b; y
void *parm;
- o0 `. ?5 X2 N' O) c" Gvoid (*handler)(void *parm); 1 Z' d0 I: [0 o' N
}msg_node_t;  /* 消息数据结构 */7 ?- o0 e* F  m3 K/ @) t  n0 p
typedefstruct msg_driver{
9 G5 r- }0 N% u7 {    unsignedint in;               //写入的位置
2 u6 y: `# [1 e$ h3 A; a: `    unsignedint out;              //读出的位置6 ]( z" ^% t, ?, o, @
    msg_node_t *buf[MSG_DRIVER_SIZE];    % u9 {$ _% U; ~
}msg_driver_t;
$ o3 N4 H0 G0 Q. ]将消息插入到消息队列中:# z5 I* _! ~! S  Z1 P
bool publish_msg(msg_driver_t *msg_buf, msg_node_t *msg)
7 e; U* b6 W+ Z/ S{: H& q: L9 k/ y: Y+ F
    if( is_msg_buf_full (msg_buf) == TRUE )  s( p- O; [) P9 t! |
    {
2 s9 d0 z4 _7 ?* d1 ^, C; b0 W        return FALSE;
1 P$ W9 Z4 \7 f+ ?    }
* s0 Y+ ], E. a    msg_buf->buf[msg_buf->in] = msg;: E  X- N  N/ Z) e3 Z
    msg_buf->in = (++msg_buf->in) % MSG_DRIVER_SIZE;    //防止越界
6 n- i2 r9 L! {6 f0 u+ t$ ]0 X
$ T+ Z0 ^' }2 j0 c return TRUE;4 G% I) V9 A( L( B) a) K6 B7 L
}
  N$ a7 ], ~4 ?+ G2 m/ W: h& q获取消息:# h9 l$ D- `. `8 [' ]& H7 j
static msg_node_t *get_messge(msg_driver_t *msg_buf)# ?4 y, k# a. S* L, E& A* I
{5 T4 I$ m* p: I* W1 Z$ T$ U$ h4 Y
msg_node_t *msg = NULL;& W* z$ M. S! N* y5 ?( H
    if( is_msg_buf_empty(msg_buf) )7 t1 M6 P2 R% \% H
    {
* p9 a2 {3 }: X( G, \        return NULL;; o  b5 \$ n! ^
    }
$ K* w4 l+ i- S' N1 ]; s9 e2 X    msg = msg_buf->buf[msg_buf->out];
0 J+ N5 d8 d8 x    msg_buf->out = (++msg_buf->out) % MSG_DRIVER_SIZE;    //防止越界2 g4 E- K: Z/ p/ G
    return msg;% b+ I5 ^8 K# ^$ [  l! z
}
7 g# q' k1 _$ z$ u9 Y) L从队列循环取出消息处理:
7 R/ P/ Q7 O! H由于每次发布消息都是送的处理函数指针,所以处理函数都不用修改。& B/ ^7 \8 u8 R1 N' c
void message_driver_handle(msg_driver_t *msg_buf)
+ W( r! q! m+ I+ _  ?{
8 d/ J- A( Y# y msg_node_t *msg;- P' @& d$ p$ `) {
while( (msg = get_messge(msg_buf)) != NULL )
$ z9 O& Y" Z! R- t) u/ r& I$ Y {* Y* B  p0 R5 z; I5 T
  if (msg->handler != NULL)
2 s* d1 `: w: y" D0 W& u   msg->handler(msg->parm);$ {3 `8 r$ C% w5 W" l) }& R
}: j7 K) d% ~; ^4 G& h
}
/ p7 D+ c8 S4 T" b测试:
/ L  K( o" s8 d% nmsg_driver_t msg_driver;/ D' S3 ?7 }3 L5 a) y
static void msg1_handle(void *parm)
2 [7 U, g) Z5 Y3 }7 E* T{$ w8 [& |1 F$ f. Z, f
printf("gets msg1\r
) _: b* z5 l. C- o+ v");
) B2 h0 W8 f6 m% S/ D}6 e6 E6 p) d9 C. C+ \" q
static void msg2_handle(void *parm)3 x- b$ z; q# C" u0 I- K
{# T2 c9 _7 B$ w9 v
printf("get msg2\r
1 K1 B2 Z& {, ]- w! L" e& c");
# N2 J6 y- @, \" a+ p7 ~6 ~0 |. `7 M}6 s( {, J7 I5 Q
static void msg3_handle(void *parm). t, [6 V/ F; `' e: c2 k  b6 S
{6 C7 J2 m4 P2 ~! o3 h1 @( {+ ]
printf("do msg3\r
* P+ t4 J& u5 F& _");  N0 J7 m: @. r
}6 D3 d" y: [8 o& k& B& f. J
msg_node_t msg1 = {
. X% {: P: j# [+ M% y# V .parm = "I love u",! B+ A- P1 `5 ?, X. _4 Y# R
.handler = msg1_handle. n& W0 w7 z& l
};" G; K& t2 z) K6 k
msg_node_t msg2 = {+ B) r$ a0 Q5 |( _7 t8 V1 _4 K
.parm = "I hate u",
; n$ _& m9 @  W8 N .handler = msg2_handle, v5 z0 Q# O+ W
};
# e' o" B3 U/ T% D3 Amsg_node_t msg3 = {6 D/ `; U7 h/ B/ v$ m9 V+ O. V9 m
.parm = NULL,2 h8 K/ l$ M( Z3 e; b
.handler = msg3_handle
! `" a% e* |+ A# T/ i};
0 y! r# J: n7 t( h5 W- }+ U1 Gpublish_msg(&msg_driver, &msg1);- C( w1 h& y) {  x! A
publish_msg(&msg_driver, &msg2);
6 M7 \- f3 c+ `! S# spublish_msg(&msg_driver, &msg3);2 Z2 `9 T5 K. _8 A. U
int main(void)
# s& o1 F( k7 X/ Y$ s9 z{
7 c, g+ u! U: [& Q5 z3 a/ bwhile(1)% O* l/ ~' \6 Z. ]4 k* d
{
+ Q- Q; F8 o+ t   message_driver_handle(&msg_driver);
$ o* I, B5 A" k/ u4 }  ^9 } }
8 K1 N0 A% ^5 L* x}
2 H4 Q! m4 A7 o% a$ E$ M原文:https://blog.csdn.net/qq_36413982/article/details/108110422* n& M0 t+ a9 P$ M8 g& @
( F2 W' z- m$ w/ i
-END-
8 K# M; W% n: d( k' y往期推荐:点击图片即可跳转阅读
( h' I0 n5 B8 R1 U  ~0 ?' ?

vehk5oupxuk6406163516.jpg

vehk5oupxuk6406163516.jpg

+ T/ v9 d: q  U; y6 A4 k5 R性能炸裂!关键是,价格非常香,8核2.2GHz+6T算力的开发套件!
2 s) Q' {; m. C- Z" U; m% s

hbbi1n1synn6406163616.jpg

hbbi1n1synn6406163616.jpg

" m$ `3 j9 B& V3 f5 }4 h手把手教学!把OpenHarmony移植到ARMv9架构,并且开发出好玩的应用程序!6 F  Q. L4 I& P% L7 x, r# E

0qrp4pq1qzh6406163716.jpg

0qrp4pq1qzh6406163716.jpg

" r! o9 N# o% W+ {3 ~* a& |; A一份完善的《嵌入式Linux内核编码风格》官方手册!
" a$ |+ O/ ~# J" m% B1 c我是老温,一名热爱学习的嵌入式工程师
* ?4 P4 k& F: }9 v, K+ M1 r关注我,一起变得更加优秀!
回复

使用道具 举报

发表回复

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条


联系客服 关注微信 下载APP 返回顶部 返回列表