聊聊ESP8266的SDK(ESP8266_RTOS_SDK v3.3 环境搭建)
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一样
两个PATH其实有替换效果,第3行的PATH应该删除,只保留第4行的内容
重启工具链再次测试
配置工程
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
参考安装文档