chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言函數(shù)的回調(diào)函數(shù)

工程師 ? 來源:嵌入式客棧 ? 作者:嵌入式客棧 ? 2020-09-11 09:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

來源:嵌入式客棧

1 什么是回調(diào)函數(shù)?首先什么是“回調(diào)”呢?

我的理解是:把一段可執(zhí)行的代碼像參數(shù)傳遞那樣傳給其他代碼,而這段代碼會在某個時刻被調(diào)用執(zhí)行,這就叫做回調(diào)。

如果代碼立即被執(zhí)行就稱為同步回調(diào),如果過后再執(zhí)行,則稱之為異步回調(diào)。

回調(diào)函數(shù)就是一個通過函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個函數(shù),當(dāng)這個指針被用來調(diào)用其所指向的函數(shù)時,我們就說這是回調(diào)函數(shù)。

回調(diào)函數(shù)不是由該函數(shù)的實現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時由另外的一方調(diào)用的,用于對該事件或條件進行響應(yīng)。

2 為什么要用回調(diào)函數(shù)?因為可以把調(diào)用者與被調(diào)用者分開,所以調(diào)用者不關(guān)心誰是被調(diào)用者。它只需知道存在一個具有特定原型和限制條件的被調(diào)用函數(shù)。

簡而言之,回調(diào)函數(shù)就是允許用戶把需要調(diào)用的方法的指針作為參數(shù)傳遞給一個函數(shù),以便該函數(shù)在處理相似事件的時候可以靈活的使用不同的方法。

int Callback() ///《 回調(diào)函數(shù){ // TODO return 0;}int main() ///《 主函數(shù){ // TODO Library(Callback); ///《 庫函數(shù)通過函數(shù)指針進行回調(diào) // TODO return 0;}

回調(diào)似乎只是函數(shù)間的調(diào)用,和普通函數(shù)調(diào)用沒啥區(qū)別。

但仔細(xì)看,可以發(fā)現(xiàn)兩者之間的一個關(guān)鍵的不同:在回調(diào)中,主程序把回調(diào)函數(shù)像參數(shù)一樣傳入庫函數(shù)。

這樣一來,只要我們改變傳進庫函數(shù)的參數(shù),就可以實現(xiàn)不同的功能,這樣有沒有覺得很靈活?并且當(dāng)庫函數(shù)很復(fù)雜或者不可見的時候利用回調(diào)函數(shù)就顯得十分優(yōu)秀。

3 怎么使用回調(diào)函數(shù)?int Callback_1(int a) ///《 回調(diào)函數(shù)1{ printf(“Hello, this is Callback_1: a = %d ”, a); return 0;}int Callback_2(int b) ///《 回調(diào)函數(shù)2{ printf(“Hello, this is Callback_2: b = %d ”, b); return 0;}int Callback_3(int c) ///《 回調(diào)函數(shù)3{ printf(“Hello, this is Callback_3: c = %d ”, c); return 0;}int Handle(int x, int (*Callback)(int)) ///《 注意這里用到的函數(shù)指針定義{ Callback(x);}int main(){ Handle(4, Callback_1); Handle(5, Callback_2); Handle(6, Callback_3); return 0;}

如上述代碼:可以看到,Handle()函數(shù)里面的參數(shù)是一個指針,在main()函數(shù)里調(diào)用Handle()函數(shù)的時候,給它傳入了函數(shù)Callback_1()/Callback_2()/Callback_3()的函數(shù)名,這時候的函數(shù)名就是對應(yīng)函數(shù)的指針,也就是說,回調(diào)函數(shù)其實就是函數(shù)指針的一種用法。

4 回調(diào)函數(shù)實例(很有用)一個GPRS模塊聯(lián)網(wǎng)的小項目,使用過的同學(xué)大概知道2G、4G、NB等模塊要想實現(xiàn)無線聯(lián)網(wǎng)功能都需要經(jīng)歷模塊上電初始化、注冊網(wǎng)絡(luò)、查詢網(wǎng)絡(luò)信息質(zhì)量、連接服務(wù)器等步驟,這里的的例子就是,利用一個狀態(tài)機函數(shù)(根據(jù)不同狀態(tài)依次調(diào)用不同實現(xiàn)方法的函數(shù)),通過回調(diào)函數(shù)的方式依次調(diào)用不同的函數(shù),實現(xiàn)模塊聯(lián)網(wǎng)功能,如下:

