docs: 更新常见问题及解决方案
@@ -115,13 +115,12 @@
|
||||
- 在线视频教程-2:[认识ESP32—1.2.2 Linux下安装ESP-IDF开发环境](https://www.bilibili.com/video/BV1vLrKYHExy/?vd_source=ef5a0ab0106372751602034cdd9ab98e#reply251069588753)
|
||||
- 在线视频教程-3:[认识ESP32—1.2.3 Windows下使用ssh调用Linux系统下的开发环境](https://www.bilibili.com/video/BV1vLrKYHExy/?vd_source=ef5a0ab0106372751602034cdd9ab98e#reply251069588753)
|
||||
|
||||
## 1.3 初试ESP32-HelloWorld
|
||||
## 1.3 初试ESP32-idf.py的基本使用
|
||||
|
||||
本节通过“Hello World”示例代码,指导读者创建第一个ESP32工程,并完成编译、烧录及运行调试流程。通过本节内容,初学者可以初步体验ESP-IDF的开发流程,快速进入ESP32开发的世界。
|
||||
|
||||
- 在线文字教程:[ESP32初体验-HelloWorld.md](./docs/01.认识ESP32/1.3-初试ESP32-HelloWorld/初试ESP32-HelloWorld.md)
|
||||
- 在线视频教程:[ESP32初体验-HelloWorld]
|
||||
- 教程配套代码:[HelloWorld 示例代码]
|
||||
- 在线文字教程:[ESP32初体验-idf.py的基本使用](docs/01.认识ESP32/1.3-初试ESP32-idf.py的基本使用/idf.py的基本使用.md)
|
||||
- 在线视频教程:[ESP32初体验-idf.py的基本使用]
|
||||
|
||||
---
|
||||
|
||||
|
||||
BIN
docs/00.常见问题及解决方案/attachments/20250107091923.png
Normal file
|
After Width: | Height: | Size: 78 KiB |
@@ -1,6 +1,5 @@
|
||||
|
||||
## 1. 头文件跳转的问题
|
||||
|
||||
## 1. 头文件无法跳转,没有代码提示
|
||||
#### **问题**:
|
||||
|
||||
>我们使用VS Code打开ESP32项目,有时我们的代码头文件无法跳转,写代码没有代码提示。
|
||||
@@ -43,3 +42,37 @@
|
||||
|
||||

|
||||
|
||||
## 2.开发板在Windows下可以显示端口,但在Linux下找不到
|
||||
|
||||
#### **问题**:
|
||||
|
||||
>开发板在Windows下可以显示端口,但在Linux下找不到
|
||||
|
||||
这种情况一般是由于开发板的USB转串口芯片在Linux下没有驱动程序导致的,特别是USB转串口芯片为CH340的开发板,容易找不到驱动。(所以推荐使用USB转串口芯片型号为CP210x的开发板)。
|
||||
#### 解决方案:
|
||||
|
||||
安装对应型号的串口驱动程序,上网搜索安装教程一般都能找到。
|
||||
|
||||
|
||||
## 3.Linux下烧录代码报错(没有串口权限)
|
||||
|
||||
#### **问题**:
|
||||
|
||||
>Linux下烧录代码报错(没有串口权限)
|
||||
|
||||
在Linux下烧录代码,后可能会出现:
|
||||
|
||||

|
||||
|
||||
这是由于我们的linux用户没有读写串口的权限
|
||||
#### 解决方案:
|
||||
|
||||
可以使用下面的命令添加串口读写权限(也可直接切换root用户):
|
||||
|
||||
```
|
||||
sudo chmod a+rw /dev/ttyUSB0
|
||||
```
|
||||
|
||||
但是注意`sudo chmod a+rw /dev/ttyUSB0` 的权限更改是暂时的,只会在当前设备被使用的会话期间生效。一旦系统重启或者设备断开并重新连接,设备节点(例如 /dev/ttyUSB0)可能会重新被创建,且权限会被重置为默认状态。
|
||||
|
||||
可以使用下面的命令,永久为用户添加串口权限:`sudo usermod -aG dialout username`,设置后重启方能生效。
|
||||
@@ -282,6 +282,10 @@ source ~/.bashrc
|
||||
alias idf53='. $HOME/esp/v532/esp-idf/export.sh'
|
||||
|
||||
```
|
||||
|
||||
最后在这里分享本节安装使用的相关软件和安装好IDF的Linux虚拟机:[软件资源](https://www.alipan.com/s/PRCdvqnzCWL)
|
||||
|
||||
|
||||
# 三、(进阶)Windows下使用ssh调用Linux系统下的开发环境
|
||||
|
||||
|
||||
|
||||
|
After Width: | Height: | Size: 7.0 KiB |
|
Before Width: | Height: | Size: 5.3 KiB After Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.3 KiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 198 KiB After Width: | Height: | Size: 198 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 122 KiB After Width: | Height: | Size: 122 KiB |
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 36 KiB After Width: | Height: | Size: 36 KiB |
|
Before Width: | Height: | Size: 40 KiB After Width: | Height: | Size: 40 KiB |
|
Before Width: | Height: | Size: 113 KiB After Width: | Height: | Size: 113 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 50 KiB After Width: | Height: | Size: 50 KiB |
|
Before Width: | Height: | Size: 45 KiB After Width: | Height: | Size: 45 KiB |
|
Before Width: | Height: | Size: 53 KiB After Width: | Height: | Size: 53 KiB |
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 133 KiB After Width: | Height: | Size: 133 KiB |
|
Before Width: | Height: | Size: 52 KiB After Width: | Height: | Size: 52 KiB |
@@ -2,16 +2,24 @@
|
||||
|
||||
# 一、常用idf.py命令介绍
|
||||
|
||||
| 功能 | 命令 | 备注 |
|
||||
| -------- | ------------------------------------------------------- | ------------------------------- |
|
||||
| 创建新工程 | `idf.py create-project <project name>` | `<project name>` 为项目名称 |
|
||||
| 创建新组件 | `idf.py -C components create-component {componentName}` | `{componentName}` 为组件名称 |
|
||||
| 选择目标芯片 | `idf.py set-target <target>` | `<target>` 为芯片型号,不输入参数会列出所有可用型号 |
|
||||
| 启动图形配置工具 | `idf.py menuconfig` | 配置项目的菜单选项 |
|
||||
| 构建工程 | `idf.py build` | 编译生成固件 |
|
||||
| 清除构建输出 | `idf.py clean` | 清除中间文件 |
|
||||
| 删除所有构建内容 | `idf.py fullclean` | 清除所有生成的文件 |
|
||||
| 烧录工程 | `idf.py -p /dev/ttyUSB0 flash` | `/dev/ttyUSB0` 为目标串口,根据实际情况修改 |
|
||||
| 打开串口监视器 | `idf.py -p /dev/ttyUSB0 monitor` | `/dev/ttyUSB0` 为目标串口,根据实际情况修改 |
|
||||
| 构建、烧录并监视 | `idf.py -p /dev/ttyUSB0 flash monitor` | `/dev/ttyUSB0` 为目标串口,根据实际情况修改 |
|
||||
| 打开文档 | `idf.py docs` | |
|
||||
|
||||
- 创建工程:`idf.py create-project <project name>`
|
||||
- 新建组件`idf.py -C components create-component {componentName}`
|
||||
- 清除之前的编译:` idf.py fullclean`
|
||||
- 编译: `idf.py build`
|
||||
- 向串口烧录固件: `idf.py -p /dev/ttyUSB0 flash` (`/dev/ttyUSB0` 为目标串口参数,根据实际填写)
|
||||
- 打开串口监视器:`idf.py -p /dev/ttyUSB0 monitor` (`/dev/ttyUSB0` 为目标串口参数,根据实际填写)
|
||||
- 配置菜单 :`idf.py menuconfig `
|
||||
- 选择芯片型号:` idf.py set-target esp32 ` 不输入参数的话,会列出所有可用型号
|
||||
- 一次性执行构建、烧录和监视过程:`idf.py -p /dev/ttyUSB0 flash monitor` (`/dev/ttyUSB0` 为目标串口参数,根据实际填写)
|
||||
补充其他可能用到命令:
|
||||
|
||||
- Linux下查询可用串口:`ls /dev/ttyUSB*`
|
||||
- 添加串口权限(需重启):`sudo usermod -aG dialout username`
|
||||
|
||||
|
||||
**有一点需要说明**:我们使用VS Code+ESP-IDF插件进行开发,所使用的图形界面实际上就是在命令行里运行上述命令。
|
||||
@@ -21,6 +29,7 @@
|
||||
|
||||

|
||||
|
||||
|
||||
点击小扳手图标构建项目,与在命令行对应目录下使用`idf.py build`命令,具有一模一样的效果,ESP-IDF插件只是为我们提供了一个可视化界面。
|
||||
当我们使用熟练后,使用可视化界面与直接使用命令没有什么区别,考虑到本教程不仅仅针对使用VS Code+ESP-IDF插件环境的学习者,**所以后续的教程中可能更多的以使用命令行命令为主,望读者周知**,这只是个人习惯,您在开发过程中可以选用您喜欢的操作方式,本质上没有区别。
|
||||
|
||||
@@ -126,3 +135,21 @@ Linux下可以可以使用`ls /dev/ttyUSB*`命令查看可用串口。
|
||||
至此我们就借助 Hello world工程,掌握了最基本的ESP32开发流程。第一章认识ESP32到此结束,下一章将进一步熟悉ESP-IDF的架构与开发流程,掌握工程结构和常用开发工具及调试方法,建立高效开发基础。
|
||||
|
||||
|
||||
# 三、其他高级命令
|
||||
|
||||
下面列出一些其他高级命令:
|
||||
|
||||
| 命令 | 描述 |
|
||||
|-------------------------------------------|--------------------------------------------------------|
|
||||
| `idf.py size` | 显示应用程序的总大小 |
|
||||
| `idf.py size-components` | 显示各组件的大小 |
|
||||
| `idf.py size-files` | 显示各文件的大小 |
|
||||
| `idf.py reconfigure` | 重新配置工程 |
|
||||
| `idf.py python-clean` | 清除 Python 字节码 |
|
||||
| `idf.py merge-bin [-o output-file] [-f format] [<format-specific-options>]` | 合并二进制文件,支持指定输出文件和格式选项 |
|
||||
| `idf.py uf2` | 生成 UF2 二进制文件 |
|
||||
| `idf.py read-otadata` | 读取 Otadata 分区 |
|
||||
|
||||
|
||||
idf.py 还有很多其他有用的命令,只是我们入门阶段可能暂时用不到,更多内容可以参考官方文档:[IDF 前端工具 - idf.py](https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-guides/tools/idf-py.html)
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
FreeRTOS 是一个开源的 RTOS(实时操作系统)内核,它以组件的形式集成到 ESP-IDF 中。因此,所有的 ESP-IDF 应用程序及多种 ESP-IDF 组件都基于 FreeRTOS 编写。FreeRTOS 内核已移植到 ESP 芯片的所有 CPU 架构(即 Xtensa 和 RISC-V)中。
|
||||
@@ -0,0 +1,106 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
注意:与原生 FreeRTOS 不同,在 ESP-IDF 中使用 FreeRTOS 的用户 永远不应调用 `vTaskStartScheduler()` 和 `vTaskEndScheduler()`。相反,ESP-IDF 会自动启动 FreeRTOS。用户必须定义一个 `void app_main(void)` 函数作为用户应用程序的入口点,并在 ESP-IDF 启动时被自动调用。
|
||||
|
||||
通常,用户会从 `app_main` 中启动应用程序的其他任务。`app_main` 函数可以在任何时候返回(应用终止前)。`app_main` 函数由 main 任务调用。
|
||||
|
||||
|
||||
# ESP-IDF中的FreeRTOS的基本使用
|
||||
|
||||
## FreeRTOS创建任务
|
||||
|
||||
### 1. xTaskCreate : 动态创建一个任务
|
||||
|
||||
当需要在运行时动态分配内存来创建任务时使用,也就是一般的正常情况。
|
||||
|
||||
原型:
|
||||
|
||||
```c
|
||||
static inline BaseType_t xTaskCreate(TaskFunction_t pxTaskCode,
|
||||
const char *const pcName,
|
||||
const configSTACK_DEPTH_TYPE usStackDepth,
|
||||
void *const pvParameters,
|
||||
UBaseType_t uxPriority,
|
||||
TaskHandle_t *const pxCreatedTask)
|
||||
```
|
||||
|
||||
创建一个新任务并将其添加到准备运行的任务列表中。在 FreeRTOS 实现中,任务使用两块内存。第一个块用于保存任务的数据结构。任务使用第二个块作为其堆栈。如果使用 xTaskCreate () 创建任务,那么这两个内存块将在 xTaskCreate () 函数中自动分配。
|
||||
|
||||
参数:
|
||||
|
||||
- `pxTaskCode`:指向任务入口函数的指针,任务必须设计为永不返回(即以无限循环形式实现)。
|
||||
- `pcName`:任务的描述性名称,主要用于调试方便,最大长度由 `configMAX_TASK_NAME_LEN` 定义(默认 16)。
|
||||
- `usStackDepth`:任务栈大小(以字节为单位)。注意,这与原生 FreeRTOS 的默认单位不同。
|
||||
- `pvParameters`:传递给任务函数的参数指针(类型为void指针)。
|
||||
- `uxPriority`:任务的优先级(数字越大优先级越高,最低为1)。支持 MPU 的系统中,通过设置 `portPRIVILEGE_BIT` 位可创建特权任务(例如 `(2 | portPRIVILEGE_BIT)` 表示优先级为 2 的特权任务)。
|
||||
- `pxCreatedTask`:用于存储任务句柄(可选),通过句柄可以引用创建的任务。
|
||||
|
||||
|
||||
## FreeRTOS删除任务
|
||||
|
||||
|
||||
## FreeRTOS创建任务传参
|
||||
|
||||
|
||||
## FreeRTOS任务优先级
|
||||
|
||||
文档:https://www.freertos.org/zh-cn-cmn-s/Documentation/02-Kernel/02-Kernel-features/01-Tasks-and-co-routines/03-Task-priorities
|
||||
|
||||
每个任务均被分配了从 0 到 ( configMAX_PRIORITIES - 1 ) 的优先级,其中 configMAX_PRIORITIES 定义为 FreeRTOSConfig.h。
|
||||
|
||||
在ESP-IDF中configMAX_PRIORITIES的值为25,所以任务优先级为0-24.
|
||||
|
||||
使用代码
|
||||
```c
|
||||
xTaskCreate(Task_1, "Task_1", 2048, NULL, 25, &taskHandle);
|
||||
```
|
||||
|
||||
产生报错如下:
|
||||
|
||||

|
||||
|
||||
获取任务优先级的函数:
|
||||
|
||||
```c
|
||||
UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );
|
||||
```
|
||||
|
||||
修改优先级别的函数:
|
||||
```c
|
||||
void vTaskPrioritySet( TaskHandle_t xTask,
|
||||
UBaseType_t uxNewPriority );
|
||||
```
|
||||
|
||||
参数:
|
||||
- xTask
|
||||
正在设置优先级的任务的句柄。空句柄会设置调用任务的优先级。
|
||||
|
||||
- uxNewPriority
|
||||
将要设置任务的优先级。应断言优先级低于 configMAX_PRIORITIES。 如果 configASSERT未定义,则优先级默认上限为 (configMAX_PRIORITIES - 1)。
|
||||
|
||||
## FreeRTOS任务挂起
|
||||
|
||||
FreeRTOS任务状态:https://www.freertos.org/zh-cn-cmn-s/Documentation/02-Kernel/02-Kernel-features/01-Tasks-and-co-routines/02-Task-states
|
||||
|
||||

|
||||
|
||||
- **运行**
|
||||
当任务实际执行时,它被称为处于运行状态。任务当前正在使用处理器。 如果运行 RTOS 的处理器只有一个内核, 那么在任何给定时间内都只能有一个任务处于运行状态。
|
||||
- **准备就绪**
|
||||
准备就绪任务指那些能够执行(它们不处于阻塞或挂起状态), 但目前没有执行的任务, 因为同等或更高优先级的不同任务已经处于运行状态。
|
||||
- **阻塞**
|
||||
如果任务当前正在等待时间或外部事件,则该任务被认为处于阻塞状态。 例如,如果一个任务调用vTaskDelay(),它将被阻塞(被置于阻塞状态), 直到延迟结束——一个时间事件。 任务也可以通过阻塞来等待队列、信号量、事件组、通知或信号量 事件。处于阻塞状态的任务通常有一个"超时"期, 超时后任务将被超时,并被解除阻塞, 即使该任务所等待的事件没有发生。“阻塞”状态下的任务不使用任何处理时间,不能 被选择进入运行状态。
|
||||
- **挂起**
|
||||
与“阻塞”状态下的任务一样, “挂起”状态下的任务不能 被选择进入运行状态,但处于挂起状态的任务 没有超时。相反,任务只有在分别通过 vTaskSuspend() 和 xTaskResume() API 调用明确命令时 才会进入或退出挂起状态。
|
||||
|
||||
相关函数:
|
||||
|
||||
|
||||
## 任务看门狗定时器 (TWDT)
|
||||
|
||||
https://docs.espressif.com/projects/esp-idf/zh_CN/stable/esp32/api-reference/system/wdts.html
|
||||
https://www.bilibili.com/video/BV1jF411B7gv/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=ef5a0ab0106372751602034cdd9ab98e
|
||||
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 21 KiB |
|
After Width: | Height: | Size: 28 KiB |