最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語言中回調(diào)函數(shù)的使用詳情

 更新時間:2022年03月06日 09:49:47   作者:Embedded?learner  
這篇文章主要介紹了C語言中回調(diào)函數(shù)的使用詳情,閱讀下文我們將學(xué)習(xí)到架構(gòu)的核心理念和需、回調(diào)函數(shù)的作用、回調(diào)函數(shù)的程序編寫等內(nèi)容,需要的小伙伴可以參考一下

下文將學(xué)習(xí)到;

  • 程序架構(gòu)的核心理念和需求
  • 掌握回調(diào)函數(shù)的作用
  • 掌握回調(diào)函數(shù)的程序編寫
  • 掌握回調(diào)函數(shù)在產(chǎn)品中的應(yīng)用

1.程序架構(gòu)

一個好的程序架構(gòu)至少要達(dá)到以下要求:

硬件層和應(yīng)用層的程序代碼分開,相互之間的控制和通訊使用接口,而且不會共享的全局變量或者數(shù)組。

用專業(yè)術(shù)語描述就是可移植性、可擴(kuò)展性。

在51單片機(jī)寫程序時,基本上一個.c文件解決,包括寄存器配置,產(chǎn)品功能。到了stm32時,我們會把不同的外設(shè)功能,比如led,按鍵,串口等外設(shè)功能代碼分別寫在不同的.c文件里,然后統(tǒng)一用函數(shù)接口去調(diào)用它,比方說控制一個LED燈亮,直接在led.c文件里寫一個驅(qū)動led燈狀態(tài)的函數(shù)然后給外部調(diào)用就好了。硬件層和應(yīng)用層代碼分開,應(yīng)用層用硬件層提供的接口來控制,而且不會有硬件層和應(yīng)用層共享的全部變量或數(shù)組。
還有一種情況,應(yīng)用程序需要收集硬件層的數(shù)據(jù),比如串口接收數(shù)據(jù),按鍵采集,adc值采集,這種值應(yīng)該怎么樣從硬件層獲取呢?
簡單的方法就是用全局變量或者數(shù)組,比方說硬件層串口接收到數(shù)據(jù)了,那么我們把數(shù)據(jù)丟到數(shù)組里面,然后把接收完成的全局變量標(biāo)志置為1,比方說全局變量名為RcvFlag,然后應(yīng)用層程序會輪詢判斷RcvFlag==1?是的話就把數(shù)組里面的數(shù)據(jù)取出來解析。
但是這種方法存在實時性差和移植性差的問題,比如說需要把串口的硬件層封裝起來給客戶使用,不能讓客戶看到實現(xiàn)的源碼,只能提供函數(shù)接口給客戶使用,不可能通過告訴客戶先判斷哪個變量為1,然后在取哪個數(shù)組中的數(shù)據(jù)這種做法。
在這里就需要回調(diào)函數(shù)了。

2.回調(diào)函數(shù)的作用

在stm32中,像外部中斷、定時器中斷、串口中斷都有點類似回調(diào)函數(shù),這種函數(shù)的目的是把采集到的數(shù)據(jù)傳遞給cpu使用。

回調(diào)函數(shù)的核心作用:

  • 把數(shù)據(jù)從一個.c文件傳遞到另一個.c文件。

3.掌握回調(diào)函數(shù)的程序編寫

傳統(tǒng)寫法的缺點:

  • 1、移植性差
  • 2、實時性差
  • 3、功能代碼封裝難

回調(diào)函數(shù)寫法:

main.c代碼:

#include <stdio.h>
#include "key.h"?

void KeyScanHandle(KEY_ID_TYPEDEF KeyID,KEY_STATE_TYPEDEF KeyState)
{
//?? ?if(KeyID == KEY2)
//?? ?{
//?? ??? ?if(KeyState = KEY_PRESS)
//?? ??? ?{
?? ??? ??? ?
?? ??? ??? ?printf("KeyID=%d, KeyState=%d\r\n",KeyID,KeyState);
//?? ??? ?}
//?? ?}
}

int main(int argc, char *argv[])
{
?? ?KeyInit();
?? ?KeyScanCBSRegister(KeyScanHandle);
?? ?KeyPoll();
?
?? ?return 0;
}

key.c代碼:

#include "key.h"

KEY_ID_TYPEDEF keyVal;?? ?//按鍵ID
KEY_STATE_TYPEDEF keyState;?? ?

pKeyScanCallBack pKeyScanCBS;

void KeyInit()
{
?? ?keyVal = 0;
?? ?keyState = KEY_IDLE;
?? ?pKeyScanCBS = 0;
}?

void KeyScanCBSRegister(pKeyScanCallBack pCBS)
{
?? ?if(pKeyScanCBS == 0)
?? ?{
?? ??? ?pKeyScanCBS = pCBS;
?? ?}
}

void KeyPoll()
{
?? ?printf("Please Enter key value:");
?? ?if(scanf("%d",&keyVal)==1)
?? ?{
?? ??? ?printf("\r\n");
?? ??? ?printf("Please enter key state:");
?? ??? ?if(scanf("%d",&keyState)==1)
?? ??? ?{
?? ??? ??? ?if(pKeyScanCBS != 0)
?? ??? ??? ?{
?? ??? ??? ??? ?pKeyScanCBS(keyVal,keyState);
?? ??? ??? ?}
?? ??? ?}?? ??? ?
?? ?}
}

