• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • Tello talent無人機擴展模塊庫分析(default.ino)

    ?這個地方把ino后綴改成是cpp,不影響

    Ardunio的編程語言,原型是wring

    這個是官網的文章

    https://github.com/arduino/arduino-cli

     

    http://wiring.org.co/reference/https://blog.csdn.net/u011000290/article/details/50850171?utm_medium=distribute.pc_relevant.none-task-blog-title-6&spm=1001.2101.3001.4242https://arduino.github.io/arduino-cli/latest/sketch-build-process

    雖然有注釋,但是有點少.而且宏都是大寫

    一眼也看不出來,我處理一下

    處理好了

    這個地方是一些宏定義,在預編譯階段處理

    首先是__name__這樣的叫私有變量名,這里是開啟esp32的uart0做debug用

    具體這個我需要查esp32的資料

    可以看到是串口1做了這個工作

    這個SDK的版本是哪里

    鍵盤雙擊的間隔時間

    兩個函數聲明

    控制LED屏幕還是燈的一個參數

    查一下這個SDK的版本是什么意思

    去到了官網,現在做的真漂亮

    我們找ESP32,32的開發沒有non-os,比較不開心

    下文是具體的地址

    https://github.com/espressif/esp-idf/releases/tag/v1.0

    一直翻,到18年才是有了sdk1.0

    所以我覺得不是這個版本號

    可以稍微的看一眼日志

    我們來找一下sdk_version的出現的位置,這個是第二次出現

    是打印這個版本的信息。

    這個地方是第三次打印,是在一個串口的一個循環里面會

    這個地方是最后的一次出現

    最左邊出現這個紅色的小杠,點一下。

    會出現源碼里面做出更改的地方

    我這里用SI打開這個源碼

    起一個名字

    然后選擇源碼的位置

    選擇Add Tree選擇一下

    此時這個地方顯示ino文件

    檢測成了一個文本文件

    改成cpp后綴,在文章的最前面我就說過了。

    可以看到已經檢測到了

    有所有的函數列表

    tof飛行距離一開始設置為0

    這個程序寫的還是有點東西的

    一開始是一堆函數原型

    而且在寫法上面用空行分隔

    對8x8的屏幕

    tof傳感器

    版本函數

    普通的函數

    未知的版本

    總之就是一堆回調函數,現在就是看個函數名字也不知道是什么,

    繼續分析會知道

    這幾個函數看不懂

    這個是創建幾個對象

    RGB上面哪個燈

    就是這個!

    燈,矩陣燈

    游戲手柄

    Tof傳感器

    配對模式

    可以用SDK去控制飛機飛行


    到現在為止就創建了這么多的“對象”~~~

    配對任務句柄

    任務句柄

    tof傳感器電池讀取的任務句柄

    BLE低功率藍牙的任務句柄

    一個容納128個值得數組

    這個函數會返回傳感器的距離

    void IRAM_ATTR key_doubleclick(){    static uint32_t last_press_time = 0, now_press_time = 0;    static uint8_t key_toggle = 0;?    uint32_t interval;?    if (digitalRead(34) != 0)    {        return;    }?    if (last_press_time == 0)    {        last_press_time = millis();    }?    now_press_time = millis();?    interval = now_press_time - last_press_time;?    if ((interval > 50) && (interval < DOUBLECLICK_INTTERVAL_TIME))    {        if (!key_toggle)        {            CommonSerial.printf("[TELLO] motoron");#ifdef __DEFAULT_LOG__            Serial.printf("[TELLO] motoron");#endif        }        else        {            CommonSerial.printf("[TELLO] motoroff");#ifdef __DEFAULT_LOG__            Serial.printf("[TELLO] motoroff");#endif        }        key_toggle = !key_toggle;    }    last_press_time = now_press_time;}

    這個程序比較長,我直接

    先縮進看一看

    鍵雙擊?

    什么時候使用iram_attr


    你提出了一個很好的問題。這是我的理解,其中可能包含錯誤或不完整,是糾正我自己思想的機會。

    ESP32基于哈佛架構,這意味著有兩條總線...一條用于指令,一條用于數據。松散地,從數據總線獲取0x4000 0000以南的地址空間,而從0x4000 0000到0x4FFF FFFF的地址空間(如果我沒記錯的話)來自指令總線。

    現在想象一下一個64K頁面的RAM。與其他環境中的那一頁RAM“僅存在”在固定地址空間位置的環境不同,在ESP32上,我們具有MMU(內存映射單元),可以使64K頁的真實RAM映射到不同的地址位置。這意味著我們可以擁有可以從數據總線讀取的RAM或可以從指令總線讀取的RAM。

    這就引出了一個問題,您將把什么放入可從指令總線讀取的RAM?答案是(如果我理解正確的話)...指令(可執行代碼)。

    當我們編譯C源文件時,我們最終得到一個目標文件,然后將其鏈接以生成可執行文件。在編譯期間,已編譯的C的不同“部分”將放置在目標文件的不同“部分”中。例如,代碼進入“ .text”部分,而初始化數據進入“ .data”部分。通過用“ IRAM_ATTR”標記一段代碼,我們聲明編譯后的代碼將放置在一個名為“ .dram.text”的部分中(我正在做這個,因為我沒有手工引用)。這意味著,除了具有“ .text”和“ .data”部分的可執行文件之外,還有其他部分。ESP32引導加載程序在啟動時將復制那些“ .dram.text” 在啟動對應用程序的控制之前,在啟動時將它們放入真正的RAM中。然后將RAM映射到指令區地址空間(> 0x4000 0000)。這意味著可以將控件從正常運行的應用程序中傳遞給此代碼(通常),并且它將“起作用”,因為該代碼位于指令總線地址空間中。

    現在剩下的就是“為什么”要這樣做?答案是考慮替代方案。如果您要運行的代碼不在RAM中,那么它還能在哪里?答案是“閃存”……如果它在閃存中,則當接收到執行該代碼的請求時,必須從那里執行該代碼。ESP32上的Flash比RAM訪問慢得多...因此有一個內存緩存可用于解決其中的某些問題...但是我們無法確定當我們跳轉到一段代碼時它會存在于緩存中,因此可能需要從閃存緩慢加載。

    現在我們開始討論……如果我們要運行的代碼是中斷服務程序(ISR),我們總是希望盡快進入和退出它。如果我們必須在ISR中“等待”閃存中的負載,那么事情將會變得非常錯誤。通過將某個功能標記為存在于RAM中,我們就可以有效地犧牲寶貴的RAM,因為它知道對它的訪問將是最佳的并且是恒定的。

    分析的已經很明白了,還有一小點。我們分析完這個函數就到此為止。

    這段也簡單,我就寫個注釋。不分析了

    這個是i2c的初始化是沒有初始化的~

    這個判斷的有點奇怪。這個寫法emmmmm

    初始化

    自己看吧

           作用域符號::的前面一般是類名稱,后面一般是該類的成員名稱

    Initialize the Matrix and show a TT Logo,初始化矩陣和顯示一個TT Logo
     

    開始顯示圖案

    調用的是I2C總線

     

     

    版權聲明:本文為qq_33000789原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/qq_33000789/article/details/109565861

    智能推薦

    【無人機】PX4,源碼簡要分析

    看看源碼目的很單純,就是想有沒有控制方面的代碼可以移植到其它地方。 【無人機】PX4,ubuntu18仿真運行 從官網可能下載代碼不全,這是編譯完成的源碼,有點大!!!!  打開源碼。前兩個暫時不用管。 更多看驅動源碼下的 modules文件。   例如:箭頭所指文件:姿態解算文件。下面有很多。唉,這源碼寫的剛接觸還真。。。剛剛接觸結構還沒懂。  姿態解算,涉及很多,...

    大疆小飛機Tello在Win10 中的完整安裝及填坑tip(親測有效)

    Tello小飛機 1、Tello-SDK下載 2、安裝 install.bat雙擊自動化安裝、半天沒下下來、卒。 3、手動下載 3.1 python2.7.15 這個安裝就不多說了,官網 https://www.python.org/ftp/python 選擇python-2.7.15.amd64.msi下載安裝 3.2 openCV 3.2 3.2.1 下載openCV 3.2.exe 并解壓安...

    無人機目標跟蹤

    跟蹤 半年之前研究了相關的內容,其中有一部分是對無人機目標進行跟蹤,就做了一個非常簡單的demo,鏈接就是公布在github上的演示例子。算法沒有很難,也不需要什么先驗知識。 以下是結果展示:                              ...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    freemarker + ItextRender 根據模板生成PDF文件

    1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...

    猜你喜歡

    電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!

    Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...

    requests實現全自動PPT模板

    http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...

    Linux C系統編程-線程互斥鎖(四)

    互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...

    統計學習方法 - 樸素貝葉斯

    引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...

    精品国产乱码久久久久久蜜桃不卡