<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

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

          共 1843字,需瀏覽 4分鐘

           ·

          2022-05-19 18:08

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

          來源: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)贊、在看。

          瀏覽 34
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  五月丁香婷色 | 中日韩一区二区三区久 | 日本久操视频 | 香蕉视频乱伦 | 无套内射学生妹去看片 |