[編譯] 9、在Linux下搭建 nordic 最新基於 zephyr 的開發燒寫環境

beautifulzzzz發表於2021-08-19


前言

nRF Connect SDK 包括 libs 和 app demo,該 SDK + DEMO 是基於 ZephyrOS 實現的(因此,環境搭建會稍微麻煩億點點)!

該 SDK 支援 nRF52, nRF53, and nRF91 系列晶片。

接下來會一步步介紹如何在 Arch Linux 上搭建該 SDK 的開發環境:

  • Zephyr requirements and GNU ARM Embedded Toolchain
  • nRF Connect SDK
  • SEGGER Embedded Studio

1、概述

首先下載 nRF Connect for Desktop,linux上是個綠色版本,直接啟動即可:

然後根據 Getting Started Assistant 指導進行安裝。

更詳細的指導在(推薦用更詳細的指導,因為上面的指導受GUI限制,不能放很詳細的說明,新手手動安裝,容易出現問題):
https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/gs_installing.html#build-environment-cli


2、安裝工具

安裝:git、wget、cmake、make、dtc、tk

注: 輸入 cmake --version 校驗 cmake 的版本,nRF Connect SDK 需要 cmake 的版本 ≥ 3.13.1。

安裝 ninja-build:

Ninja is a small build system with a focus on speed. It differs from other build systems in two major respects: it is designed to have its input files generated by a higher-level build system, and it is designed to run builds as fast as possible.

sudo pacman -S ninja

安裝 GPerf:

GNU gperf is a perfect hash function generator. For a given list of strings, it produces a hash function and hash table, in form of C or C++ code, for looking up a value depending on the input string. The hash function is perfect, which means that the hash table has no collisions, and the hash table lookup needs a single string comparison only.

sudo pacman -S gperf

安裝 ccache:

Ccache (or “ccache”) is a compiler cache. It speeds up recompilation by caching previous compilations and detecting when the same compilation is being done again. Ccache is free software, released under the GNU General Public License version 3 or later. See also the license page.

sudo pacman -S ccache

安裝 dfu-util:

dfu-util is a host side implementation of the DFU 1.0 and DFU 1.1 specifications of the USB forum.

sudo pacman -S dfu-util

安裝 python-pip (3):

sudo pacman -S  python-pip

安裝 python-setuptools(3):

sudo pacman -S python-setuptools

安裝 python 輪子工具 python-wheel (3):

sudo pacman -S python-wheel

安裝壓縮工具 xz-utils:

sudo pacman -S xz

安裝 file (linux 的 file 命令):

sudo pacman -S file

安裝 west:

west 是 ZephyrOS 用來做 CI 的工具。

west 不能pip直接安裝,因為安裝的版本太老了,0.8.0的,而我們這裡需要用最新的版本(0.11.1),因此要拉取原始碼,自己安裝:

git clone git@github.com:zephyrproject-rtos/west.git
cd west
git checkout v0.11.1
sudo pip install .      #一定要sudo

3、獲取 nRF Connect SDK 原始碼

nRF Connect SDK 包含 4 個 GitHub 倉庫,設定 nRF Connect SDK,需要將這些倉庫都拉取下來,並且安裝必要的 python modules。

mkdir ncs
cd ncs
west init -m https://github.com/nrfconnect/sdk-nrf --mr master
west update   #clone the project repositories, long time
west zephyr-export

操作完之後,NCS 的目錄結構如下:

ncs
 |___ .west
 |___ bootloader
 |___ modules
 |___ nrf
 |___ nrfxlib
 |___ zephyr
 |___ ...

4、安裝 Python modules

cd <sourcecode_root>/ncs
pip3 install --user -r zephyr/scripts/requirements.txt
pip3 install --user -r nrf/scripts/requirements.txt
pip3 install --user -r bootloader/mcuboot/scripts/requirements.txt

5、安裝 toolchain

為了實現交叉編譯應用程式,我們需要下載安裝 GNU Arm Embedded Toolchain。

注意:一定要注意選擇的 Toolchain 的版本一定要 ≥ 9-2019-q4-major 版本要求。

設定 toolchain 一般需要如下步驟:

  • 下載
  • 解壓到 ~/gnuarmemb 下(推薦)
  • 加入環境變數
#Install the GNU Arm Embedded Toolchain
#https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.07/gcc-arm-none-eabi-10.3-2021.07-x86_64-linux.tar.bz2
tar xvf gcc-arm-none-eabi-10.3-2021.07-x86_64-linux.tar.bz2
mv gcc-arm-none-eabi-10.3-2021.07 gnuarmemb
mv gnuarmemb ~/

export ZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb
export GNUARMEMB_TOOLCHAIN_PATH="~/gnuarmemb"

6、下載 nRF Command Line Tools

The nRF Command Line Tools is used for development, programming and debugging of Nordic Semiconductor's nRF51, nRF52, nRF53 and nRF91 Series devices.

