ESP8266_RTOS_SDK發行版本v3.3-rc1環境搭建
在大學期間玩8266所接觸的都無作業系統版本的SDK,但後來接觸了ESP32後發現ESP8266也推出了RTOS版本,一直都沒來得及去更新版本,今天終於有時間了,技術永遠是向前進的,人也是,要不斷的追逐。
認識一下ESP8266 SDK
ESP8266 SDK
ESP8266 Software Development Kit (SDK)是樂鑫為開發者提供的物聯網(IOT)應用開發平臺,包括基礎平臺以及上層應用開發示例,如智慧燈、智慧開關等。
SDK的基礎平臺按照是否基於作業系統可分為:non-OS和RTOS兩種版本。
Non-OS SDK:
它是不基於作業系統的SDK,提供IOT_Demo和AT的編譯。Non-OS SDK主要使用定時器和回撥函式的方法實現各個功能事件的巢狀,達到特定條件下觸發特定功能函式的目的。Non-OS SDK使用espconn介面實現網路操作,使用者安裝espconn介面的使用規則進行軟體開發。
RTOS SDK
- 它是基於FreeRTOS,在GitHub上開源。
- RTOS版本SDK使用FreeRTOS系統,引入OS多工處理機制,使用者可以使用FreeRTOS的標準介面實現資源管理、迴圈操作、任務內延時、任務間資訊傳遞和同步等面向任務流程的設計方式。具體介面使用方法參考FreeRTOS官方網站的使用功能說明或者USING THE FreeRTOS REAL TIME KERNEL—A Practical Guide 介紹。
- RTOS版本SDK的網路操作介面是標準的lwIP API,同時提供了BSD Socket API介面的封裝實現,使用者可以直接安裝Socket API的使用方式來開發軟體應用,也可以直接編譯執行其他平臺的標準Socket應用,有效降低平臺切換的學習成本。
- RTOS版本SDK引入了CJSON庫,使用該庫函式可以更加方便的實現對JSON資料包的解析。
- RTOS版本相容non-OS SDK中WiFi介面、SmartConfig介面、Sniffer相關介面、系統介面、定時器介面、FOTA介面和外圍驅動介面,不支援AT實現。
安裝與測試
參考:
https://docs.espressif.com/projects/esp8266-r tos-sdk/en/latest/get-started/windows-setup.html
資料下載
下載工具鏈和sdk:
https://dl.espressif.com/dl/esp32_win32_msys2_environment_and_toolchain-20181001.zip
https://dl.espressif.com/dl/xtensa-lx106-elf-win32-1.22.0-100-ge567ec7-5.2.0.zip
https://github.com/espressif/ESP8266_RTOS_SDK/releases/tag/v3.3-rc1
下載完成
準備工具鏈
解壓esp32_win32_msys2_environment_and_toolchain-20181001.zip
雙擊msys32/mingw32.exe
在工具鏈中新增idf目錄,sdk路徑
D:\AAESP8266\AIDF\SDK\ESP8266_RTOS_SDK-v3.3-rc1
再次開啟msys32/mingw32.exe
輸入
printenv IDF_PATH
開始測試
將SDK\ESP8266_RTOS_SDK-v3.3-rc1\examples\get-started的hello_world複製到自己新建的資料夾ESP8266_RTOS_SDK-v3.3-rc1\dongpro中
在編譯工具開啟該資料夾
cd /d/AAESP8266/AIDF/SDK/ESP8266_RTOS_SDK-v3.3-rc1/dongpro/hello_world
配置工程
make menuconfig
報錯
make: *** 沒有規則可製作目標“check_python_dependencies”,由“menuconfig” 需求。 停止。
解決方法
python -m pip install --user -r $IDF_PATH/requirements.txt
此處如果遇到紅色報警,必須再次執行下載命令,直至成功
開始測試(再次)
配置工程
make menuconfig
配置你的串列埠和flash大小
儲存後退出
報錯
make:xtensa-lx106-elf-gcc:命令未找到
expr: syntax error: unexpected argument “5.2.0”
解決方法
將剛剛下載的xtensa-lx106-elf-win32-1.22.0-100-ge567ec7-5.2.0.zip解壓到msys32\opt目錄下
將它新增到工具鏈環境變數$PATH中,其方法與新增idf一樣
重啟工具鏈再次測試
配置工程
make menuconfig
清除工程
make clean
編譯工程
make all
編譯和燒寫工程
make flash
檢視串列埠輸出
make monitor
ESP8266下載準備:
將IO0接地,重啟即可進入下載模式
下載完後將IO0懸空,重啟即可開始執行程式
編譯完成
下載完成
檢視效果
為啥ESP8266波特率是74800,因為74800是裝置上電日誌列印的波特率,如果想更改下面的倒數計時等資料列印的波特率可以在工程中新增串列埠波特率初始化程式碼即可,如下:
#include "driver/uart.h"//匯入串列埠標頭檔案 uart_set_baudrate(UART_NUM_0,115200);//初始化波特率為115200
修改Hellow工程
1 #include <stdio.h> 2 #include "freertos/FreeRTOS.h" 3 #include "freertos/task.h" 4 #include "esp_system.h" 5 #include "esp_spi_flash.h" 6 #include "driver/uart.h"//匯入串列埠標頭檔案 7 void app_main() 8 { 9 uart_set_baudrate(UART_NUM_0,115200);//初始化波特率為115200 10 printf("Hello world!\n");//輸出程式設計師的標準問好 11 //晶片資訊 12 esp_chip_info_t chip_info; 13 esp_chip_info(&chip_info); 14 printf("東小東:This is ESP8266 chip with %d CPU cores, WiFi, ",chip_info.cores); 15 printf("silicon revision %d, ", chip_info.revision); 16 //flash資訊,大小和型別(外部) 17 printf("東小東:%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024), 18 (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external"); 19 //使用freertos計時函式倒數計時 20 for (int i = 10; i >= 0; i--) { 21 printf("東小東:Restarting in %d seconds...\n", i); 22 vTaskDelay(1000 / portTICK_PERIOD_MS); 23 } 24 printf("東小東:Restarting now.\n"); 25 fflush(stdout);//重新整理輸出 26 esp_restart();//重啟 27 }
最終效果:
8266的RTOS版本的注意事項
版本 1.5 版權 © 2017
l 建議使⽤定時器實現⻓時間的查詢功能,可將定時器設定為迴圈調⽤,注意:
1 定時器(freeRTOS timer 或 os_timer)執⾏函式內部請勿使⽤ while(1) 或其他能阻塞執行緒的⽅式延時,例如,不能在定時器回撥中進⾏ socket send 操作,因為send 函式會阻塞執行緒;
2 定時器回撥執⾏請勿超過 15 ms;
3 os_timer_t 建⽴的變數不能為區域性變數,必須為全域性變數、靜態變數或os_malloc 分配的指標。
l 從 ESP8266_RTOS_SDK_v1.2.0 起,⽆需新增巨集 ICACHE_FLASH_ATTR,函式將預設存放在 CACHE 區,中斷函式也可以存放在 CACHE 區;如需將部分頻繁調⽤的函式定義在 RAM 中,請在函式前新增巨集 IRAM_ATTR;
l ⽹絡程式設計使⽤通⽤的 socket 程式設計,⽹絡通訊時,socket 請勿繫結在同⼀端⼝;
l freeRTOS 作業系統及系統⾃帶的 API 說明請參考 http://www.freertos.org; 這裡要注意的是8266在建立任務的時候使用的是freertos自帶的字為單位,而ESP32中是以位元組為單位的。
l RTOS SDK 的系統任務最⾼優先順序為 14,建立任務的接⼝ xTaskCreate 為freeRTOS ⾃帶接⼝,使⽤ xTaskCreate 建立任務時,任務堆疊設定範圍為 [176,512]。
1 在任務內部如需使⽤⻓度超過 60 的⼤陣列,建議使⽤ os_malloc 和 os_free 的⽅式操作,否則,⼤陣列將佔⽤任務的堆空間;
2 SDK 底層已佔⽤部分優先順序:watchdog task 優先順序 14,pp task 優先順序 13,⾼精度 timer (ms) 執行緒優先順序 12,TCP/IP task 優先順序 10,freeRTOS timer 優先順序2,Wi-Fi event 優先順序為 2,idle task 優先順序為 0;
3 可供⽤戶任務使⽤的優先順序為 1 ~ 9;但注意,⽤戶任務請勿始終佔⽤ CPU,導致低優先順序的系統任務⽆法執⾏;
4 請勿修改 FreeRTOSConfig.h,此處修改頭⽂件並不能⽣效,設定由 SDK 庫⽂件決定。
樂鑫文件集合
https://www.espressif.com/zh-hans/support/documents/technical-documents
開源地址
https://github.com/espressif/ESP8266_RTOS_SDK
程式設計手冊
https://docs.espressif.com/projects/esp8266-rtos-sdk/en/latest/get-started/windows-setup.html
參考安裝文件