天天看點

Zephyr 編譯環境搭建(Linux + Window)

Zephyr 系統介紹

Zephyr™ 項目是一個采用 Apache 2.0 協定許可,Linux基金會托管的協作項目。為所有資源受限裝置,建構了針對低功耗、小型記憶體微處理器裝置而進行優化的物聯網嵌入式小型、可擴充的實時作業系統(RTOS),支援多種硬體架構及多種開發闆,可以在小至 8 kB 記憶體的系統上運作。

Zephyr 采用深入的安全開發生命周期:安全驗證,模糊和滲透測試,頻繁的代碼審查,靜态代碼分析,威脅模組化和審查,以防止代碼中的後門 。

Zephyr 支援 Bluetooth、Bluetooth Low Energy、Wi-Fi、802.15.4、6Lowpan、CoAP、IPv4、IPv6 和 NFC 等标準,通過社群驅動的發展來改進和增強功能 。

基于 Linux 的編譯環境搭建

Zephyr 可以在 Windows/MAC/Linux 上開發,首先介紹在 Linux(Ubuntu) 上的環境搭建 :

1. 更新軟體源

sudo apt-get update
sudo apt-get upgrade
           

2. 安裝依賴軟體包

## 下面是整個一條指令
sudo apt-get install --no-install-recommends git cmake ninja-build gperf \
ccache doxygen dfu-util device-tree-compiler \
python3-ply python3-pip python3-setuptools xz-utils file make gcc-multilib   
           

3. 克隆 Zephyr 源碼倉庫

建議把 Zephyr 源碼克隆到使用者目錄中,例如克隆至

repo/zephyr

檔案夾中。

mkdir -p repo cd repo git clone https://github.com/zephyrproject-rtos/zephyr
           

4. 安裝必要的依賴工具

## 進入 Zephyr 檔案夾
cd zephyr

## 通過 pip3 工具安裝其他依賴工具								
pip3 install --user -r scripts/requirements.txt	  
           

5. 安裝 3.8.2 版本及以上 CMake 工具

Zephyr 的開發需要

cmake 3.8.2

或以上版本,通過 ubuntu 軟體倉庫安裝的

cmake

版本較低并不符合要求,可通過以下步驟把合适的CMake安裝到

~/cmake

目錄下。

mkdir $HOME/cmake && cd $HOME/cmake

wget https://cmake.org/files/v3.8/cmake-3.8.2-Linux-x86_64.sh

yes | sh cmake-3.8.2-Linux-x86_64.sh | cat
           

把 CMake 安裝目錄增加到使用者環境變量中,修改使用者目錄中的

.bashrc

檔案的最後增加一行 ,

echo "export PATH=$PWD/cmake-3.8.2-Linux-x86_64/bin:\$PATH" >> $HOME/.zephyrrc

## 執行 Zephyr 源碼目錄下的 zephyr-env.sh
source <zephyr git clone location>/zephyr-env.sh
      
cmake --version
           

檢視目前 Cmake 版本号,如果是 3.8.2 ,則說明配置正常。

6. 安裝 Zephyr SDK

Zephyr 的 SDK 包含所有必須的工具和交叉編譯器,用于支援 build 核心在不同的系統架構上。除此之外,它包括主機工具,如自定義 QEMU 二進制檔案和主機編譯器,如果需要的話,可以建構宿主工具。

SDK支援以下架構:

  • X86
  • X86 IAMCU ABI
  • ARM
  • ARC
  • Nios II
  • Xtensa
  • RISC-V

本文使用的 SDK 版本是 0.9.5 ,安裝過程中控制台将出現 Zephyr SDK 安裝路徑的提示,建議把 Zephyr SDK 安裝到使用者目錄

~/opt/zephyr-sdk

檔案夾中。

## 下載下傳 SDK,如果下載下傳過程中速度過慢,可以在浏覽器中下載下傳後拷貝到對應檔案夾中
mkdir -p ~/opt/zephyr-sdk && cd ~/opt/zephyr-sdk
wget https://github.com/zephyrproject-rtos/meta-zephyr-sdk/releases/download/0.9.2/zephyr-sdk-0.9.2-setup.run

## 安裝 SDK
sudo chmod +x zephyr-sdk-0.9.2-setup.runa
./zephyr-sdk-0.9.2-setup.run
           

7. 設定環境變量

在使用者目錄

.bashrc

檔案末尾再增加

ZEPHYR_GCC_VARIANT

ZEPHYR_SDK_INSTALL_DIR

ZEPHYR_BASE

等參數,修改完成之後在控制台執行

source ~/.bashrc

,該指令可使新增加的環境變量立即生效 。

這裡建議使用 vim 編輯器,如果 ubuntu 中預設沒有安裝可以先安裝:

## 安裝 vim 精簡版 vim.tiny
sudo apt-get install vim-gtk       

## 配置 vim
sudo vim /etc/vim/vimrc