主要功能:

  • nrfjprog executable - tool for programming through SEGGER J-LINK programmers and debuggers
  • mergehex executable - enables you to combine up to three .HEX files into one single file
  • nrfjprog DLL - a DLL that exports functions for programming and controlling nRF51, nRF52, nRF53 and nRF91 Series devices and lets developers create their own development tools using the DLLs API
  • SEGGER J-Link software and documentation pack

我們主要用其 nrfjprog 燒寫韌體。

https://www.nordicsemi.com/Products/Development-tools/nRF-Command-Line-Tools/Download#infotabs

nordic 將其工具弄個俄羅斯套娃,大家直接看命令:

#Install nRF-command-Line-Tools
wget https://www.nordicsemi.com/-/media/Software-and-other-downloads/Desktop-software/nRF-command-line-tools/sw/Versions-10-x-x/10-13-0/nRF-Command-Line-Tools_10_13_0_Linux64.zip
unzip nRF-Command-Line-Tools_10_13_0_Linux64.zip
cd nRF-Command-Line-Tools_10_13_0_Linux64
tar -xzf nRF-Command-Line-Tools_10_13_0_Linux-amd64.tar.gz
tar xvf nRF-Command-Line-Tools_10_13_0.tar
mv nrfjprog ~/
export PATH=${HOME}/nrfjprog:"$PATH" 

注:可能會報下面的錯誤:

-- west flash: using runner nrfjprog
ERROR: JLinkARM DLL is invalid. Please reinstall latest JLinkARM DLL.
FATAL ERROR: command exited with status 31: nrfjprog --ids
make[3]: *** [zephyr/cmake/flash/CMakeFiles/flash.dir/build.make:72: zephyr/cmake/flash/CMakeFiles/flash] Error 31
make[2]: *** [CMakeFiles/Makefile2:4072: zephyr/cmake/flash/CMakeFiles/flash.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:4079: zephyr/cmake/flash/CMakeFiles/flash.dir/rule] Error 2
make: *** [Makefile:878: flash] Error 2

需要安裝 Jlink:yaourt -S jlink (網速要好!!!)

make flash 時報錯
-- runners.nrfjprog: Flashing file: /home/btfz/Desktop/apple/ncs/nrf/samples/bluetooth/peripheral_bms/build/zephyr/zephyr.hex
ERROR: JLinkARM DLL reported an error. Try again. If error condition
ERROR: persists, run the same command again with argument --log, contact Nordic
ERROR: Semiconductor and provide the generated log.log file to them.
FATAL ERROR: command exited with status 33: nrfjprog --program /home/btfz/Desktop/apple/ncs/nrf/samples/bluetooth/peripheral_bms/build/zephyr/zephyr.hex --sectoranduicrerase -f NRF52 --snr 682428062
make[3]: *** [zephyr/cmake/flash/CMakeFiles/flash.dir/build.make:72: zephyr/cmake/flash/CMakeFiles/flash] Error 33
make[2]: *** [CMakeFiles/Makefile2:4072: zephyr/cmake/flash/CMakeFiles/flash.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:4079: zephyr/cmake/flash/CMakeFiles/flash.dir/rule] Error 2
make: *** [Makefile:878: flash] Error 2

需要用 sudo 許可權執行 nrfjprog --program /home/btfz/Desktop/apple/ncs/nrf/samples/bluetooth/peripheral_bms/build/zephyr/zephyr.hex --sectoranduicrerase -f NRF52 --snr 682428062


7、編譯執行

➜  ncs cd nrf/samples/bluetooth/peripheral_bms/
➜  peripheral_bms git:(master) source ../../../../zephyr/zephyr-env.sh 
➜  peripheral_bms git:(master) rm -rf build && mkdir build && cd build  && cmake -DBOARD=nrf52dk_nrf52832 .. && make

...

[ 94%] Building C object modules/segger/CMakeFiles/modules__segger.dir/home/btfz/Desktop/apple/ncs/modules/debug/segger/SEGGER/SEGGER_RTT.c.obj
[ 94%] Building C object modules/segger/CMakeFiles/modules__segger.dir/SEGGER_RTT_zephyr.c.obj
[ 95%] Linking C static library libmodules__segger.a
[ 95%] Built target modules__segger
[ 95%] Building C object zephyr/CMakeFiles/zephyr_prebuilt.dir/misc/empty_file.c.obj
[ 96%] Linking C executable zephyr_prebuilt.elf
Logical command for additional byproducts on target: zephyr_prebuilt

[ 96%] Built target zephyr_prebuilt
Scanning dependencies of target linker_zephyr_final_script_target
[ 96%] Generating linker.cmd
[ 96%] Built target linker_zephyr_final_script_target
[ 96%] Generating isr_tables.c, isrList.bin
[ 97%] Generating dev_handles.c
[ 97%] Building C object zephyr/CMakeFiles/zephyr_final.dir/misc/empty_file.c.obj
[ 98%] Building C object zephyr/CMakeFiles/zephyr_final.dir/isr_tables.c.obj
[ 98%] Building C object zephyr/CMakeFiles/zephyr_final.dir/dev_handles.c.obj
[100%] Linking C executable zephyr.elf
Memory region         Used Size  Region Size  %age Used
           FLASH:      168248 B       512 KB     32.09%
            SRAM:       29325 B        64 KB     44.75%
        IDT_LIST:          0 GB         2 KB      0.00%
