1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        嵌入式 | 使用消息隊列處理事件的例子

        共 1843字,需瀏覽 4分鐘

         ·

        2022-05-19 18:08

        ????關(guān)注、星標(biāo)公眾號,直達精彩內(nèi)容

        來源:https://blog.csdn.net/qq_36413982/article/details/108110422


        在嵌入式中開發(fā)應(yīng)用消息隊列處理事件主要是為了解耦,減少模塊與模塊之間的耦合。

        實現(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;

        將消息插入到消息隊列中:

        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;
        }?

        從隊列循環(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ò),免費傳達知識,版權(quán)歸原作者所有。如涉及作品版權(quán)問題,請聯(lián)系我進行刪除。

        ???????????????? ?END ????????????????

        關(guān)注我的微信公眾號,回復(fù)“加群”按規(guī)則加入技術(shù)交流群。


        點擊“閱讀原文”查看更多分享,歡迎點分享、收藏、點贊、在看。

        瀏覽 34
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            亚洲精品中文字幕乱码三区 | 18禁 成人黄网站免费视频 | 中文字幕在线第一页 | 卡一卡二久久 | 亚洲AV无码乱码国产精品 | 99久久国产露脸国语对白 | 欧美日韩乱伦手机 | 女人逼网站 | 黄色在线观看免费 | 国产xxxx69 |