## 請在您的 vimrc 檔案末尾添加如下配置,之後儲存退出檔案
set nu                     ## 在左側行号
set tabstop                ## tab 長度設定為 4
set nobackup               ## 覆寫檔案時不備份
set cursorline             ## 突出顯示目前行
set ruler                  ## 在右下角顯示光标位置的狀态行
set autoindent             ## 自動縮進
           

安裝 vim 編輯器之後,可以配置添加環境變量。

vim ~/.bashrc

## 檔案末尾添加如下配置,之後儲存退出檔案
export PATH=<camke install directory>/bin:$PATH        ## cmake 安裝路徑
export ZEPHYR_GCC_VARIANT=zephyr
export ZEPHYR_SDK_INSTALL_DIR=<zephyr-sdk directory>   ## Zephyr SDK 安裝路徑
export ZEPHYR_BASE=<zephyr local repository directory> ## Zephyr 源碼路徑

## 執行指令時環境變量立即生效
source ~/.bashrc
           

8. 在 QEMU 中運作 hello world 示例程式

完成上述安裝過程後,可以通過

hello world

示例驗證 Zephyr 開發環境是否一切正常。此處使用

qemu_x86

仿真平台進行驗證。此處編譯生成的

hello world

可執行檔案将運作于 QEMU 仿真平台。

$ZEPHYR_BASE/samples/hello_world

檔案夾下檔案介紹:

  • CMakeLists.txt:建構檔案,用于生成makefile;
  • prj.conf:配置檔案 ;
  • src/main.c:主函數檔案。

通過 CMake 生成 Makefile 檔案時,需要通過 BOARD 參數指定目标平台,此處指定為 qemu_x86 平台。如果想在QEMU 上運作示例代碼,需要先安裝 Ninaja 工具用于編譯源碼檔案:

cd ~/repo
git clone git://github.com/ninja-build/ninja.git && cd ninja

## 生成可執行檔案
./configure.py --bootstrap

## 将生成的可執行檔案 ninja 拷貝到系統目錄(/user/bin)下
sudo cp ninja /user/bin/
           

安裝完成 Ninaja 工具之後可以直接使用 Ninaja 工具生成工程了,以 Zephyr 系統中

hello world

例程為例:

cd $ZEPHYR_BASE/samples/hello_world

##建立一個 build 目錄,用于存放臨時目錄
mkdir -p build && cd build

## 通過 cmake 指令生成 qemu_x86 平台 makefile 檔案
cmake -GNinja -DBOARD=qemu_x86 ..

## 編譯執行程式
ninja
ninja run

## 可以看到界面列印 hello world 日志
## 退出 qemu 模拟器方式:ctrl-a,然後按 x
           

9. 在 nRF52832 上運作藍牙示例程式

接下來,我們在實際闆子 nRF52832 上運作 Zephyr 系統的藍牙心率計例程,例程目錄為

$ZEPHYR_BASE/samples/bluetooth/peripheral_hr

。通過 Cmake 生成 Makefile 檔案時,需要通過 BOARD 參數指定目标平台,此處指定為 nrf52_pca10040 平台。可以使用 Cmake 生成執行檔案,也可以使用 Ninja 檔案生成可執行檔案。

下面是使用 Cmake 工具生成執行檔案過程:

cd $ZEPHYR_BASE/samples/bluetooth/peripheral_hr

##建立一個 build 目錄,用于存放臨時目錄
mkdir -p build && cd build

## 通過 cmake 指令生成 nrf52_pca10040 平台 makefile 檔案
cmake -DBOARD=nrf52_pca10040 ..

## 配置工程和編譯
make menuconfig           ## 用于打開 menuconfig 工具配置功能,如開啟 shell 功能、修改優化等級等
make                      ## 編譯程式
           

編譯完成在 build 目錄下會生成 zephyr 目錄,zephyr 目錄下有可執行檔案(.bin、.elf、.hex 等,這裡使用 hex 檔案)。本裝置使用的可執行檔案名為

zephyr.hex

,在 window 系統下擷取該檔案,使用

nRFgo Studio

工具燒寫到 nRF52832 裝置上(nRF5x Programming -> program Application -> Browse 選擇生成的 zephyr.hex 檔案 -> Program 燒寫)。

nRFgo Studio 工具使用時如果出現下載下傳不正常或 jlink 使用錯誤,可以檢視 jlink 錯誤解析 來解決問題。

燒寫完成,重新開機裝置,打開手機藍牙可以搜尋到名稱為

Zephyr Heartrate Sensor

的藍牙裝置,說明示例程式運作正确。

基于 Window 的編譯環境搭建

下面介紹在 window 環境下搭建 Zephyr 系統編譯環境,這裡使用

cmd.exe

程式建構編譯環境,如果使用

PowerShell

可能有所不同,建議檢視 Zephyr 官方介紹。

1. 設定環境變量用于下載下傳網絡資源

