
看這個宏

在這里啟用

注意這種宏開關的用法,以及編譯條件的使用。

使用這樣的頭把彼此連接在一起

在引入頭的時候,利用面向對象寫法,將這些組件都一一生成。
下面是:
ESPCOPTER esp;
引入的是這個頭

這些都是各種輸出的控制功能

如果崽深入,其實會知道到底是什么樣的功能。
其實我這里想講一下arduino.h這個神奇的頭文件。

在esp8266的實現里面在這里。

上面是GCC(默認的頭文件),下面都是相對文件


不要以為就是簡單是調用一個函數那么簡單,后面的東西是很復雜的

后面還有頭文件去完成這個復雜的封裝過程

這是對與一個Pinmode功能的一些封裝

常見的一些換算參數


在最后是,偷偷的為你隱式的添加arduino的方法,比如你換各板子為什么就能引腳就可以變換了呢?就是這個pins的作用。

這個ESP8266的和我們別的板子不一樣

目錄在這里,名字叫變種。我會慢慢說清楚里面的作用。

接著是TOF傳感器

全網最便宜啊,兄弟!我其實還想給相機做一個

這個的封裝是一個單獨的傳感器
VL53L0X激光測距傳感器.Arduino使用篇
VL53L0X激光測距傳感器.介紹篇
VL53L0X激光測距傳感器.Mind+使用篇
VL53L0X激光測距傳感器.ESP32使用篇
害,早寫過了(凡爾賽)不過現在的功力比以前牛逼多了,我有時間重寫一下下。
無人機實現了一個功能,就是可以插各種傳感器使用,而且每次插的不一樣,起作用也不一樣。
那么咋實現的呢?其實使用的是IIC的地址,然后就是掃描功能。

只有兩個函數而已

類型上面還是進行了二次封裝

IIC的初始化,其實。。。這個函數內部是跳到ESP8266的IIC的

就是這個

這些的話,函數跳轉不了,看名字是RTOS的。

私有的類先說明SDA,SCL等的一開的電平

這是模擬的時序信號


強制內聯展開
在ARM系統下,可以給函數增加__attribute__((always_inline))屬性讓inline函數可以強制展開,但是僅限于ARM,因為attribute是GNU C特色之一。所以其實不太了解win系統下怎么使用強制內聯展開。
static?inline?__attribute__((always_inline))?void?f()慎用 inline
內聯能提高函數的執行效率,為什么不把所有的函數都定義成內聯函數?如果所有的函數都是內聯函數,還用得著"內聯"這個關鍵字嗎?
內聯是以代碼膨脹(復制)為代價,僅僅省去了函數調用的開銷,從而提高函數的執行效率。
如果執行函數體內代碼的時間,相比于函數調用的開銷較大,那么效率的收獲會很少。另一方面,每一處內聯函數的調用都要復制代碼,將使程序的總代碼量增大,消耗更多的內存空間。
經查閱反匯編代碼后發現,可能會出現以下問題:
1、匯編代碼中出現長跳轉(因為代碼過長),較短跳轉更耗時;
2、寄存器不夠,因為所有代碼都在一個文件中,原本在函數中可以在棧內解決的變量需要額外寄存器。
以下情況不宜使用內聯:
(1)如果函數體內的代碼比較長,使用內聯將導致內存消耗代價較高。
(2)如果函數體內出現循環,那么執行函數體內代碼的時間要比函數調用的開銷大。
總結
內聯函數并不是一個增強性能的靈丹妙藥。只有當函數非常短小的時候它才能得到我們想要的效果;但是,如果函數并不是很短而且在很多地方都被調用的話,那么將會使得可執行體的體積增大。
最令人煩惱的還是當編譯器拒絕內聯的時候。在老的實現中,結果很不盡人意,雖然在新的實現中有很大的改善,但是仍然還是不那么完善的。一些編譯器能夠足夠的聰明來指出哪些函數可以內聯哪些不能,但是大多數編譯器就不那么聰明了,因此這就需要我們的經驗來判斷。如果內聯函數不能增強性能,就避免使用它!
在 c/c++ 中,為了解決一些頻繁調用的小函數大量消耗棧空間(棧內存)的問題,特別的引入了 inline 修飾符,表示為內聯函數。
棧空間就是指放置程序的局部數據(也就是函數內數據)的內存空間。
在系統下,棧空間是有限的,假如頻繁大量的使用就會造成因棧空間不足而導致程序出錯的問題,如,函數的死循環遞歸調用的最終結果就是導致棧內存空間枯竭。

IIC這塊全都使用的是強制內聯
使用指定的地址開始向I2C從設備進行傳輸。
在調用了Wire.beginTransmission(address)函數之后,使用write()函數對要傳輸的字節進行隊列,并通過調用endTransmission()進行傳輸。
Wire.beginTransmission(address)
address: 要傳輸數據的目的設備的7位地址

用了遍歷的土辦法,一個地址一個地址摸一邊。

這個函數我理解不了是實現的。
停止與從機的數據傳輸:
Wire.endTransmission()Wire.endTransmission(stop)
stop(bool): 參數值為true時將在請求后發送停止指令并釋放總線;參數值為false時將在請求后發送重新啟動的指令,保持連接狀態。
返回值類型:byte
返回傳輸的狀態值:
0: 成功
1: 數據量超過傳送緩存容納限制
2: 傳送地址時收到 NACK
3: 傳送數據時收到 NACK
4: 其它錯誤

如果是0,就成功:

把地址打印出來。

找到了激光傳感器?,下面的寫法都一樣。

最后掃尾,一個也沒有找到的時候。

串口的初始化。

這里的話是串口的初始化,我不理解這種寫法,不就是變參嗎?

在里面的實現其實是調用了ESP8266的UART初始化,相當于在這里是包裝。

這個地方很復雜我看了一下,我繼續讀。

這里的PinMode函數的封裝我覺得很好:

大致可以看下是一個和寄存器打交道的文件。
volatile uint32_t *const esp8266_gpioToFn[16] PROGMEM ={&GPF0, &GPF1, &GPF2, &GPF3,&GPF4, &GPF5, &GPF6, &GPF7,&GPF8, &GPF9, &GPF10, &GPF11,&GPF12, &GPF13, &GPF14, &GPF15};
一開始就是一個數組指針。

很有結構感

繼續展開:

這里我就不詳細說,大致邏輯就是去匹配輸入的參數,當你輸出一個功能,通過位運算去操作具體的寄存器。

順便可以把這個數字引腳的讀也看了。

因為需要4PWM+3LED+1Buzzer的接口,提前這里就設置輸入。

燈的引腳

對燈的管理

啟用和使用的方法

內存塊每次用EEPROM.begin(size)讀入緩存里,讀入的大小由size決定,該數值范圍為(4-4096),每次讀入的這個EEPROM塊都是從ROM的0地址開始的。比如,你的size是1024字節,那么讀入的EEROM的塊地址是從0-1023這個塊。所以如果就你自已用時,你愛讀多少就讀多少,每次都從0地址開始用。
讀入緩存:

AHRS是無人機的精華,我寫不完了。

從函數里面讀取掛載的傳感器:

最后綠燈亮,無異常。

如果定義了這個宏。

最后執行這個
https://blog.csdn.net/weixin_45499326/article/details/109555894https://blog.csdn.net/m0_37616597/article/details/104138980