/********* 工作狀態(tài)處理 *********/typedef struct{ uint8_t mStatus; uint8_t (* Funtion)(void); //函數(shù)指針的形式} M26_WorkStatus_TypeDef; //M26的工作狀態(tài)集合調(diào)用函數(shù)/************************************************ 》M26工作狀態(tài)集合函數(shù)***********************************************/M26_WorkStatus_TypeDef M26_WorkStatus_Tab[] ={ {GPRS_NETWORK_CLOSE, M26_PWRKEY_Off }, //模塊關(guān)機 {GPRS_NETWORK_OPEN, M26_PWRKEY_On }, //模塊開機 {GPRS_NETWORK_Start, M26_Work_Init }, //管腳初始化 {GPRS_NETWORK_CONF, M26_NET_Config }, /AT指令配置 {GPRS_NETWORK_LINK_CTC, M26_LINK_CTC }, //連接調(diào)度中心 {GPRS_NETWORK_WAIT_CTC, M26_WAIT_CTC }, //等待調(diào)度中心回復(fù) {GPRS_NETWORK_LINK_FEM, M26_LINK_FEM }, //連接前置機 {GPRS_NETWORK_WAIT_FEM, M26_WAIT_FEM }, //等待前置機回復(fù) {GPRS_NETWORK_COMM, M26_COMM }, //正常工作 {GPRS_NETWORK_WAIT_Sig, M26_WAIT_Sig }, //等待信號回復(fù) {GPRS_NETWORK_GetSignal, M26_GetSignal }, //獲取信號值 {GPRS_NETWORK_RESTART, M26_RESET }, //模塊重啟}/************************************************ 》M26模塊工作狀態(tài)機,依次調(diào)用里面的12個函數(shù) ***********************************************/uint8_t M26_WorkStatus_Call(uint8_t Start){ uint8_t i = 0; for(i = 0; i 《 12; i++) { if(Start == M26_WorkStatus_Tab[i].mStatus) { return M26_WorkStatus_Tab[i].Funtion(); } } return 0;}

所以,如果有人想做個NB模塊聯(lián)網(wǎng)項目,可以copy上面的框架,只需要修改回調(diào)函數(shù)內(nèi)部的具體實現(xiàn),或者增加、減少回調(diào)函數(shù),就可以很簡潔快速的實現(xiàn)模塊聯(lián)網(wǎng)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7632

    瀏覽量

    141775
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64895
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    深入理解C語言函數(shù)—編程中的“積木塊”藝術(shù)

    在編程的世界里,函數(shù)就像建筑中的“積木塊”——它們是構(gòu)建復(fù)雜程序的基石。通過靈活組合這些模塊,開發(fā)者能打造出功能強大且結(jié)構(gòu)清晰的代碼。函數(shù)之所以成為C語言的核心,正是因為它解決了編程中
    的頭像 發(fā)表于 06-30 17:26 ?844次閱讀
    深入理解<b class='flag-5'>C</b><b class='flag-5'>語言</b>:<b class='flag-5'>函數(shù)</b>—編程中的“積木塊”藝術(shù)

    為什么中斷調(diào)函數(shù)中不能使用接收中斷開啟函數(shù)

    我看(書是基于stm32f407編寫)書上說在串口接收中斷調(diào)函數(shù)里面不能使用 接收中斷開啟函數(shù),書上是利用自己創(chuàng)建了空閑中斷
    發(fā)表于 05-28 07:19

    如何使用自定義設(shè)置調(diào)函數(shù)?

    你好,我正在嘗試編寫自己的自定義設(shè)置調(diào)函數(shù),并使用 fastEnum=false。 是否有任何代碼示例或資料可供我參考? void CyU3PUsbRegisterSetupCallback
    發(fā)表于 05-21 06:11

    cyusb3014的usbTouart的dma通道配置,請問為什么調(diào)函數(shù)無法觸發(fā)?

    請問為什么調(diào)函數(shù)無法觸發(fā)?Why can\'t the callback function be triggered?
    發(fā)表于 05-06 08:13

    為什么中斷調(diào)函數(shù)中不能使用接收中斷開啟函數(shù)?

    我看(書是基于stm32f407編寫)書上說在串口接收中斷調(diào)函數(shù)里面不能使用 接收中斷開啟函數(shù),書上是利用自己創(chuàng)建了空閑中斷
    發(fā)表于 04-22 08:19

    為什么不需要給調(diào)函數(shù)傳遞參數(shù)

    調(diào)函數(shù)C語言里面一個重要機制。
    的頭像 發(fā)表于 04-15 10:11 ?327次閱讀

    函數(shù)指針的六個常見應(yīng)用場景

    應(yīng)用場景,并結(jié)合示例代碼進行講解。01、調(diào)函數(shù):解耦代碼,提高靈活性調(diào)函數(shù)是嵌入式開發(fā)中最常
    的頭像 發(fā)表于 04-07 11:58 ?538次閱讀
    <b class='flag-5'>函數(shù)</b>指針的六個常見應(yīng)用場景

    解鎖TSMaster fifo函數(shù):報文讀取的高效方法

    前言:TSMaster目前有兩種讀取報文的模式:調(diào)函數(shù)模式和fifo模式。fifo函數(shù)是TSMaster近期新增的函數(shù),本文將重點介紹fi
    的頭像 發(fā)表于 03-14 20:04 ?473次閱讀
    解鎖TSMaster fifo<b class='flag-5'>函數(shù)</b>:報文讀取的高效方法

    STM32CUBUMX定時器1中斷調(diào)函數(shù)就是進不去怎么解決?

    (&htim1);HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3); HAL_TIM_PWM_Start_IT(&htim1, TIM_CHANNEL_3); 就死活進不去,調(diào)
    發(fā)表于 03-12 06:49

    C語言如何處理函數(shù)的返回值

    的那樣,直接把 1234 賦值給了變量 ret? 搞懂這個問題不難,只要看下匯編代碼就行。 把代碼編譯一下,只編譯不鏈接,得到的就是C對應(yīng)的匯編代碼。 這塊是 test 函數(shù),不用管上面這些代碼,如果一行一行去分析,沒有匯編基礎(chǔ)的話確實會頭疼。 看下這行代碼,很明顯,12
    的頭像 發(fā)表于 01-16 09:21 ?444次閱讀

    EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù)

    電子發(fā)燒友網(wǎng)站提供《EE-128:C語言中的DSP:從C調(diào)用匯編類成員函數(shù).pdf》資料免費下載
    發(fā)表于 01-07 13:48 ?0次下載
    EE-128:<b class='flag-5'>C</b><b class='flag-5'>語言</b>中的DSP:從<b class='flag-5'>C</b>調(diào)用匯編類成員<b class='flag-5'>函數(shù)</b>

    同樣是函數(shù),在CC++中有什么區(qū)別

    同樣是函數(shù),在 CC++ 中有什么區(qū)別? 第一個返回值。 C語言函數(shù)可以不寫返回值類型,
    的頭像 發(fā)表于 11-29 10:25 ?913次閱讀

    使用C語言實現(xiàn)函數(shù)模板

      用C語言能不能實現(xiàn)一個通用的函數(shù),既能完成整數(shù)的相加,又能完成浮點數(shù)的相加?
    的頭像 發(fā)表于 11-09 11:38 ?953次閱讀

    定時器未進入超時調(diào)函數(shù)的原因?

    新人想做一個硬件定時器的實驗,跟著網(wǎng)上的配置做完之后,發(fā)現(xiàn)沒有進入超時調(diào)函數(shù),但是能夠正常的寫入和讀取我我設(shè)置的超時值,懷疑是初始化配置有問題,但又找不到哪里配置有問題
    發(fā)表于 09-27 07:25

    定時器調(diào)函數(shù)能不能用ICACHE_FLASH_ATTR定義?

    非 OS SDK 在中斷處理函數(shù)中,請勿使用任何 ICACHE_FLASH_ATTR 定義的函數(shù)。 請問: 1、定時器和hw定時器的調(diào)函數(shù)
    發(fā)表于 07-22 06:33