您好,登錄后才能下訂單哦!
這篇“C語言的回調(diào)函數(shù)如何使用”文章的知識點(diǎn)大部分人都不太理解,所以小編給大家總結(jié)了以下內(nèi)容,內(nèi)容詳細(xì),步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“C語言的回調(diào)函數(shù)如何使用”文章吧。
一個好的程序架構(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ù)取出來解析。
但是這種方法存在實(shí)時性差和移植性差的問題,比如說需要把串口的硬件層封裝起來給客戶使用,不能讓客戶看到實(shí)現(xiàn)的源碼,只能提供函數(shù)接口給客戶使用,不可能通過告訴客戶先判斷哪個變量為1,然后在取哪個數(shù)組中的數(shù)據(jù)這種做法。
在這里就需要回調(diào)函數(shù)了。
在stm32中,像外部中斷、定時器中斷、串口中斷都有點(diǎn)類似回調(diào)函數(shù),這種函數(shù)的目的是把采集到的數(shù)據(jù)傳遞給cpu使用。
回調(diào)函數(shù)的核心作用:
把數(shù)據(jù)從一個.c文件傳遞到另一個.c文件。
傳統(tǒng)寫法的缺點(diǎn):
1、移植性差
2、實(shí)時性差
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
根據(jù)收到的不同幀內(nèi)容,做出不同的功能
以上就是關(guān)于“C語言的回調(diào)函數(shù)如何使用”這篇文章的內(nèi)容,相信大家都有了一定的了解,希望小編分享的內(nèi)容對大家有幫助,若想了解更多相關(guān)的知識內(nèi)容,請關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。