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

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

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

嵌入式軟件架構(gòu)設(shè)計之函數(shù)調(diào)用

巧醬人 ? 來源:大橙子瘋嵌入式 ? 作者:大橙子瘋 ? 2023-02-15 14:48 ? 次閱讀

1、前言

函數(shù)調(diào)用很好理解,即使剛學(xué)沒多久的朋友也知道函數(shù)調(diào)用是怎么實現(xiàn)的,即調(diào)用一個已經(jīng)封裝好的函數(shù),實現(xiàn)某個特定的功能。

把一個或者多個功能通過函數(shù)的方式封裝起來,對外只提供一個簡單的函數(shù)接口,然后在其他地方調(diào)用即可

2、函數(shù)調(diào)用方式

函數(shù)調(diào)用難道還能怎么調(diào)用?不就封裝好直接調(diào)用嗎???

函數(shù)調(diào)用方式分為兩種:直接調(diào)用和間接調(diào)用

直接調(diào)用

直接調(diào)用就是我們平常使用的方式,下面的方式就屬于直接調(diào)用了。

int SumFun(int a, int b)
{
    return a + b;
}

int main()
{
    // 直接調(diào)用定義好的函數(shù)
    int sum = SumFun(5, 6);
    printf("sum=%d", sum);
    return 0;
}

間接調(diào)用

間接調(diào)用在初學(xué)時很難使用到,這是通過函數(shù)指針的方式實現(xiàn)的。

函數(shù)指針本質(zhì)是一個指針變量,是一個指向函數(shù)的指針(函數(shù)本身也是有地址的,指向的是函數(shù)入口);

指針函數(shù)本質(zhì)是一個函數(shù),其返回值為指針。

函數(shù)指針的用法如下:

typedef int (*FunctionCB)(int, int);

int SumFun(int a, int b)
{
    return a + b;
}

int main()
{
    // 將定義好的函數(shù)賦值給函數(shù)指針
    FunctionCB pfnSum = SumFun;

    // 通過函數(shù)指針間接調(diào)用
    int sum = pfnSum(5, 6);
    printf("sum=%d", sum);
    return 0;
}

3、什么場景使用

函數(shù)指針在軟件架構(gòu)分層設(shè)計中十分重要,因為分層設(shè)計中有一個設(shè)計原則,那就是下層函數(shù)不能直接調(diào)用上層函數(shù),那么可以通過函數(shù)指針的方式實現(xiàn);一般稱上層通過函數(shù)指針賦值給下層的函數(shù)為回調(diào)函數(shù)。

什么情況會存在需要下層程序需要調(diào)用上層程序的呢?

比如串口數(shù)據(jù)接收,雖然可以通過查詢的方式接收,但是遠(yuǎn)不及通過串口中斷的方式接收及時,當(dāng)接收完成時,需要立即通知上層讀取數(shù)據(jù)進行處理,而不是等待上層程序查詢讀取。

如何實現(xiàn)呢?

比如硬件抽象層/驅(qū)動層中的串口模塊實現(xiàn)函數(shù)

/************* UART.c 文件 ****************/
static UartRecvCB sg_pfnUartRecv;

// 設(shè)置數(shù)據(jù)幀接收處理回調(diào)函數(shù)
void UART_SetRecvCallback(UartRecvCB pfnUartRecv)
{
    sg_pfnUartRecv = pfnUartRecv;
}

void UART_Task(void)
{
    if (RecvEnd)
    {
        // 數(shù)據(jù)一幀接收完成立即調(diào)用
        if (sg_pfnUartRecv != NULL)
        {
            sg_pfnUartRecv(UartRecvBuf, UartRecvLength);
        }
    }
}

/************* UART.h 文件 ****************/
typedef void (*UartRecvCB)(const char *, int);

extern void UART_SetRecvCallback(UartRecvCB pfnUartRecv);
extern void UART_Task(void);

應(yīng)用層代碼中實現(xiàn)回調(diào)函數(shù),并調(diào)用下層函數(shù)。

// 回調(diào)函數(shù):串口數(shù)據(jù)處理
void OnUartRecvProcess(const char *pBuf, int length)
{
    // 處理串口數(shù)據(jù)
    printf("Recv: %s", pBuf);
}

int main()
{
    UART_SetRecvCallback(OnUartRecvProcess);

    while(1)
    {
        if (TimeFlag)
        {
            UART_Task();
        }
    }
}

上述示例中通過函數(shù)指針的方式間接調(diào)用了應(yīng)用層的函數(shù),而且并不違背分層設(shè)計原則。

如果看代碼不能立即理解的話,可以嘗試通過下圖理解:

圖片


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

    關(guān)注

    33

    文章

    8777

    瀏覽量

    152419
  • 封裝
    +關(guān)注

    關(guān)注

    127

    文章

    8157

    瀏覽量

    143876
  • 函數(shù)調(diào)用
    +關(guān)注

    關(guān)注

    0

    文章

    19

    瀏覽量

    2620
