ESP32 环境配置与开发

ESP32 环境配置与开发#

我必须承认, esp idf 是我配置过最困难的开发环境.

本篇文章的开发环境选择是 Visual Studio Codeesp idf. 以 微雪电子 ESP32-S3-Nano 开发板 为例; 这款开发板理论上与 Arduino Nano esp32 开发板完全兼容. 在 这里 可以找到 Arduino 开发板的引脚定义.

esp idf 安装与配置#

esp idf 有两种安装途径: 通过官方安装器; 或是通过 VSCode 插件安装.

上述两种方式安装的 esp idf 互不兼容.

鉴于我们将在 VSCode 中进行开发, 所以最好选择第二种: 通过插件安装.

具体的安装过程可以在 官方教程 找到.

安装 USB 设备驱动#

安装 Zadig. 启动它, 选择 Options > List All Devices. 此时应该能在下拉菜单中找到两个 USB JTAG/serial debug unit, 分别以 Interface 0Interface 2 区分. 下面分别设置这两个的驱动.

异步非阻塞串口数据接收

异步非阻塞串口数据接收#

异步?#

异步 (asynchronous) 编程是一种并发的编程模式, 可以有效节省 CPU 阻塞等待 I/O 事件造成的时间浪费, 借以提高性能.

在这里也简单介绍一下 并行 (parallel)并发 (concurrent) 的区别. 并发是指多个任务可以被同时运行的现象; 但需要注意的是, 并发在某一时刻可能并不一定有多个任务在运行. 但是并行是严格的多线程工作模式, 在某一时刻有多个任务在同时工作. 于是很容易看出, 并行也被包含在并发之中.

异步的核心在于一个字 “”. 简而言之, 异步编程好似去食堂窗口买饭, 当你告诉他你要点的餐以后, 不是一定要在窗口前等着, 而是可以去做点别的事情, 比如买瓶饮料什么的, 直到老板通知你取餐, 这就是一次异步事件. 在编程时我们调用一个异步 API, 若它不能立刻返回结果, 那么也不会阻塞等待, 而是立刻向后执行; 直到获取到结果再通知我们进行处理.

不同的语言有各色的异步支持, JavaScriptRust 的异步模型都很有代表性. JavaScript 中, 异步函数可以返回一个 Promise 对象, 其名字形象地说明了它的功能: 我承诺完成你要的操作; 潜台词则是我保证 将来 会完成你要的操作, 不一定是立刻做到. RustFuture 机制则更为直白: 你的任务我将来会完成的.

非多线程的异步程序的本质是 CPU 的 时分复用, 它用划分时间片交替运行各项任务来模拟同时运行每项任务. 必须指出, 有些语言实际上使用多线程实现的异步, 在这种情况下可以实现真正的并行, 即每个时刻多项任务同时被运行. 于是很容易推断, 若 CPU 本来就没有空闲时间, 那么非多线程的异步也并不能提高效率. 这也是为什么异步大多都被用于 I/O 操作, 因为可以有效利用好 I/O 事件中因为等待而空闲的 CPU 时间. 若是 CPU 密集型的工作, 例如科学计算等, 使用异步模型反而会因为时间片切换而损失性能. 这种情况更适合用多线程的方法提高效率.