重要资源整理

乐鑫官网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镜像文件

  1. 打开VMWare WorkStation, 点击“打开虚拟机”,选择要导入的ova文件;
  2. 点击确认后,会提示让你选择要导入的虚拟机的“存储路径”;设置完存储路径后,点击导入;
  3. 系统执行导入文件操作(如果ova文件很大的话,花费的时间也会较长);
  4. 导入完成后,点击打开虚拟机即可;


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。这样可以保证升级过程中,如果有掉线的情况发生,设备还是可以正常运行。