加入星計(jì)劃,您可以享受以下權(quán)益:

  • 創(chuàng)作內(nèi)容快速變現(xiàn)
  • 行業(yè)影響力擴(kuò)散
  • 作品版權(quán)保護(hù)
  • 300W+ 專(zhuān)業(yè)用戶
  • 1.5W+ 優(yōu)質(zhì)創(chuàng)作者
  • 5000+ 長(zhǎng)期合作伙伴
立即加入
  • 正文
  • 推薦器件
  • 相關(guān)推薦
  • 電子產(chǎn)業(yè)圖譜
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

實(shí)現(xiàn)一個(gè)簡(jiǎn)單的事件驅(qū)動(dòng)處理框架

2023/06/09
2277
閱讀需 7 分鐘
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

來(lái)源 | 嵌入式應(yīng)用研究院

事件驅(qū)動(dòng)框架允許程序處理外部事件,如網(wǎng)絡(luò)連接、文件I/O、超時(shí)和信號(hào)。事件驅(qū)動(dòng)框架可以讓程序通過(guò)回調(diào)函數(shù)處理不同的事件,回調(diào)函數(shù)可以在事件觸發(fā)時(shí)立即被調(diào)用。

要實(shí)現(xiàn)一個(gè)簡(jiǎn)單事件驅(qū)動(dòng)框架,首先需要?jiǎng)?chuàng)建一個(gè)事件處理函數(shù),它是根據(jù)發(fā)生的不同事件調(diào)用不同的回調(diào)函數(shù)。然后,我們需要編寫(xiě)代碼來(lái)注冊(cè)事件的回調(diào)函數(shù),即當(dāng)某個(gè)事件發(fā)生時(shí)就要調(diào)用該回調(diào)函數(shù)。

直接開(kāi)干:

#include?<stdio.h>
#include?<stdlib.h>
#include?<string.h>
#include?<unistd.h>
#include?<pthread.h>

//定義事件類(lèi)型
typedef?enum?EventType_t
{
????EVENT_TEST_A?=?0,
????EVENT_TEST_B,
????EVENT_TEST_C,
????EVENT_ALL_NUM
}EventType_t;

//定義事件處理函數(shù)類(lèi)型
typedef?void?(*EventHandler_t)(EventType_t?type,?void?*pArg);

//定義事件對(duì)象
typedef?struct?Event_t
{
????EventType_t?type;
????EventHandler_t?handler;
????void?*pArg;
}Event_t;

//事件列表
Event_t?EventList[EVENT_ALL_NUM]?=?{0};

//注冊(cè)事件并將事件以及事件處理函數(shù)等添加到事件列表中
void?RegisterEvent(EventType_t?type,?EventHandler_t?handler,?void?*pArg)
{
????if?(type?>=?EVENT_ALL_NUM)
????{
????????printf("Invalid?event?type!n");
????????return;
????}
????
????EventList[type].type?=?type;
????EventList[type].handler?=?handler;
????EventList[type].pArg?=?pArg;
}

//根據(jù)具體的某個(gè)事件調(diào)用對(duì)應(yīng)的事件觸發(fā)函數(shù)
void?TriggerEvent(EventType_t?type)
{
????if?(type?>=?EVENT_ALL_NUM)
????{
????????printf("Invalid?event?type!n");
????????return;
????}
????
????if?(EventList[type].handler?!=?NULL)
????{
????????EventList[type].handler(type,?EventList[type].pArg);
????}
}

//對(duì)應(yīng)事件A的處理函數(shù)
void?HandlerEventTestA(EventType_t?type,?void?*pArg)
{
????printf("HandlerEventTestA?is?called!n");
}

//對(duì)應(yīng)事件B的處理函數(shù)
void?HandlerEventTestB(EventType_t?type,?void?*pArg)
{
????printf("HandlerEventTestB?is?called!n");
}

void?*ThreadHandler(void?*Arg)
{
?   while(1)
?   {
??     //觸發(fā)事件A
??     TriggerEvent(EVENT_TEST_A);
??     usleep(1000*1000);
??     //觸發(fā)事件B
??     TriggerEvent(EVENT_TEST_B);
??     usleep(1000*1000);
?   }
}

int?main(void)
{
?   pthread_t?Thread;
?
?   //注冊(cè)事件A?&?B
????RegisterEvent(EVENT_TEST_A,?HandlerEventTestA,?NULL);
????RegisterEvent(EVENT_TEST_B,?HandlerEventTestB,?NULL);
?   pthread_create(&Thread,?NULL,?ThreadHandler,?NULL);
?   pthread_detach(Thread);
?
????while(1)
?   {
??    usleep(2000?*?10);
?   }
????
????return?0;
}

編譯程序:gcc test.c -o test -lpthread

運(yùn)行結(jié)果:

 

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
TJA1055T/1J 1 NXP Semiconductors TJA1055 - Enhanced fault-tolerant CAN transceiver SOIC 14-Pin
$1.72 查看
R38-32.768-12.5 1 Raltron Electronics Corporation Parallel - Fundamental Quartz Crystal, 0.032768MHz Nom, HALOGEN FREE, ROHS AND REACH COMPLIANT PACKAGE-2
$0.06 查看
SN74LV244APWG4 1 Texas Instruments Eight-channel 2-V to 5.5-V buffers with tri-state outputs 20-TSSOP -40 to 125

ECAD模型

下載ECAD模型
暫無(wú)數(shù)據(jù) 查看

相關(guān)推薦

電子產(chǎn)業(yè)圖譜

本科畢業(yè)于華南理工大學(xué),現(xiàn)美國(guó)卡羅爾工商管理碩士研究生在讀,曾就職于世界名企偉易達(dá)、聯(lián)發(fā)科技等,多年嵌入式產(chǎn)品開(kāi)發(fā)經(jīng)驗(yàn),在智能玩具、安防產(chǎn)品、平板電腦、手機(jī)開(kāi)發(fā)有豐富的實(shí)戰(zhàn)開(kāi)發(fā)經(jīng)驗(yàn),現(xiàn)任深圳市云之手科技有限公司副總經(jīng)理、研發(fā)總工程師。