为了开发的方便,还是习惯性配一下Eclipse的环境。这里选择了安信可的方案。官网的介绍。。。
安信可 ESP 系列一体化开发环境是安信可科技为方便广大用户而推出的基于 Windows + Cygwin + Eclipse + GCC 的综合 IDE 环境。
管理员权限打开配置软件,配置好各个路径即可。
- exlipse
- cygwin
- IDF
导入makefile project。
- 选择 File→Import
- 点开C/C++分支,并选中Existing Code as Makefile Projec
- 去除C++支持,选中Cygwin GCC
- 点击Browser,选中 esp-idf-template所在的目录
- 点击Finish完成 esp-idf-template的导入
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "nvs_flash.h"
void helloworld_task(void *pvParameter)
{
while(1)
{
printf("Hello world!\r\n");
vTaskDelay(1000 / portTICK_RATE_MS); //间隔 1000 ms
}
}
void app_main()
{
nvs_flash_init(); //nvs flash 初始化
system_init(); //系统初始化
printf("Creat Hello World task \r\n");
xTaskCreate(&helloworld_task, "&helloworld_task", 2048, NULL, 5, NULL); //创建 hello world 任务
}
xTaskCreate是创建任务,任务是FreeRTOS中的基本概念,用RTOS构建的实时程序是由一系列的任务组成的。ESP32的xTaskCreate的函数文档说明如下:
BaseType_t xTaskCreate(
TaskFunction_t pvTaskCode,//任务的代码入口&helloworld_task
const char * const pcName,//任务名字:&helloworld_task
uint16_t usStackDepth,//任务的堆栈大小:2048
void *pvParameters,//指针
UBaseType_t uxPriority,//优先级:5
TaskHandle_t *pvCreatedTask//回传句柄
);
任务有四个状态:
- 运行
- 就绪:资源不够,等待较高优先级的任务结束分资源的状态
- 阻塞:任务中有调用其它任务,比如上述调用的vTaskDelay()。任务在等待队列、信号量、事件组、通知、信号量事件时都会处在阻塞态。通常,这些等待都会设置一个超时
timeout
时间,当等待超时是将任务从阻塞态推出,防止任务被无线挂起。 - 挂起
freeRTOS使用队列、信号量、互斥量、任务通知完成任务间数据共享和通信。
ESP32的启动过程:
- 在 ROM 中的第一阶段的 bootloader 从 flash 偏移地址 0x1000 处加载第二阶段的 bootloader 到 RAM 中。
- 第二阶段的 bootloader 从 flash 上面加载分区表和主应用程序镜像。主应用程序包含 RAM 段和通过 flash cache 映射的只读段
- 主应用程序镜像开始执行。此时,第二个 CPU 以及 RTOS 调度器开始启动。
打印分区表。
$ make partition_table
Partition table binary generated. Contents:
*******************************************************************************
# Espressif ESP32 Partition Table
# Name, Type, SubType, Offset, Size, Flags
nvs,data,nvs,0x9000,24K,
phy_init,data,phy,0xf000,4K,
factory,app,factory,0x10000,1M,
*******************************************************************************