天天看點

9. ESP8266使用esp-open-rtos的實踐

一、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         
           

如下圖:

9. ESP8266使用esp-open-rtos的實踐

刷入後,如網絡征程,即可以看到wifi連接配接成功後,mqtt的通信狀況。

ESP8266側如圖:

9. ESP8266使用esp-open-rtos的實踐

框内内容分别是,wifi接入,mqtt接入,和收到mqtt消息。

服務端可用如下指令測試(mosquitto):

釋出:

mosquitto_pub -u test -P test -t /esptopic -m "hello world"

接收:

mosquitto_sub -u test -P test -t /beat

可以看到收到連續的beat消息。

9. ESP8266使用esp-open-rtos的實踐

如上,mqtt在esp8266上非常容易的便可被實作,而且還有多task的支援。

增加傳感器,将讀取資料通過mqtt送出,即可實作簡單的IoT系統。

而且,esp-open-rtos對常見傳感器(溫度、光線 etc.)的驅動支援也相當不錯。

examples目錄下有例子,extras目錄下有協定實作。