ESP32:hello world

裂变
• 阅读 4504

前面一篇文章已构建了开发环境,接下来基于已有的环境,构建第一个应用程序。首先创建一个存放工程的目录,接下来直接将sdk目录下的hello world例子内容拷贝到该目录。内容如下:

$ tree
.
├── main
│   ├── component.mk
│   └── hello_world_main.c
├── Makefile
├── sdkconfig
└── sdkconfig.old

1 directory, 5 files

因为原先的例子是要重启系统的,稍微更改一下程序,使其每隔一秒钟计数即可,修改后内容如下:

/* Hello World Example

   This example code is in the Public Domain (or CC0 licensed, at your option.)

   Unless required by applicable law or agreed to in writing, this
   software is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
   CONDITIONS OF ANY KIND, either express or implied.
*/
#include <stdio.h>

#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_spi_flash.h"


void app_main()
{
    printf("Hello world!\n");

    /* Print chip information */
    esp_chip_info_t chip_info;
    esp_chip_info(&chip_info);
    printf("This is ESP32 chip with %d CPU cores, WiFi%s%s, ",
            chip_info.cores,
            (chip_info.features & CHIP_FEATURE_BT) ? "/BT" : "",
            (chip_info.features & CHIP_FEATURE_BLE) ? "/BLE" : "");

    printf("silicon revision %d, ", chip_info.revision);

    printf("%dMB %s flash\n", spi_flash_get_chip_size() / (1024 * 1024),
            (chip_info.features & CHIP_FEATURE_EMB_FLASH) ? "embedded" : "external");

    int i = 0;

    while (1) {
        printf("In %d seconds...\n", i++);
        vTaskDelay(1000 / portTICK_PERIOD_MS);
    }
    
    return;
}

为何我们的主程序入口是app_main呢?具体查阅components/esp32/cpu_start.c这个文件的源码就明白了。vTaskDelayFreeRTOS系统定义的接口,表示系统延迟若干个时间片,执行到这里,系统会挂起,去执行其它的任务。

编译安装:

$ make
$ make flash monitor
CC build/main/hello_world_main.o
AR build/main/libmain.a
LD build/hello-world.elf
esptool.py v2.1
Flashing binaries to serial port /dev/ttyUSB0 (app at offset 0x10000)...
esptool.py v2.1
Connecting.....
Chip is ESP32D0WDQ5 (revision 0)
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Compressed 19600 bytes to 11521...
Wrote 19600 bytes (11521 compressed) at 0x00001000 in 1.0 seconds (effective 153.5 kbit/s)...
Hash of data verified.
Compressed 130304 bytes to 69678...
Wrote 130304 bytes (69678 compressed) at 0x00010000 in 6.2 seconds (effective 169.2 kbit/s)...
Hash of data verified.
Compressed 3072 bytes to 82...
Wrote 3072 bytes (82 compressed) at 0x00008000 in 0.0 seconds (effective 2117.9 kbit/s)...
Hash of data verified.

Leaving...
Hard resetting...
MONITOR
--- idf_monitor on /dev/ttyUSB0 115200 ---
--- Quit: Ctrl+] | Menu: Ctrl+T | Help: Ctrl+T followed by Ctrl+H ---
ets Jun  8 2016 00:22:57