建議先用管理者權限運作 cmd.exe 程式,執行如下操作:

set HTTP_PROXY=http://user:[email protected]:1234
set HTTPS_PROXY=http://user:[email protected]:1234
           

2. 安裝 Chocolatey 軟體

使用 cmd 安裝:

使用 PowerSehll 安裝:

安裝完成之後執行

choco

指令可以檢視 Chocolatey 軟體版本号資訊,說明安裝成功。

## 輸入 choco
choco

## 顯示 Chocolatey 版本号
Chocolatey v0.10.11
Please run 'choco -?' or 'choco <command> -?' for help menu.
           

3. 安裝 Cmake 和其他工具

## 全局關閉确認,避免安裝軟體是确認
choco feature enable -n allowGlobalConfirmation

## 安裝 Cmake 工具
choco install cmake --installargs 'ADD_CMAKE_TO_PATH=System'
    
## 安裝其他工具 git、python、ninja、dtc-msys2、gperf 等
choco install git python ninja dtc-msys2 gperf
           

4. 下載下傳 Zephyr 源碼程式

這裡我下載下傳到 Zephyr 源碼到

E:\RT-Thread\

目錄下。

cd E:\RT-Thread
git clone https://github.com/zephyrproject-rtos/zephyr
           

5. 安裝 Python 依賴包

pip3 install -r zephyr/scripts/requirements.txt
           

如果出現如下錯誤提示:

Using cached https://files.pythonhosted.org/packages/cc/02/a1b500a5a467df64b5d4502072d4850b788065306dbbc8d3e0afc29ce5be/pyocd-0.13.2.tar.gz
    Complete output from command python setup.py egg_info:
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
      File "C:\Users\ChenYong\AppData\Local\Temp\pip-install-bu__14uj\pyocd\setup.py", line 31, in <module>
      long_description=open('README.md', 'r').read(),
      UnicodeDecodeError: 'gbk' codec can't decode byte 0xa6 in position 5960: illegal multibyte sequence
           

原因是指令行工具的标準輸出流編碼不對,我們可以将 Zephyr 系統中安裝

scripts/requirements.txt

檔案中的 pyocd 工具的安裝屏蔽掉,後面的編譯沒有使用該軟體。

## requirements.txt 檔案中屏蔽 pyocd 軟體安裝
.....
# pyocd
....
           

之後再自行上面安裝 python 依賴包指令,可正常執行。

6. 安裝第三方編譯工具

這裡安裝的是 GNU ARM 編譯工具(Zephyr官網還有其他第三方編譯工具,根據實際需求下載下傳安裝)。

工具下載下傳位址:https://developer.arm.com/open-source/gnu-toolchain/gnu-rm/downloads ,根據自己系統配置下載下傳安裝 GNU ARM 編譯工具, 安裝路徑建議為

C:\gnu_arm_embedded

安裝完成設定環境變量,如下所示:

set ZEPHYR_TOOLCHAIN_VARIANT=gnuarmemb
set GNUARMEMB_TOOLCHAIN_PATH=C:\gnu_arm_embedded
           

7. 編譯運作例程

cd zephyr

## 設定編譯環境參數
zephyr-env.cmd

## 進入示例檔案,這裡使用藍牙心率計示例
cd samples\bluetooth\peripheral_hr
mkdir build & cd build

## 使用 Cmake 配置基于 Ninja 搭建編譯環境,window 下必須基于 Ninja 搭建
cmake -GNinja -DBOARD=nrf52_pca10040 ..

## 可以選着使用 menuconfig 配置工程,可以配置優化等級
ninja menuconfig
ninja
           

代碼燒寫方式:

  • 編譯之後生成可執行檔案(這裡使用 hex 檔案),可按照上述 Linux 介紹方式燒寫程式。
  • 使用 jlink 工具将直接将生成的檔案(這裡使用的 elf 檔案)燒寫到 nRF52832 裝置中,操作步驟如下:
    • 建立一個 jlink 下載下傳腳本檔案名稱為

      download.jlink

      ,檔案内容如下:
    erase
    loadfile zephyr.hex
    r
    q
               
    • download.jlink

      檔案放入生成可執行檔案(elf 檔案)的目錄,本次例程為需要放入

      zephyr/sample/bluetooth/peripheral_hr/build/zephyr/

      目錄下;
    • 确認自己電腦中的 jlink 驅動安裝路徑,安裝路徑中不能帶有空格,如果帶有空格建議解除安裝更換路徑安裝,本次例程中 jlink 驅動路徑為:

      C:\Soft\SEGGER\JLink_V510\JLink.exe

    • cmd 中執行如下指令燒寫程式:
    ## jlink.exe 工具按照實際安裝路徑修改
    C:\Soft\SEGGER\JLink_V510h\JLink.exe -autoconnect 1 -device NRF52832_XXAA -if swd -speed 10000 -commandfile download.jlink
    
               
    • jlink 燒寫成功。

繼續閱讀