===================Function-Interrupt應(yīng)用分析===================
Functional-Interrupt應(yīng)用功能與前一篇GPIO-Interrupt其實(shí)實(shí)現(xiàn)的功能是一樣的,區(qū)別就是,他是C++版本的實(shí)現(xiàn),而且你要知道Arduino中大部分的中間件都是基于C++的實(shí)現(xiàn),而自古C與C++是不分家的,所以我決定挑戰(zhàn)一下我的軟肋,來分析一下這個(gè)C++應(yīng)用的實(shí)現(xiàn)思路。
===================接下來進(jìn)入C++閑聊模式=====================
我覺得你既然會(huì)C,那么你必須會(huì)C++~!?。樯兑@么說?
你學(xué)C已經(jīng)付出了很多的艱辛,其實(shí)距離C++可能就剩下捅破十張窗戶紙的距離,努力一把它會(huì)給你開啟編程界的新大門。C++的復(fù)雜程度其實(shí)在于其實(shí)現(xiàn)的機(jī)制,我相信工作多年你已經(jīng)過了好奇寶寶的年紀(jì),更關(guān)注于實(shí)際的應(yīng)用。
知識(shí)點(diǎn)一:C++中一切皆對象(其實(shí)就是幻象):C語言中的就是結(jié)構(gòu)體類型變量。
結(jié)構(gòu)體類型變量(C語言)≈ 對象(C++語言)。
當(dāng)然一個(gè)簡單的變量也可以看作是一個(gè)對象,但是這么來看其實(shí)就失去了對象的意義。
struct ≈ class :主要用來定義結(jié)構(gòu)體或者類。
知識(shí)點(diǎn)二:C++很討厭全局變量(雖然我很喜歡),于是他引入了訪問權(quán)限,最常用的就是
public 和private 權(quán)限修飾符。他們主要是規(guī)定了對象內(nèi)部的屬性和方法可以調(diào)用的空間。
public權(quán)限修飾后,可以在對象外部調(diào)用。
private權(quán)限修飾后,只能在對象的內(nèi)部使用。
知識(shí)點(diǎn)三:class類對比與struct有兩個(gè)特殊得函數(shù),一個(gè)叫構(gòu)造函數(shù),一個(gè)叫析構(gòu)函數(shù)。
構(gòu)造函數(shù):在創(chuàng)建一個(gè)對象的時(shí)候被自動(dòng)調(diào)用。
析構(gòu)函數(shù):在銷毀一個(gè)對象的時(shí)候被調(diào)用。
只有對象是以動(dòng)態(tài)分配內(nèi)存的方式創(chuàng)建,才有被析構(gòu)的機(jī)會(huì),搞過多年軟件的我,還是建議你能用靜態(tài)就用靜態(tài),不要在乎那點(diǎn)RAM開銷,不行就換片子。
知識(shí)點(diǎn)四:std開頭的函數(shù)(std代表C++特有)
注解:isr是一個(gè)標(biāo)準(zhǔn)的函數(shù),但是他綁定的時(shí)候是在類中進(jìn)行的,實(shí)際執(zhí)行的應(yīng)該是特定對象的isr,但是在這里綁定的時(shí)候?qū)ο筮€沒出生呢,于是用this指針綁定,這樣isr外部調(diào)用的時(shí)候,調(diào)用的主體是對象。(有點(diǎn)點(diǎn)繞)
================更改軟件并燒錄測試========================
1. 軟件更改button編號(hào):
2. 燒錄到我們的ESP32開發(fā)板中,并連接串口:
3. 測試接線說明:
4. 串口測試數(shù)據(jù)輸出:
===================ESP32補(bǔ)充篇GPIO-API應(yīng)用===================
閑聊過后,還是來詳細(xì)介紹一下GPIO相關(guān)的功能函數(shù),先看一下工程下關(guān)于GPIO-API定義的文件,esp32-hal-gpio.h文件(看到hal的一瞬間,讓我想起來溫暖的STM32hal庫):
=======================================================1. void pinMode(uint8_t pin,uint8_t mode);
函數(shù)功能:引腳模式設(shè)置
pin參數(shù):IO號(hào)(注意不是引腳編號(hào))
mode參數(shù):IO模式:
INPUT: 數(shù)字輸入
INPUT_PULLUP: 帶內(nèi)上拉數(shù)字輸入
OUTPUT: 數(shù)字輸出
返回值:無
2. void digitalWrite(uint8_t pin,uint8_t value);
函數(shù)功能:設(shè)置引腳輸出電平
pin參數(shù):IO號(hào)(注意不是引腳編號(hào))
value參數(shù):設(shè)置引腳輸出電平HIGH(高)或LOW(低)
返回值:無
3. int digitalRead(uint8_t pin);
函數(shù)功能:讀取引腳電平狀態(tài)。
pin參數(shù):IO號(hào)(注意不是引腳編號(hào))
int返回值:返回引腳的電平
HIGH:高電平
LOW:低電平
4.void attachInterrupt(uint8_t pin, void (*)(void), int mode);
函數(shù)功能:中斷綁定功能
pin參數(shù):IO號(hào),綁定引腳編號(hào)。
void (*)(void)參數(shù):函數(shù)指針,指向中斷服務(wù)函數(shù)。
mode參數(shù):中斷模式。
5.void attachInterruptArg(uint8_t pin, void (*)(void*), void * arg, int mode);
這個(gè)API函數(shù)與上面一個(gè)API函數(shù)非常相似,所以我們只講不同之處,首先這個(gè)綁定的中斷服務(wù)例程是一個(gè)帶傳參的例程。
首先第二個(gè)函數(shù)的指針類型有變化,參數(shù)由void類型變?yōu)榱藇oid*類型,意義完全發(fā)生了變化,這是一個(gè)帶參數(shù)的函數(shù)指針類型,參數(shù)類型為void * 。
這里就不難理解API在函數(shù)指針的后面多了一個(gè)void * 類型的參數(shù)arg,這個(gè)參數(shù)正是我們函數(shù)指針用到的參數(shù),也就是第三個(gè)參數(shù)為第二個(gè)參數(shù)服務(wù)。
關(guān)于void * 類型參數(shù),首先這個(gè)參數(shù)是一個(gè)指針類型,而且是一個(gè)void指針類型,也就代表著,你可以是任意類型指針都可以。
6. void detachInterrupt(uint8_t pin);
函數(shù)功能:解除中斷引腳綁定功能。
pin參數(shù):解除具體引腳IO號(hào)。
返回值:無。