重要资源整理
乐鑫官网SDK下载地址:https://www.espressif.com/zh-hans
虚拟机软件 VmwareWorkStation (或者是 VirtualBox)
Lubuntu 镜像下载地址:http://downloads.espressif.com/FB/ESP8266_GCC.zip
固件烧录工具下载地址:http://wiki.ai-thinker.com/esp_download
AT固件:https://www.espressif.com/zhhans/products/hardware/esp-wroom-02/resources
开发方案
对我而言,选用乐鑫提供的SDK开发方案的理由
- SDK方式开发灵活
- 对于Linux并不陌生,可以更快熟悉开发环境
乐鑫SDK开发环境
Linux环境下进行项目程序的编译
Windows环境下进行代码的编译与烧写到esp8266
- flash_download_tools-->烧录程序
- Source Insight -->编辑工程代码
ps:通过虚拟机软件,创建虚拟机(linux)和物理机(windows)的共享目录,共享项目源码。
搭建环境
1. VMware导入.ova镜像文件
- 打开VMWare WorkStation, 点击“打开虚拟机”,选择要导入的ova文件;
- 点击确认后,会提示让你选择要导入的虚拟机的“存储路径”;设置完存储路径后,点击导入;
- 系统执行导入文件操作(如果ova文件很大的话,花费的时间也会较长);
- 导入完成后,点击打开虚拟机即可;
2. 创建共享目录
使用VMware创建共享目录(如果使用VirtualBox,有一个mount.sh的脚本)
了解Flash布局
有Non-FOTA和FOTA两种。我们选用带在线固件升级(FOTA)的这种Flash布局方案
Flash地址配置
烧写固件
1.安装驱动 Cp210xUSB
2.此时esp8266通过串口-usb连接电脑,我们使用flash_download_tools烧录程序,这里使用AT固件程序做测试
3.AT指令测试
下面开始真正的对乐鑫SDK开发的尝试!!!
RTOS_SDK
官方SDK提供两种框架: NONOS/RTOS
我选用带操作系统的框架,即带FreeRTOS内核的SDK
从官方下载SDK https://github.com/espressif/ESP8266_RTOS_SDK/releases/tag/v2.0.0
了解SDK目录
基于SDK开发,首先了解一下SDK的目录结构
一般常用的也就是bin、docements、driver_lib、examples、include这些工作目录。了解即可。
看到一篇博客讲的更详细一些:https://blog.csdn.net/yannanxiu/article/details/79495872
再了解esp8266的内存分布
了解esp8266的内存分布,更好的理解程序执行的机制
这篇博客讲的不错,mark一下:https://blog.csdn.net/espressif/article/details/78563753
关于FreeRTOS的使用
操作系统实现多任务的调度,至于怎样调度和内核调度算法的实现有关。这里简单了解一下,使用FreeRTOS如何实现多任务,以下是几个常用函数的名字
任务创建:xTaskCreate
任务延时:vTaskDelay
任务删除:vTaskDelete
任务实现:ATaskFunction //要指定的函数注册到任务创建中
任务优先级设定:vTaskPrioritySet
任务挂起:vTaskSuspend
函数原型还是查看相关手册的比较好。
完整开发流程
目的:实现串口输出"hello world"
1.在SDK目录下,将examples中选取一个示例代码作为基模板(将smart_config项目copy到一个新的app目录),然后进行开发。
2.通过共享目录,使用Source Insight进行代码的编辑。。第一步的代码往往很简单
//user_main.c文件
//部分代码
//......
/******************************************************************************
* FunctionName : ATaskHello
* Description : 实现"hello world"字符的串口打印输出
* Parameters : none
* Returns : none
*******************************************************************************/
void ATaskHello( void *pvParameters )
{
int iVariableExample = 0;
for(;;) //实现一个死循环
{
printf("hello word!\n");//打印hello world
vTaskDelay(100); //任务延时1s
}
vTaskDelete( NULL );
}
void ICACHE_FLASH_ATTR
user_init(void)
{
printf("SDK version:%s\n", system_get_sdk_version());
xTaskCreate(ATaskHello, "hello_world", 256, NULL, 2, NULL); //创建这个任务,ATaskHello是指向任务的句柄(指针)
}
3.Linux环境下编译
1>在项目目录下,首先要修改编译脚本 中定义的工程路径为实际路径
vim genmisc.sh
2>修改项目路径下的Makefile文件,添加编译规则
parent_dir:=$(abspath $(shell pwd)/$(lastword $(MAKEFILE_LIST)))
parent_dir:=$(shell dirname $(parent_dir))
parent_dir:=$(shell dirname $(parent_dir))
SDK_PATH= $(parent_dir)
BIN_PATH=$(SDK_PATH)/bin
3>编译项目,通过执行genmisc.sh脚本进行编译
4.烧写到模块
5.串口接收到 hello world信息
搞定!
Q&A
Q:Flash地址分布中,为什么有user1和user2两个主程序的空间?
A:云端升级需要2个 “bin” 文件,user1.bin 和 user2.bin 是 2 个不同的 BIN 文件。2个 BIN 文件是互补的,运行user1.bin 的时候,升级是下载 user2.bin;运行 user2.bin 的时候,升级是下载 user1.bin。这样可以保证升级过程中,如果有掉线的情况发生,设备还是可以正常运行。