ESP8266在Linux下的开发

本文最后由 森林生灵 于 2018/01/14 15:31:42 编辑

文章目录 (?) [+]

        ESP8266 是上海乐鑫 (Espressif Systems (Shanghai) Pte., Ltd.) 推出的一款 Wi-Fi 芯片,其内置一颗 Tensilica L106 32 bit 的处理器,具有超低功耗的 16 位 RSIC,CPU 时钟速度为 80-160 MHz,并支持实时 RTOS 操作系统,是物联网开发的首选设备。ESP8266 在 Windows 开发上可以使用现成的基于 Eclipse 的 Ai-Thinker IDE,但要是使用 Linux 开发就得自己配置一下环境了,本文就 ESP8266 在 Deepin Linux 上的开发展开。

    交叉编译器

        ESP8266 的交叉编译器为 xtensa-lx106-elf,需要通过 crosstool-NG 编译获得,具体方法如下。

        编译平台信息

    $ uname -a
    Linux lanseyujie 4.9.0-deepin13-amd64 #1 SMP PREEMPT Deepin 4.9.57-1 (2017-10-19) x86_64 GNU/Linux
    $ gcc -v
    gcc version 6.4.0 20170724 (Debian 6.4.0-2) 
    $ make -v
    GNU Make 4.1

        需要的依赖包

    sudo apt install git wget build-essential autoconf gperf bison flex texinfo gawk libtool libtool-bin libncurses5-dev expat libexpat1-dev

        编译 crosstool-NG

    # 克隆 crosstool-NG 的 lx106 分支
    git clone -b lx106 git://github.com/jcmvbkbc/crosstool-NG.git
    
    # 配置与编译 ct-ng
    cd crosstool-NG
    ./bootstrap && ./configure --prefix=`pwd` && make && make install
    
    # 生成配置文件
    ./ct-ng xtensa-lx106-elf

        配置与编译 ct-ng 的过程中会遇到如下错误:

    In file included from zconf.tab.c:213:0:

    zconf.hash.c:163:1: error: conflicting types for ‘kconf_id_lookup’

     kconf_id_lookup (register const char *str, register size_t len)

     ^~~~~~~~~~~~~~~

    zconf.hash.c:34:25: note: previous declaration of ‘kconf_id_lookup’ was here

     static struct kconf_id *kconf_id_lookup(register const char *str, register unsigned int len);

                             ^~~~~~~~~~~~~~~

    Makefile:95: recipe for target 'zconf.tab.o' failed

    make[2]: *** [zconf.tab.o] Error 1

    Makefile:166: recipe for target 'build-lib-kconfig' failed

    make[1]: *** [build-lib-kconfig] Error 2

    Makefile:126: recipe for target 'build' failed

    make: *** [build] Error 2

    Conflicting types error

        解决方法:修改 kconfig/zconf.hash.c 的 163 行的 size_t 类型为 unsigned int 再重新配置编译即可。

    Fix conflicting types

        配置 crosstool-NG

        在 crosstool-NG 目录下执行:

    # 命令行的窗口尺寸要调大一些,否则不会出现配置界面
    ./ct-ng menuconfig

        设置保存中间步骤,按 Y 选中。

        Paths and misc options -> Debug crosstool-NG -> Save intermediate steps

        设置多线程编译,推荐设置为 4。

        Paths and misc options -> Number of parallel jobs

    Your display is too small

    Number of parallel jobs

        编译 xtensa-lx106-elf

    ./ct-ng build

        编译时需要下载多个源码包,建议编译时使用代理或提前下载好源码包到 .build/tarballs 目录。

    binutils-2.24.tar.bz2    ftp://ftp.gnu.org/gnu/binutils/

    gdb-7.5.1.tar.bz2      ftp://ftp.gnu.org/gnu/gdb/

    mpc-1.0.2.tar.gz       ftp://ftp.gnu.org/gnu/mpc/

    cloog-0.18.1.tar.gz     http://www.cloog.org

    gmp-5.1.3.tar.xz      ftp://ftp.gnu.org/gnu/gmp/

    mpfr-3.1.2.tar.xz      ftp://ftp.gnu.org/gnu/mpfr/

    gcc-4.8.2.tar.bz2      ftp://ftp.gnu.org/gnu/gcc/gcc-4.8.2/

    isl-0.12.2.tar.bz2       http://isl.gforge.inria.fr

    newlib-1.20.0.tar.gz    ftp://sourceware.org/pub/newlib/index.html

        编译过程为分段进行,如果在某处编译出错,除错后可以继续上一步进行编译。

    Build Failed

    # 如上图中的错误,这是因为我在编译时没有安装 libexpat1-dev 导致的,安装好可以通过以下命令继续上一步编译
    ./ct-ng debug+

        8 线程编译耗时约 19 分钟,已编译好的工具链(含 Xtensa 的头文件和静态链接库文件)已 push 到 Github[https://github.com/lanseyujie/xtensa-lx106-elf.git]。

    环境搭建

    # 编译好的工具链在 builds 目录里
    # 修改文件夹权限
    sudo find ./builds/xtensa-lx106-elf/ -type d -print|xargs chmod 755;
    
    # Xtensa 头文件
    wget -c https://raw.githubusercontent.com/esp8266/esp8266-wiki/master/include.tgz
    tar zxvf include.tgz -C ./builds/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.2/
    # 修改头文件文件夹权限
    sudo find ./builds/xtensa-lx106-elf/ -type d -print|xargs chmod 755;
    
    # Xtensa 静态链接库文件
    wget -c https://raw.githubusercontent.com/esp8266/esp8266-wiki/master/libs/libhal.a
    wget -c https://raw.githubusercontent.com/esp8266/esp8266-wiki/master/libs/libc.a
    mv libhal.a libc.a ./builds/xtensa-lx106-elf/lib/gcc/xtensa-lx106-elf/4.8.2/
    
    sudo mv ./builds/xtensa-lx106-elf/ /opt/
    
    # 环境变量
    sudo nano /etc/profile
    export PATH=$PATH:/opt/xtensa-lx106-elf/bin
    
    # 重启后生效
    # 测试
    $ xtensa-lx106-elf-gcc -v
    gcc version 4.8.2 (crosstool-NG 1.20.0)

    开发测试

        Demo 项目

    git clone https://github.com/espressif/ESP8266_RTOS_SDK.git
    
    cd examples/mqtt_demo/
    # 需要修改 SDK_PATH 和 BIN_PATH 的路径
    nano gen_misc.sh
    export SDK_PATH=$SDK_PATH
    export BIN_PATH=$BIN_PATH
    
    # 注意:要在 gen_misc.sh 的目录下执行此脚本
    ./gen_misc.sh
    
    Please check SDK_PATH & BIN_PATH, enter (Y/y) to continue: Y
    
    STEP 2: choose bin generate(0=eagle.flash.bin+eagle.irom0text.bin, 1=user1.bin, 2=user2.bin)
    enter (0/1/2, default 0): 1
    
    STEP 3: choose spi speed(0=20MHz, 1=26.7MHz, 2=40MHz, 3=80MHz)
    enter (0/1/2/3, default 2): 2
    
    STEP 4: choose spi mode(0=QIO, 1=QOUT, 2=DIO, 3=DOUT)
    enter (0/1/2/3, default 0): 0
    
    STEP 5: choose spi size and map
        0= 512KB( 256KB+ 256KB)
        2=1024KB( 512KB+ 512KB)
        3=2048KB( 512KB+ 512KB)
        4=4096KB( 512KB+ 512KB)
        5=2048KB(1024KB+1024KB)
        6=4096KB(1024KB+1024KB)
        7=4096KB(2048KB+2048KB) not support ,just for compatible with nodeMCU board
        8=8192KB(1024KB+1024KB)
        9=16384KB(1024KB+1024KB)
    enter (0/2/3/4/5/6/7/8/9, default 0): 6

    SDK Path

    Compiled Successfully

        烧写固件

        烧写工具的安装请参考文章 《NodeMCU入门》烧写 NodeMCU 固件 部分。

    # 擦除 Flash
    esptool.py -p /dev/ttyUSB0 -b 921600 erase_flash
    
    # 烧写固件
    esptool.py -p /dev/ttyUSB0 write_flash -fm qio 0x00000 ./bin/boot_v1.6.bin 0x01000 ./bin/upgrade/user1.4096.new.6.bin 0x3fb000 ./bin/blank.bin 0x3fc000 ./bin/esp_init_data_default.bin

    ESP8266 调试串口默认波特率为 74880 band/s,可以通过 SecureCRT、Putty 等工具查看串口输出。Linux 下串口输出乱码?Windows 正常?


    * 参考资料:https://github.com/esp8266/esp8266-wiki/wiki/Toolchain

    本文标题:ESP8266在Linux下的开发
    本文链接:https://lanseyujie.com/post/develop-esp8266-under-linux.html
    版权声明:本文使用「署名-非商业性使用-相同方式共享」创作共享协议,转载或使用请遵守署名协议。
    点赞 0 分享 0
    上一篇:静夜
    呃...本文暂时没人留言,来添加一个吧!