收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式系統(tǒng)的軟件架構(gòu)設(shè)計!

    軟件架構(gòu)設(shè)計!2. 嵌入式環(huán)境下軟件設(shè)計的特點要談嵌入式軟件
    發(fā)表于 08-10 07:46

    為何要進行嵌入式軟件架構(gòu)設(shè)計?如何設(shè)計?

    為何要進行嵌入式軟件架構(gòu)設(shè)計?如何進行嵌入式軟件架構(gòu)設(shè)計?
    發(fā)表于 11-01 06:31

    嵌入式軟件架構(gòu)設(shè)計的目的及思路

    【1】架構(gòu)設(shè)計的目的1.應(yīng)用的代碼邏輯清晰,且避免重復(fù)造輪子。2.方便軟件的移植。3.最大限度地復(fù)用。4.高內(nèi)聚低耦合。 【2】嵌入式架構(gòu)思路1.功能模塊化設(shè)計獲得需求------->
    發(fā)表于 11-08 06:41

    嵌入式UI架構(gòu)設(shè)計相關(guān)資料下載

    嵌入式UI架構(gòu)設(shè)計漫談
    發(fā)表于 11-08 07:49

    嵌入式系統(tǒng)中的架構(gòu)設(shè)計的理解

    【閱讀這篇文章,你能了解到什么】1. 從事嵌入式開發(fā)12年的我,對架構(gòu)設(shè)計的理解;2. 對嵌入式系統(tǒng)中的架構(gòu)設(shè)計要刻意訓(xùn)練;3. 嵌入式系統(tǒng)
    發(fā)表于 11-08 08:23

    決定嵌入式系統(tǒng)軟件架構(gòu)的因素和架構(gòu)的影響

    嵌入式系統(tǒng)軟件架構(gòu)設(shè)計目錄1.前言42.決定架構(gòu)的因素和架構(gòu)的影響42.1.常見的誤解52.1.1.小型的系統(tǒng)不需要
    發(fā)表于 11-08 06:54

    嵌入式軟件架構(gòu)設(shè)計的資料大合集

    一、感慨近公司新招了一個做嵌入式軟件開發(fā)開發(fā)的童鞋,該童鞋是從上海的某一個上市公司出來的,因為我們這邊人手不夠,因此把他安排了去負(fù)責(zé)一個新產(chǎn)品的研發(fā),前期讓他負(fù)責(zé)加速度計、NB-IOT、舵機、外置
    發(fā)表于 11-09 07:50

    嵌入式軟件架構(gòu)設(shè)計資料分享

    作為程序員,我覺得如果要走的更遠(yuǎn)必須要成為工程師,畢竟年齡和資歷都擺在那里了。所以就讓我這個老程序員淺談一下嵌入式軟件架構(gòu)設(shè)計。我參考的也是一篇博文。原圖如下![在這里插入圖片描述](?x-oss-process=image/w
    發(fā)表于 12-24 07:09

    嵌入式軟件架構(gòu)設(shè)

    嵌入式軟件架構(gòu)的設(shè)計,幫助我們建立合理,有效的軟件架構(gòu)
    發(fā)表于 11-09 17:34 ?19次下載

    探究嵌入式開發(fā)是否需要架構(gòu)設(shè)計?

    閱讀這篇文章,你能了解到什么 1. 從事嵌入式開發(fā)12年的我,對架構(gòu)設(shè)計的理解; 2. 對嵌入式系統(tǒng)中的架構(gòu)設(shè)計要刻意訓(xùn)練; 3. 嵌入式
    的頭像 發(fā)表于 04-05 09:49 ?3602次閱讀
    探究<b class='flag-5'>嵌入式</b>開發(fā)是否需要<b class='flag-5'>架構(gòu)設(shè)</b>計?

    嵌入式軟件架構(gòu)設(shè)

    【1】架構(gòu)設(shè)計的目的1.應(yīng)用的代碼邏輯清晰,且避免重復(fù)造輪子。2.方便軟件的移植。3.最大限度地復(fù)用。4.高內(nèi)聚低耦合。?【2】嵌入式架構(gòu)思路1.功能模塊化設(shè)計? 獲得需求------
    發(fā)表于 11-03 16:36 ?10次下載
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b><b class='flag-5'>架構(gòu)設(shè)</b>計

    嵌入式UI架構(gòu)設(shè)計漫談

    嵌入式UI架構(gòu)設(shè)計漫談
    發(fā)表于 11-03 17:36 ?15次下載
    <b class='flag-5'>嵌入式</b>UI<b class='flag-5'>架構(gòu)設(shè)</b>計漫談

    嵌入式開發(fā)需要架構(gòu)設(shè)計嗎?

    【閱讀這篇文章,你能了解到什么】1. 從事嵌入式開發(fā)12年的我,對架構(gòu)設(shè)計的理解;2. 對嵌入式系統(tǒng)中的架構(gòu)設(shè)計要刻意訓(xùn)練;3. 嵌入式系統(tǒng)
    發(fā)表于 11-03 18:06 ?15次下載
    <b class='flag-5'>嵌入式</b>開發(fā)需要<b class='flag-5'>架構(gòu)設(shè)</b>計嗎?

    嵌入式系統(tǒng)軟件架構(gòu)設(shè)

    嵌入式系統(tǒng)軟件架構(gòu)設(shè)計目錄1.前言42.決定架構(gòu)的因素和架構(gòu)的影響42.1.常見的誤解52.1.1.小型的系統(tǒng)不需要
    發(fā)表于 11-03 18:21 ?30次下載
    <b class='flag-5'>嵌入式</b>系統(tǒng)<b class='flag-5'>軟件</b><b class='flag-5'>架構(gòu)設(shè)</b>計

    嵌入式軟件架構(gòu)設(shè)消息交互

    在熟悉任務(wù)調(diào)度、程序分層和模塊化編程關(guān)于軟件架構(gòu)、分層和模塊設(shè)計后,除了函數(shù)調(diào)用設(shè)計中出現(xiàn)的情況外,還會遇到同層模塊之前如何進行消息交互,通常是應(yīng)用層之間。
    的頭像 發(fā)表于 02-15 15:44 ?982次閱讀
    <b class='flag-5'>嵌入式</b><b class='flag-5'>軟件</b><b class='flag-5'>架構(gòu)設(shè)</b>計<b class='flag-5'>之</b>消息交互