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