key.h代碼:

#ifndef _KEY_H_
#define _KEY_H_
typedef enum?
{
?? ?KEY1,
?? ?KEY2,?? ?
}KEY_ID_TYPEDEF;

typedef enum
{
?? ?KEY_IDLE,?? ?//空閑?
?? ?KEY_PRESS,?? ?//按鍵短按
?? ?KEY_LONG_PRESS,?? ?//按鍵長按
?? ?KEY_RELEASE,//按鍵釋放
?
}KEY_STATE_TYPEDEF;?

typedef void (*pKeyScanCallBack)(KEY_ID_TYPEDEF KeyID,KEY_STATE_TYPEDEF KeyState);
?
void KeyInit();
void KeyPoll();
void KeyScanCBSRegister(pKeyScanCallBack pCBS);
#endif

4.回調(diào)函數(shù)在產(chǎn)品中的應(yīng)用

根據(jù)收到的不同幀內(nèi)容,做出不同的功能

到此這篇關(guān)于C語言中回調(diào)函數(shù)的使用詳情的文章就介紹到這了,更多相關(guān)C語言回調(diào)函數(shù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C++中的策略模式淺析

    C++中的策略模式淺析

    策略模式屬于C++設(shè)計模式中行為模式之一,該模式定義了一系列算法,并將每個算法封裝起來,使它們可以相互替換。本文將通過示例詳細(xì)講解這一模式,需要的可以參考一下
    2023-02-02
  • 基于OpenCV讀取攝像頭實現(xiàn)單個人臉驗證MFC程序

    基于OpenCV讀取攝像頭實現(xiàn)單個人臉驗證MFC程序

    這篇文章主要為大家詳細(xì)介紹了基于OpenCV讀取攝像頭實現(xiàn)單個人臉驗證MFC程序,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • VS2019安裝配置MFC(安裝vs2019時沒有安裝mfc)

    VS2019安裝配置MFC(安裝vs2019時沒有安裝mfc)

    這篇文章主要介紹了VS2019安裝配置MFC(安裝vs2019時沒有安裝mfc),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • C/C++哈希表優(yōu)化LeetCode題解997找到小鎮(zhèn)的法官

    C/C++哈希表優(yōu)化LeetCode題解997找到小鎮(zhèn)的法官

    這篇文章主要為大家介紹了C/C++哈希表優(yōu)化題解997找到小鎮(zhèn)的法官示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • C語言細(xì)致講解線程同步的集中方式

    C語言細(xì)致講解線程同步的集中方式

    多線程中的線程同步可以使用,CreateThread,CreateMutex 互斥鎖實現(xiàn)線程同步,通過臨界區(qū)實現(xiàn)線程同步,Semaphore 基于信號實現(xiàn)線程同步,CreateEvent 事件對象的同步,以及線程函數(shù)傳遞單一參數(shù)與多個參數(shù)的實現(xiàn)方式
    2022-05-05
  • C語言數(shù)據(jù)結(jié)構(gòu)與算法之圖的遍歷(一)

    C語言數(shù)據(jù)結(jié)構(gòu)與算法之圖的遍歷(一)

    這篇文章主要是介紹了利用深度優(yōu)先算法實現(xiàn)圖的遍歷,文中利用圖文詳細(xì)的介紹了實現(xiàn)步驟,對我們學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu)與算法有一定的幫助,需要的朋友可以參考一下
    2021-12-12
  • C語言中cJSON的使用

    C語言中cJSON的使用

    JSON是一種輕量級的數(shù)據(jù)交換格式,常用于在網(wǎng)絡(luò)之間傳輸數(shù)據(jù),本文主要介紹了C語言中cJSON的使用,具有一定的參考價值,感興趣的可以了解一下
    2024-04-04
  • C++實現(xiàn)貪吃蛇游戲

    C++實現(xiàn)貪吃蛇游戲

    這篇文章主要為大家詳細(xì)介紹了C++實現(xiàn)貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 老生常談C++getline使用方法

    老生常談C++getline使用方法

    下面小編就為大家?guī)硪黄仙U凜++getline使用方法。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • 深度解析C語言中數(shù)據(jù)的存儲

    深度解析C語言中數(shù)據(jù)的存儲

    本文詳細(xì)介紹了C語言中數(shù)據(jù)的存儲,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05

最新評論

赤壁市| 治多县| 普兰县| 增城市| 杨浦区| 岳阳市| 秦皇岛市| 扶风县| 林西县| 内江市| 双江| 邢台县| 田林县| 望城县| 平舆县| 长阳| 沂南县| 呼玛县| 西盟| 土默特右旗| 商城县| 孝感市| 灌云县| 新安县| 泾阳县| 福泉市| 望城县| 松阳县| 青河县| 聂拉木县| 鹿邑县| 买车| 北碚区| 永年县| 宝丰县| 麻阳| 南木林县| 沙河市| 大名县| 玉溪市| 潍坊市|