此篇博客会根据遇到的 esp-idf 相关问题的时间不定期更新。
1. esp-idf 版本 & 环境变量配置问题
1.1 esp-idf 版本应从 8.2.0 切换至 5.2.0
今天我在编译 esp-iot-solution 时出现了如下问题:
WARNING: Compiler version is not supported: 8.2.0
Expected to see version(s): 5.2.0
Please check ESP-IDF setup instructions and update the toolchain, or proceed at your own risk
esp-iot-solution/submodule/esp-idf/make/component_wrapper.mk:285: recipe for target 'asio/asio/src/asio.o' failed
make[1]: *** [asio/asio/src/asio.o] Error 1
esp-iot-solution/submodule/esp-idf//make/project.mk:530: recipe for target 'component-asio-build' failed
make: *** [component-asio-build] Error 2
其中核心的句子是 WARNING: Compiler version is not supported: 8.2.0 Expected to see version(s): 5.2.0
。这里说明我的 esp-idf 版本过高,需要切换成较低的版本。所以我们需要下载对应的 esp-idf 版本并进行环境变量的配置,Linux 环境下具体步骤可以参考 linux 下工具链的设置。
附:其他系统请参考 windows 下工具链的设置 与 macos 下工具链的设置。
以下是对教程里一些可能不清楚的地方的补充:
-
查询当前 esp-idf 工具链的版本指令:
xtensa-esp32-elf-gcc -v
。 -
下载好对应的 esp-idf 工具链后,配置环境变量的指令:
export PATH="$HOME/esp/xtensa-esp-elf/bin:$PATH"
,这里需要将路径改成你自己电脑上工具链放置的路径。请注意,这里的配置是一次性的,如果想永久的配置环境变量,请看第 3,4 点。 -
修改
/etc/profile
文件,在这种方法下所有用户的 shell 都有权使用这些环境变量,可能会给系统带来安全性问题。如果仅仅作为多用户开发,推荐使用这种方法:sudo vim /etc/profile export PATH="$HOME/esp/xtensa-esp-elf/bin:$PATH" source /etc/profile
-
修改.bashrc文件,这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别。
sudo vim /root/.bashrc export PATH="$HOME/esp/xtensa-esp-elf/bin:$PATH" source /root/.bashrc
这两种方法一般需要重新注销系统才能生效,也可以使用source 命令使修改的配置立刻生效。
-
显示当前 PATH 环境变量的指令:
echo $PATH
。扫描二维码关注公众号,回复: 10811668 查看本文章
1.2 路径错误 recipe for target '/home/esp/hello_world/build/bootloader/bootloader.bin' failed
以下是 log 错误日志:
Toolchain path: /home/esp/xtensa-esp32-elf/bin/xtensa-esp32-elf-gcc
Toolchain version: crosstool-ng-1.22.0-80-g6c4433a
Compiler version: 5.2.0
make[1]: *** No rule to make target '/home/esp/esp-idf/components/esptool_py/esptool/esptool.py', needed by '/home/esp/hello_world/build/bootloader/bootloader.bin'. Stop.
/home/esp/esp-idf/components/bootloader/Makefile.projbuild:41: recipe for target '/home/esp/hello_world/build/bootloader/bootloader.bin' failed
make: *** [/home/esp/hello_world/build/bootloader/bootloader.bin] Error 2
解决办法:尝试在 esp-idf
目录下运行 git submodule update
指令。
注:如果存在子模块等不确定因素,建议使用
git submodule update --init --recursive
指令。
1.3 tools 目录下文件错误:`No rule to make target ‘/home/esp/esp-idf/tools/kconfig/conf-idf’
以下是 log 错误日志:
No rule to make target '/home/esp/esp-idf/tools/kconfig/conf-idf',
needed by '/home/esp/esp-idf/examples/wifi/getting_started/station/build/include/config/auto.conf'. Stop.
解决办法:删掉 tools 目录下的所有文件,然后将 tools 目录下文件恢复到初始状态。对应指令如下:
cd ~/esp/esp-idf/
rm -rf tools/
git status
git stash
git status
其中两次 git status
主要是为了方便观察文件的变动过程。在完成上述指令集之后确认 IDF_PATH 和编译链路径是否正确配置。然后就可以正常使用 make
进行编译烧写了。
2. esp-idf 固件编译问题
2.1 编译时出现 cc1: warnings being treated as errors
编译时出现如下信息:
cc1: some warnings being treated as errors
ninja: build stopped: subcommand failed.
ninja failed with exit code 1
解决方法:对于 cc1: some warnings being treated as errors
,打开该目录下的 Makefile 文件,将该文件中的 -Werror 注释掉即可,如果在该目录下找不到该标志,到上一层目录下寻找,也可在顶层目录 Makefile 修改。
注:建议还是将这里的 warning 问题自行解决掉,否则虽然编译通过,但可能会导致一些其他问题。
3. esp-idf 固件烧写问题
3.1 esp-idf 将要烧写的固件过大
问题的 log 日志如下:
E (605) esp_image: Image length 1184944 doesn't fit in partition length 1048576
E (613) boot: Factory app partition is not bootable
E (618) boot: No bootable app partitions in the partition table
解决方法:
1、将 $IDF_PATH/components/partition_table/partitions_singleapp.csv
修改如下:
# Name, Type, SubType, Offset, Size, Flags
# Note: if you change the phy_init or app partition offset, make sure to change the offset in Kconfig.projbuild
nvs, data, nvs, 0x9000, 0x6000,
phy_init, data, phy, 0xf000, 0x1000,
factory, app, factory, 0x10000, 1M,
将 factory, app, factory, 0x10000, 1M,
修改成 factory, app, factory, 0x10000, 2M,
2、make menuconfig 配置
在 menuconfig 里依次按如下操作进行:
Serial flasher config --> Flash size
改为 4M,然后重新烧写固件即可。
注:要根据自己的情况灵活调整 Flash size 的大小。 一般为 2M 或 4M。
3.2 esp-idf 固件烧写时提示串口权限不够问题(linux 下)
问题描述:在最后的烧写固件过程中报错:串口权限不足。
解决方法:在 Linux 中添加用户到 dialout。
具体解释:当前登录用户应当可以通过 USB 对串口进行读写操作。在多数 Linux 版本中,你都可以通过以下命令,将用户添加到 dialout 组,来获许读写权限:
sudo usermod -a -G dialout $USER