1. gzyueqian
      13352868059

      嵌入式開發(fā):嵌入式基礎(chǔ)——回調(diào)函數(shù)

      更新時(shí)間: 2022-06-27 09:44:31來源: 粵嵌教育瀏覽量:8110

        回調(diào)函數(shù)是開發(fā)人員創(chuàng)建驅(qū)動(dòng)程序或自定義庫所需的一個(gè)基本且通常很關(guān)鍵的概念。回調(diào)函數(shù)是對(duì)可執(zhí)行代碼的引用,它作為參數(shù)傳遞給其他代碼,允許較低級(jí)別的軟件層調(diào)用在較高級(jí)別層中定義的函數(shù) (10)。回調(diào)允許驅(qū)動(dòng)程序或庫嵌入式開發(fā)人員在較低層指定行為,但將實(shí)現(xiàn)定義留給應(yīng)用程序?qū)印?

        最簡單的回調(diào)函數(shù)只是一個(gè)函數(shù)指針,它作為參數(shù)傳遞給另一個(gè)函數(shù)。在大多數(shù)情況下,回調(diào)將包含三個(gè)部分:

        ? 回調(diào)函數(shù)

        ? 回調(diào)注冊

        ? 回調(diào)執(zhí)行

        下圖顯示了這三個(gè)部分如何在典型的回調(diào)實(shí)現(xiàn)中協(xié)同工作。

        

        首先,開發(fā)人員創(chuàng)建將具有由應(yīng)用程序開發(fā)人員確定的實(shí)現(xiàn)元素的庫或模塊。例如,開發(fā)人員創(chuàng)建了一個(gè) GPIO 驅(qū)動(dòng)程序,該驅(qū)動(dòng)程序具有一個(gè)中斷服務(wù)例程,其代碼由應(yīng)用程序開發(fā)人員指定。中斷可以處理按鈕按下或其他一些功能。驅(qū)動(dòng)程序不關(guān)心功能,只關(guān)心在運(yùn)行時(shí)它知道在中斷觸發(fā)時(shí)應(yīng)該調(diào)用什么函數(shù)。在模塊中調(diào)用回調(diào)函數(shù)的代碼通常稱為信號(hào)處理程序。

        接下來,需要有一些方法來告訴底層代碼應(yīng)該執(zhí)行什么函數(shù)。有很多方法可以做到這一點(diǎn),但對(duì)于驅(qū)動(dòng)程序模塊,推薦的做法是在模塊內(nèi)創(chuàng)建一個(gè)專門用于將函數(shù)注冊為回調(diào)的函數(shù)。擁有一個(gè)單獨(dú)的函數(shù)來注冊回調(diào)函數(shù)使嵌入式開發(fā)人員非常清楚回調(diào)函數(shù)正在注冊到特定的信號(hào)處理程序。當(dāng)調(diào)用寄存器函數(shù)時(shí),將被調(diào)用的所需函數(shù)作為參數(shù)傳遞給模塊并存儲(chǔ)函數(shù)地址。

        最后,應(yīng)用程序開發(fā)人員編寫他們的應(yīng)用程序,其中包括創(chuàng)建回調(diào)和初始化代碼的實(shí)現(xiàn),該代碼將該函數(shù)注冊到庫或模塊中。執(zhí)行應(yīng)用程序時(shí),低級(jí)代碼存儲(chǔ)回調(diào)函數(shù)地址,當(dāng)需要執(zhí)行功能時(shí),它會(huì)取消引用回調(diào)函數(shù)并執(zhí)行它。

        開發(fā)人員可以考慮使用回調(diào)的兩個(gè)主要示例。首先,在驅(qū)動(dòng)程序中,開發(fā)人員將不知道最終應(yīng)用程序可能需要如何使用任何中斷服務(wù)程序。如果開發(fā)人員正在為某些微控制器外設(shè)創(chuàng)建庫,則可以使用回調(diào)來指定所有中斷行為。使用回調(diào)將允許開發(fā)人員確保在應(yīng)用程序開發(fā)人員沒有注冊自定義回調(diào)函數(shù)的情況下,每個(gè)中斷都有一個(gè)默認(rèn)的服務(wù)程序。當(dāng)回調(diào)與中斷一起使用時(shí),開發(fā)人員需要記住,需要遵循中斷的最佳實(shí)踐。

        


        其次,只要應(yīng)用程序中存在可能具有特定于實(shí)現(xiàn)行為的常見行為,就可以使用回調(diào)。例如,初始化數(shù)組是一項(xiàng)非常常見的任務(wù),需要在應(yīng)用程序中執(zhí)行。如果對(duì)于某些應(yīng)用程序,嵌入式開發(fā)人員希望將數(shù)組元素初始化為全零,而在另一個(gè)應(yīng)用程序中他們希望將數(shù)組元素初始化為隨機(jī)數(shù)怎么辦?在這種情況下,他們可以使用回調(diào)來初始化數(shù)組。

        ArrayInit 函數(shù)接受一個(gè)指向具有元素大小的數(shù)組的指針,然后它還接受一個(gè)指向返回整數(shù)的函數(shù)的指針。此時(shí)的功能尚未定義,但可以由應(yīng)用程序代碼定義。當(dāng)調(diào)用 ArrayInit 時(shí),開發(fā)人員會(huì)傳遞他們選擇的任何函數(shù)來初始化數(shù)組元素。

        帶回調(diào)的函數(shù):

        void ArrayInit(int * Array, size_t size, int (*Function)(void))

        {

        for(size_t i = 0; i < size; i++)

        {

        Array[i] = Function();

        }

        }

        將元素初始化為0:

        int Zeros(void)

        {

        return 0;

        }

        將元素初始化為隨機(jī)數(shù):

        int Random(void)

        {

        return rand();

        }

        函數(shù)Zeros或Random被傳遞給ArrayInit,這取決于應(yīng)用程序嵌入式開發(fā)人員希望如何初始化數(shù)組。

      免費(fèi)預(yù)約試聽課

      亚洲另类欧美综合久久图片区_亚洲中文字幕日产无码2020_欧美日本一区二区三区桃色视频_亚洲AⅤ天堂一区二区三区

      
      

      1. 亚洲国产一线免费观看 | 中文字幕亚洲乱码专区 | 日韩影片一区二区三区 | 五月天国产精品 | 中文字幕无线码中文字幕网站 | 特级撒尿AV在线播放 |