Generating files from zephyr.elf for board: nrf52dk_nrf52832
[100%] Built target zephyr_final

8、燒寫

燒寫直接用 sudo make flash,注意一定要用 sudo,此外,在安裝 west 的時候也一定要用 sudo,否則會報如下錯誤:

/usr/bin/python3.9: No module named west
make[3]: *** [zephyr/cmake/flash/CMakeFiles/flash.dir/build.make:72: zephyr/cmake/flash/CMakeFiles/flash] Error 1
make[2]: *** [CMakeFiles/Makefile2:4072: zephyr/cmake/flash/CMakeFiles/flash.dir/all] Error 2
make[1]: *** [CMakeFiles/Makefile2:4079: zephyr/cmake/flash/CMakeFiles/flash.dir/rule] Error 2
make: *** [Makefile:878: flash] Error 2

9、全自動環境構建指令碼

以我的風格,必須要寫一個自動化構建環境指令碼:(執行該指令碼時,務必保證網速到位!!!)

#!/bin/bash
#https://developer.nordicsemi.com/nRF_Connect_SDK/doc/latest/nrf/gs_installing.html#id10

CUR_PATH=$(cd `dirname $0`; pwd)
TOOLS_PATH=$CUR_PATH/tools
NCS_PATH=$CUR_PATH/ncs

mkdir $TOOLS_PATH
#Install the required tools
sudo pacman -S git cmake ninja gperf ccache dfu-util dtc wget \
    python-pip python-setuptools python-wheel tk xz file make cmake

cmake --version
dtc --version
python3 --version

#To install the GN tool, complete the following steps:
mkdir $TOOLS_PATH/gn && cd $TOOLS_PATH/gn
wget -O gn.zip https://chrome-infra-packages.appspot.com/dl/gn/gn/linux-amd64/+/latest
unzip gn.zip
rm gn.zip

export PATH=$TOOLS_PATH/gn:"$PATH" 


#Install west
mkdir $TOOLS_PATH/west && cd $TOOLS_PATH/west
git clone git@github.com:zephyrproject-rtos/west.git
cd west
git checkout v0.11.1
sudo pip install .  ###mast sudo 

#Install the GNU Arm Embedded Toolchain
#https://developer.arm.com/tools-and-software/open-source-software/developer-tools/gnu-toolchain/gnu-rm/downloads
cd $TOOLS_PATH
wget https://developer.arm.com/-/media/Files/downloads/gnu-rm/10.3-2021.07/gcc-arm-none-eabi-10.3-2021.07-x86_64-linux.tar.bz2
tar xvf gcc-arm-none-eabi-10.3-2021.07-x86_64-linux.tar.bz2
mv gcc-arm-none-eabi-10.3-2021.07 gnuarmemb

export ZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb
export GNUARMEMB_TOOLCHAIN_PATH=$TOOLS_PATH/gnuarmemb


#Install nRF-command-Line-Tools
cd $TOOLS_PATH
wget https://www.nordicsemi.com/-/media/Software-and-other-downloads/Desktop-software/nRF-command-line-tools/sw/Versions-10-x-x/10-13-0/nRF-Command-Line-Tools_10_13_0_Linux64.zip
unzip nRF-Command-Line-Tools_10_13_0_Linux64.zip
cd nRF-Command-Line-Tools_10_13_0_Linux64
tar -xzf nRF-Command-Line-Tools_10_13_0_Linux-amd64.tar.gz
tar xvf nRF-Command-Line-Tools_10_13_0.tar
mv nrfjprog ../

export PATH=$TOOLS_PATH/nrfjprog:"$PATH" 

#Install JLink
tar zxvf JLink_Linux_V750a_x86_64.tgz
mv JLink_Linux_V750a_x86_64 ../JLink
export PATH=$TOOLS_PATH/JLink:"$PATH" 

cd ..
rm -rf nRF-Command-Line-Tools_10_13_0_Linux64

#Get the nRF Connect SDK code
mkdir $NCS_PATH && cd $NCS_PATH
west init -m https://github.com/nrfconnect/sdk-nrf --mr master
west update
west zephyr-export

tree -L 1

#Install additional Python dependencies
pip3 install --user -r zephyr/scripts/requirements.txt
pip3 install --user -r nrf/scripts/requirements.txt
pip3 install --user -r bootloader/mcuboot/scripts/requirements.txt

連結



: ** 我做了一系列全自動構建編譯環境的工程,目前可以覆蓋:51微控制器、stm8、esp8266、esp32、nrf51822、nrf52832、android,歡迎到我的 nbtool github 下交流:https://github.com/nbtool **

相關文章