rst:0x1 (POWERON_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
ets Jun  8 2016 00:22:57

rst:0x10 (RTCWDT_RTC_RESET),boot:0x13 (SPI_FAST_FLASH_BOOT)
configsip: 0, SPIWP:0xee
clk_drv:0x00,q_drv:0x00,d_drv:0x00,cs0_drv:0x00,hd_drv:0x00,wp_drv:0x00
mode:DIO, clock div:2
load:0x3fff0018,len:4
load:0x3fff001c,len:5692
load:0x40078000,len:0
load:0x40078000,len:13804
entry 0x40079030
I (69) boot: Detected ESP32
I (32) boot: ESP-IDF v3.0-dev-1295-g08be5213 2nd stage bootloader
I (32) boot: compile time 23:00:41
I (32) boot: Enabling RNG early entropy source...
I (38) boot: SPI Speed      : 40MHz
I (42) boot: SPI Mode       : DIO
I (46) boot: SPI Flash Size : 4MB
I (50) boot: Partition Table:
I (54) boot: ## Label            Usage          Type ST Offset   Length
I (61) boot:  0 nvs              WiFi data        01 02 00009000 00006000
I (69) boot:  1 phy_init         RF data          01 01 0000f000 00001000
I (76) boot:  2 factory          factory app      00 00 00010000 00100000
I (84) boot: End of partition table
I (88) esp_image: segment 0: paddr=0x00010020 vaddr=0x3f400020 size=0x04ab0 ( 19120) map
I (103) esp_image: segment 1: paddr=0x00014ad8 vaddr=0x3ffb0000 size=0x02118 (  8472) load
I (109) esp_image: segment 2: paddr=0x00016bf8 vaddr=0x40080000 size=0x00400 (  1024) load
0x40080000: _iram_start at /srv/esp/esp-idf/components/freertos/./xtensa_vectors.S:1685

I (115) esp_image: segment 3: paddr=0x00017000 vaddr=0x40080400 size=0x081f4 ( 33268) load
I (137) esp_image: segment 4: paddr=0x0001f1fc vaddr=0x400c0000 size=0x00000 (     0) load
I (138) esp_image: segment 5: paddr=0x0001f204 vaddr=0x00000000 size=0x00e0c (  3596) 
I (145) esp_image: segment 6: paddr=0x00020018 vaddr=0x400d0018 size=0x0fcbc ( 64700) map
0x400d0018: _stext at ??:?

I (180) boot: Loaded app from partition at offset 0x10000
I (180) boot: Disabling RNG early entropy source...
I (181) cpu_start: Pro cpu up.
I (184) cpu_start: Starting app cpu, entry point is 0x40080fe0
0x40080fe0: call_start_cpu1 at /srv/esp/esp-idf/components/esp32/./cpu_start.c:222

I (0) cpu_start: App cpu up.
I (195) heap_init: Initializing. RAM available for dynamic allocation:
I (201) heap_init: At 3FFAE6E0 len 00001920 (6 KiB): DRAM
I (208) heap_init: At 3FFB2920 len 0002D6E0 (181 KiB): DRAM
I (214) heap_init: At 3FFE0440 len 00003BC0 (14 KiB): D/IRAM
I (220) heap_init: At 3FFE4350 len 0001BCB0 (111 KiB): D/IRAM
I (227) heap_init: At 400885F4 len 00017A0C (94 KiB): IRAM
I (233) cpu_start: Pro cpu start user code
I (250) cpu_start: Starting scheduler on PRO CPU.
I (0) cpu_start: Starting scheduler on APP CPU.
Hello world!
This is ESP32 chip with 2 CPU cores, WiFi/BT/BLE, silicon revision 0, 4MB external flash
In 0 seconds...
In 1 seconds...
In 2 seconds...
In 3 seconds...
In 4 seconds...
In 5 seconds...
In 6 seconds...
In 7 seconds...
In 8 seconds...
In 9 seconds...
In 10 seconds...

portTICK_PERIOD_MS定义在components/freertos/include/freertos/portmacro.h文件中:

#define portTICK_PERIOD_MS            ( ( TickType_t ) 1000 / configTICK_RATE_HZ )

configTICK_RATE_HZ定义在components/freertos/include/freertos/FreeRTOSConfig.h文件中:

#define configTICK_RATE_HZ                ( CONFIG_FREERTOS_HZ )

CONFIG_FREERTOS_HZ则定义在sdkconfig文件(执行make menuconfig后生成的配置文件)中,说明该值是可以根据实际需求配置的。

$ cat sdkconfig | grep CONFIG_FREERTOS_HZ
CONFIG_FREERTOS_HZ=100

ESP32:hello world

点赞
收藏
评论区
推荐文章
翼
4年前
vue-cli3 中使用rem布局
1.装包postcsspx2rem及px2remloadernpminstallpostcsspx2rempx2remloadersave2.在根目录src中新建utils目录下新建rem.js等比适配文件,内容如下//rem等比适配配置文件//基准大小constbaseSize16//设置rem
Easter79 Easter79
3年前
vue 根据接口返回的状态码判断用户登录状态并跳转登录页,登录后回到上一个页面(http拦截器)
背景:后台接口返回code501表示用户是未登录状态,需要登录才可访问;通过http拦截做路由跳转 第一步:src目录下新建http.js文件,内容如下:importAxiosfrom'axios'import{Loading,Message,MessageBox}from'elementui'
Jacquelyn38 Jacquelyn38
4年前
一篇文章带你使用Typescript封装一个Vue组件
搭建项目以及初始化配置vue create tsvuebtn这里使用了vueCLI3自定义选择的服务,我选择了ts、stylus等工具。然后创建完项目之后,进入项目。使用快捷命令code.进入Vscode编辑器(如果没有code.,需要将编辑器的「bin文件目录地址」放到环境变量的path中)。然后,我进入编辑器之后,进入设置工作区,随便设置一个
Wesley13 Wesley13
3年前
javaweb项目部署
首先谢谢@JFinal(http://my.oschina.net/jfinal)的自由,让我搞明白,原来项目可以这样部署。以前的部署方式:tomcat目录confserver.xml修改<Host节点,添加如下内容:<Contextpath"/jfinal"docBase"D:\code\jfin
Wesley13 Wesley13
3年前
VirtualBox导入已安装好的操作系统的方法
VirtualBox导入已安装好的操作系统的方法1、修改UUID进入VirtualBox安装目录,运行VBoxManage修改UUID,命令运行如下:D:\\VirtualBoxVBoxManage.exe internalcommands setvdiuuid E:\\VirtualX
Wesley13 Wesley13
3年前
Javaweb入门基础(尚硅谷,佟刚老师)笔记(一)
\恢复内容开始第一个WEB应用程序:开发,并部署到Tomcat服务器下运行1)在eclipse新建一个javaProject2)在Java项目下创建WEB开发的目录结构:\WebContentWEBINFclasses(编译后的class文件必须放在该目录下)libweb.xml(从  \\a
Wesley13 Wesley13
3年前
解决webpack因新版本打包失败问题
最近在学习webpack打包过程中遇到的一个问题向大家分享下!创建了一个webpacksty的目录,目录下放着dist,src子目录,然后通过node环境下,npminity初始化项目出现package.json文件,src子目录下又存放着index.html和main.js文件,接下来尝试着在main.js输入一句代码当验证打包后续是否成功的过
Wesley13 Wesley13
3年前
mysql 5.7.18
1\.下载2\.解压缩3\.添加path环境变量,路径指向mysql所在bin目录下4\.在主目录下创建data文件夹5\.注册windows系统服务 新建一个my.ini文件,拷贝到c:\\windows目录下,内容如下:\client\port3306defaultcharactersetutf8
Stella981 Stella981
3年前
Git连载(3)添加(add)文件和目录
1.8.3添加(add)文件和目录        Git添加文件和目录也很简单,先把文件和目录添加到Git系统管理之下,然后提交修改即可。        例如在G:\\gitJava目录下增加一个a.jsp文件,该文件内容可以随便写,并在该目录下添加一个WEBINF文件夹、并在该文件夹下添加web.xml文件按。接下来打算将a.jsp文件
Stella981 Stella981
3年前
Android studio中创建一个Menu方法
1.先在res目录下新建一个menu文件夹(右键res目录NewDirectory)输入文件夹名为menu,点击OK2.在新建的menu目录下创建一个名为main的菜单文件(右键menu文件夹NewMenuresourcefile)输入文件名为main点击OK里面内容为:<itemandroid:
Stella981 Stella981
3年前
Linux普通用户登录后,命令行提示:
    遇到此种问题,那么需要了解和用户创建有关的一个目录(/etc/skel/目录),此目录下的所有文件(包括隐藏文件)都会被复制到新添加的用户的家目录中。/etc/skel/目录到底是干嘛的呢?  该目录下是用来存放新用户环境变量文件的,添加新用