一、esp-open-rtos概要
Esp-open-rtos是開源的、基于freertos的、用于ESP8266固件的開發支援環境。最早是從樂鑫官方的ESP8266_RTOS_SDK基礎上fork而來,但是目前的代碼、架構已經和原SDK相去甚遠,有了大幅的變化。從代碼結構、編譯方法、支撐庫等均有不同,而且内置了更多的常見傳感器驅動,以及MQTT、TLS、甚至OTA等常用的功能子產品。相比官方同樣的RTOS SDK、感覺更好用、更便利、開發應用速度更快。
目前,esp-open-rtos在github上獲得了550多個STAR,足以證明其被認可的程度。
Github位址:https://github.com/SuperHouse/esp-open-rtos
Esp8266的項目較多,容易混淆,總結如下:
- 1) esp-open-sdk esp8266編譯工具鍊
- 2) esp-open-rtos 基于FreeRTOS的esp8266固件
- 3) ESP8266_NONOS_SDK 樂鑫官方非OS版本固件、帶AT固件
- 4) ESP8266_RTOS_SDK 樂鑫官方RTOS固件(基于FreeRTOS)
- 5) nodemcu-firmware NodeMCU的lua固件
- 2~5均使用同樣的編譯工具鍊1。
二、esp-open-rtos安裝
1、編譯工具鍊的建立(toolchain)
交叉編譯工具鍊和樂鑫官方SDK相同,均使用esp-open-sdk。
安裝方法可參照前面文章:【ESP8266固件的編譯1(交叉編譯工具鍊的建立)】。
簡便起見,推薦使用【make STANDALONE=y】。
2. 代碼下載下傳
如下指令從github上下載下傳代碼。
git clone --recursive https://github.com/Superhouse/esp-open-rtos.git
使用recursive,可以将依賴的第三方代碼一起擷取。
三、代碼編譯
樂鑫官方的RTOS SDK是先編譯底層支撐代碼,以庫的形式提供。
應用層通過連接配接庫的的方式和底層代碼連結在一起,build為bin,存在兩個階段。
具體可參照前文:
【ESP8266固件的編譯5(RTOS SDK固件)】
但eps-open-rtos采用了另外一種方式,它沒有底層代碼編譯庫的過程。
而是以應用為中心,每個應用都會将所有底層代碼複制一份
(從FreeRTOS到lwip,再到各種依賴庫和應用層代碼)每個應用都會複制并編譯屬于自己的這份,
并和自身的應用層代碼一起編譯。(其實最終也會通過庫的形式,但是編譯過程是一體化的)
另外Esp-open-rtos的編譯采用make,擺脫了cmake,感覺清爽、瘦身很多。
編譯時可通過make help來看到編譯相關的幫助,尤其是make flash。
非常重要的是,
Esp-open-rtos在examples目錄下提供了很多例子(很贊),上手可以很快。
1、編譯準備
在編譯之前,需要在include目錄下,建立private_ssid_config.h檔案,
來預定義系統預設wifi參數,内容如下:
#define WIFI_SSID "mywifissid"#
define WIFI_PASS "my secret password"
2. mqtt_client的編譯
上面已經說明過,esp-open-rtos以應用為中心編譯,
下面以mqtt_client為例進行說明
編譯方法1,在esp-open-rtos根目錄下,執行
make -C examples/mqtt_client/
編譯方法2,進入到examples/mqtt_client目錄下,直接執行
make
3. esp8266的相關參數設定
系統預設的esp8266相關的參數,如SPI類型、Flash大小等,定義在根目錄下的parameters.mk中,如下:
FLASH_SIZE ?= 16
FLASH_MODE ?= qio
FLASH_SPEED ?= 40
?= 是make的文法,意為如果沒有定義,就使用=後的值做指派,相當于預設參數。
如果目标硬體(ESP8266模組)固定,可以直接修改此檔案。
若目标硬體經常變化,如經常切換ESP01和ESP12,也可以修改應用目錄下的Makefile檔案進行配置:
PROGRAM=mqtt_client
FLASH_SIZE ?= 32
FLASH_MODE ?= qio
EXTRA_COMPONENTS = extras/paho_mqtt_c
include ../../common.mk
因使用安信可的ESP12F子產品,是以将FLASH_SIZE修改為32,
如使用nodeMCU,除FLASH_SIZE外,還要将FLASH_MODE改為dio。
注意EXTRA_COMPONENTS宏,是esp-open-rtos的Make體系中指明依賴元件的宏,
所有需要依賴的擴充都要定義在該宏中(空格分隔)
這裡可以看出,mqtt的協定是使用的Apache Paho(根據esp8266移植過)
MQTT本身的參數設定,可在在mqtt_client.c中修改。
編譯成功後,在examples/mqtt_client/ firmware目錄下,
會生成名為mqtt_client.bin的固件檔案。
4. mqtt_client代碼解析
mqtt_client的代碼簡單且結構清晰:
主函數啟動3個task,分别是:
- wifi管理task
- mqtt管理task
- 以及mqtt連接配接成功後定時pub的測試task
wifi_alive是一個信号燈(semaphore),用于協調wifi task和 mqtt task,以保證網絡正常後再進行mqtt處理。
publish_queue是一個消息隊列,用于beat_task和mqtt task間的資料傳遞,用于定時向【/beat】主題釋出。
另外,mqtt task中在mqtt連接配接建立後,會訂閱【esptopic】主題,并顯示收到的消息。
下面是入口函數user_init的實作。
void user_init(void)
{
uart_set_baud(, );
printf("SDK version:%s¥n", sdk_system_get_sdk_version());
vSemaphoreCreateBinary(wifi_alive);
publish_queue = xQueueCreate(, PUB_MSG_LEN);
xTaskCreate(&wifi_task, "wifi_task", , NULL, , NULL);
xTaskCreate(&beat_task, "beat_task", , NULL, , NULL);
xTaskCreate(&mqtt_task, "mqtt_task", , NULL, , NULL);
}
四、固件下載下傳(刷寫)
因為esp-open-rtos内置了esptool.py,可用make flash進行直接做固件重新整理。
但在windows上,還是使用官方的下載下傳工具更加友善。
關于固件下載下傳工具的使用,可參照前文【ESP8266固件的編譯5(RTOS SDK固件)】。
和其他固件的重新整理方法一樣,但寫入位址方面,和樂鑫官方、nodemcu差别較大。
觀察make flash的指令輸出:
esptool.py -p /dev/ttyUSB0 --baud write_flash -fs m -fm qio -ff m
x0 ../../bootloader/firmware_prebuilt/rboot.bin x1000 ../../bootloader/firmware_prebuilt/blank_config.bin x2000 ./firmware/mqtt_client.bin
可以看到,出mqtt_client.bin外,還要刷入預置的,
存放于bootloader/firmware_prebuilt目錄下rboot.bin和blank_config.bin。
其寫入位址為:
rboot.bin
blank_config.bin
mqtt_client.bin
如下圖:

刷入後,如網絡征程,即可以看到wifi連接配接成功後,mqtt的通信狀況。
ESP8266側如圖:
框内内容分别是,wifi接入,mqtt接入,和收到mqtt消息。
服務端可用如下指令測試(mosquitto):
釋出:
mosquitto_pub -u test -P test -t /esptopic -m "hello world"
接收:
mosquitto_sub -u test -P test -t /beat
可以看到收到連續的beat消息。
如上,mqtt在esp8266上非常容易的便可被實作,而且還有多task的支援。
增加傳感器,将讀取資料通過mqtt送出,即可實作簡單的IoT系統。
而且,esp-open-rtos對常見傳感器(溫度、光線 etc.)的驅動支援也相當不錯。
examples目錄下有例子,extras目錄下有協定實作。