嵌入式 | 使用消息隊(duì)列處理事件的例子
來源:https://blog.csdn.net/qq_36413982/article/details/108110422
在嵌入式中開發(fā)應(yīng)用消息隊(duì)列處理事件主要是為了解耦,減少模塊與模塊之間的耦合。
實(shí)現(xiàn)
數(shù)據(jù)結(jié)構(gòu):
typedef?struct?msg_node{
?void?*parm;
?void?(*handler)(void?*parm);?
}msg_node_t;??/*?消息數(shù)據(jù)結(jié)構(gòu)?*/
typedef?struct?msg_driver{
????unsigned?int?in;???????????????//寫入的位置
????unsigned?int?out;??????????????//讀出的位置
????msg_node_t?*buf[MSG_DRIVER_SIZE];????
}msg_driver_t;
將消息插入到消息隊(duì)列中:
bool?publish_msg(msg_driver_t?*msg_buf,?msg_node_t?*msg)
{
????if(?is_msg_buf_full?(msg_buf)?==?TRUE?)
????{
????????return?FALSE;
????}
????msg_buf->buf[msg_buf->in]?=?msg;
????msg_buf->in?=?(++msg_buf->in)?%?MSG_DRIVER_SIZE;????//防止越界
?
?return?TRUE;
}
獲取消息:
static?msg_node_t?*get_messge(msg_driver_t?*msg_buf)
{
?msg_node_t?*msg?=?NULL;
????if(?is_msg_buf_empty(msg_buf)?)
????{
????????return?NULL;
????}
????msg?=?msg_buf->buf[msg_buf->out];
????msg_buf->out?=?(++msg_buf->out)?%?MSG_DRIVER_SIZE;????//防止越界
????return?msg;
}?
從隊(duì)列循環(huán)取出消息處理:
由于每次發(fā)布消息都是送的處理函數(shù)指針,所以處理函數(shù)都不用修改。
void?message_driver_handle(msg_driver_t?*msg_buf)
{
?msg_node_t?*msg;
?while(?(msg?=?get_messge(msg_buf))?!=?NULL?)
?{
??if?(msg->handler?!=?NULL)
???msg->handler(msg->parm);
?}
}
測試:
msg_driver_t?msg_driver;
static?void?msg1_handle(void?*parm)
{
?printf("gets?msg1\r\n");
}
static?void?msg2_handle(void?*parm)
{
?printf("get?msg2\r\n");
}
static?void?msg3_handle(void?*parm)
{
?printf("do?msg3\r\n");
}
msg_node_t?msg1?=?{
?.parm?=?"I?love?u",
?.handler?=?msg1_handle
};
msg_node_t?msg2?=?{
?.parm?=?"I?hate?u",
?.handler?=?msg2_handle
};
msg_node_t?msg3?=?{
?.parm?=?NULL,
?.handler?=?msg3_handle
};
publish_msg(&msg_driver,?&msg1);
publish_msg(&msg_driver,?&msg2);
publish_msg(&msg_driver,?&msg3);
int?main(void)
{
?while(1)
?{
???message_driver_handle(&msg_driver);
?}
}
版權(quán)聲明:本文來源網(wǎng)絡(luò),免費(fèi)傳達(dá)知識,版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請聯(lián)系我進(jìn)行刪除。
???????????????? ?END ????????????????
關(guān)注我的微信公眾號,回復(fù)“加群”按規(guī)則加入技術(shù)交流群。
點(diǎn)擊“閱讀原文”查看更多分享,歡迎點(diǎn)分享、收藏、點(diǎn)贊、在看。
評論
圖片
表情
