ESP 系列杂谈(三): esp-idf 工具链常见问题归纳

此篇博客会根据遇到的 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 下工具链的设置

以下是对教程里一些可能不清楚的地方的补充:

  1. 查询当前 esp-idf 工具链的版本指令:xtensa-esp32-elf-gcc -v

  2. 下载好对应的 esp-idf 工具链后,配置环境变量的指令:export PATH="$HOME/esp/xtensa-esp-elf/bin:$PATH",这里需要将路径改成你自己电脑上工具链放置的路径。请注意,这里的配置是一次性的,如果想永久的配置环境变量,请看第 3,4 点。

  3. 修改 /etc/profile 文件,在这种方法下所有用户的 shell 都有权使用这些环境变量,可能会给系统带来安全性问题。如果仅仅作为多用户开发,推荐使用这种方法:

    sudo vim /etc/profile 
    export PATH="$HOME/esp/xtensa-esp-elf/bin:$PATH" 
    source  /etc/profile
    
  4. 修改.bashrc文件,这种方法更为安全,它可以把使用这些环境变量的权限控制到用户级别。

    sudo vim /root/.bashrc 
    export PATH="$HOME/esp/xtensa-esp-elf/bin:$PATH" 
    source  /root/.bashrc
    

    这两种方法一般需要重新注销系统才能生效,也可以使用source 命令使修改的配置立刻生效。

  5. 显示当前 PATH 环境变量的指令:echo $PATH

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
发布了53 篇原创文章 · 获赞 21 · 访问量 8368

猜你喜欢

转载自blog.csdn.net/zztiger123/article/details/103375719