[Zephyr] 1、在linux上安裝Zephyr-OS並跑DEMO

星期五, 14. 九月 2018 02:18上午 - BEAUTIFULZZZZ


0) 前言

Zephyr™項目是一個採用Apache 2.0協議許可,Linux基金會託管的協作項目。爲所有資源受限設備,構建了針對低功耗、小型內存微處理器設備而進行優化的物聯網嵌入式小型、可擴展的實時操作系統(RTOS),支持多種硬件架構及多種開發板,可以在小至8 kB內存的系統上運行。

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

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

這裏作爲入門篇,將介紹在linux上安裝Zephyr,並基於模擬器和實體開發板進行DEMO編譯運行。


1)下載、克隆到本地

將zephyr克隆到本地home目錄下:

cd ~
git clone [email protected]:zephyrproject-rtos/zephyr.git


2) Zephyr Build系統簡介

Zephyr工程使用CMake作爲管理工程開發的工具。CMake能夠生成不同格式的build文件,當前Zephyr支持下面兩種構建管理工具:

  • make: UNIX-Like平臺
  • ninja: 全平臺支持

Zephyr工程的大多數DEMO採用ninja作爲build工具,但是make也是能做所有類似工作的。


3) 設置開發環境

Zephyr可以在Windows\MAC\Linux上開發,這裏僅介紹在linux上的設置:

  • update下:

      sudo apt-get update
      sudo apt-get upgrade
  • 安裝依賴:

      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 python3-wheel xz-utils file \
        make gcc-multilib autoconf automake libtool librsvg2-bin \
        texlive-latex-base texlive-latex-extra latexmk texlive-fonts-recommended
  • 安裝開發Zephyr所需要的附加包:

      cd ~/zephyr  # or to your directory where zephyr is cloned
      pip3 install --user -r scripts/requirements.txt
  • 安裝3.8.2版本及以上的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
      echo "export PATH=$PWD/cmake-3.8.2-Linux-x86_64/bin:\$PATH" >> $HOME/.zephyrrc
      source <zephyr git clone location>/zephyr-env.sh
      cmake --version
  • 安裝Zephyr Software Development Kit(SDK):

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

    SDK支持以下架構:

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

    按照以下步驟在Linux主機系統上安裝SDK:

      cd ~/Downloads/
      wget https://github.com/zephyrproject-rtos/meta-zephyr-sdk/releases/download/0.9.3/zephyr-sdk-0.9.3-setup.run
      sh zephyr-sdk-0.9.3-setup.run

    注:按照屏幕上的安裝說明,工具鏈默認安裝在/opt/zephyr-sdk/,但是建議在主目錄下安裝,這裏我安裝在~/zephyr-sdk

    設置全局變量vim ~/.zephyrrc

      export ZEPHYR_TOOLCHAIN_VARIANT=zephyr
      export ZEPHYR_SDK_INSTALL_DIR=/home/btfz/zephyr-sdk


4) 在QEMU中運行一個示例應用程序

爲了直接在開發環境中快速測試,QEMU是一個很好的選擇,通過配置其可以支持X86 and ARM Cortex-M3架構。

用X86模擬板級配置(qemu_x86)運行一個程序,如下:

cd $ZEPHYR_BASE/samples/hello_world
mkdir build && cd build

# Use cmake to configure a Ninja-based build system:
cmake -GNinja -DBOARD=qemu_x86 ..

# Now run ninja on the generated build system:
ninja
ninja run

退出qemu模擬器:ctrl-a,然後按x
可見QEMU並不是支持所有板子,有些時候需要拿真實板子來開發!


5) 在nRF51822-QFAA-PCA10028開發板上運行DEMOM(#2)

這裏首先測試的是Hello World:
第0步:設置編譯環境:

cd zephyr
source zephyr-env.sh

第一步:用minicom連接串口,一會用來打印數據:

minicom -D <tty_device> -b 115200

第二步:編譯和燒寫:

cd $ZEPHYR_BASE/samples/hello_world
mkdir build && cd build

# Use cmake to configure a Ninja-based build system:
cmake -GNinja -DBOARD=nrf51_pca10028 ..

# Now run ninja on the generated build system:
ninja
ninja flash

注: 有的時候會報:ERROR: ld.so: object 'libgtk3-nocsd.so.0' from LD_PRELOAD cannot be preloaded (cannot open shared object file): ignored.的錯誤(cmake時),和fatal error: 2 No such file or directory: 'nrfjprog'的錯誤(flash時),解決辦法是在~/.zephyrc中添加環境變量,並重新source下環境變量:

➜  hello_world git:(master) cat ~/.zephyrrc 
export PATH=/home/btfz/cmake/cmake-3.8.2-Linux-x86_64/bin:$PATH
export ZEPHYR_TOOLCHAIN_VARIANT=zephyr
export ZEPHYR_SDK_INSTALL_DIR=/home/btfz/zephyr-sdk

export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libgtk3-nocsd.so.0
export PATH=$PATH:/home/btfz/Downloads/AAAA/nRF5x-Command-Line-Tools_9_7_3/nrfjprog

用同樣的方法也可以測試nrf51_pca10028板子的下面兩個DEMO:

  • samples/basic/blinky
  • samples/basic/button


6) 分析一個簡單應用層代碼,帶你更深入一步

和5一樣的nRF51開發板,不僅支持閃燈和按鍵工程,還支持很多騷操作。我們就拿最簡單的beacon分析下吧(畢竟作爲玩藍牙的,所有的文章都得點一下題吧,哈哈):

  • samples/bluetooth/beacon
/* main.c - Application main entry point */

/*
 * Copyright (c) 2015-2016 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

#include <zephyr/types.h>
#include <stddef.h>
#include <misc/printk.h>
#include <misc/util.h>

#include <bluetooth/bluetooth.h>
#include <bluetooth/hci.h>

#define DEVICE_NAME CONFIG_BT_DEVICE_NAME
#define DEVICE_NAME_LEN (sizeof(DEVICE_NAME) - 1)

/*
 * Set Advertisement data. Based on the Eddystone specification:
 * https://github.com/google/eddystone/blob/master/protocol-specification.md
 * https://github.com/google/eddystone/tree/master/eddystone-url
 */
static const struct bt_data ad[] = {
    BT_DATA_BYTES(BT_DATA_FLAGS, BT_LE_AD_NO_BREDR),
    BT_DATA_BYTES(BT_DATA_UUID16_ALL, 0xaa, 0xfe),
    BT_DATA_BYTES(BT_DATA_SVC_DATA16,
              0xaa, 0xfe, /* Eddystone UUID */
              0x10, /* Eddystone-URL frame type */
              0x00, /* Calibrated Tx power at 0m */
              0x00, /* URL Scheme Prefix http://www. */
              'z', 'e', 'p', 'h', 'y', 'r',
              'p', 'r', 'o', 'j', 'e', 'c', 't',
              0x08) /* .org */
};

/* Set Scan Response data */
static const struct bt_data sd[] = {
    BT_DATA(BT_DATA_NAME_COMPLETE, DEVICE_NAME, DEVICE_NAME_LEN),
};

static void bt_ready(int err)
{
    if (err) {
        printk("Bluetooth init failed (err %d)\n", err);
        return;
    }

    printk("Bluetooth initialized\n");

    /* Start advertising */
    err = bt_le_adv_start(BT_LE_ADV_NCONN, ad, ARRAY_SIZE(ad),
                  sd, ARRAY_SIZE(sd));
    if (err) {
        printk("Advertising failed to start (err %d)\n", err);
        return;
    }

    printk("Beacon started\n");
}

void main(void)
{
    int err;

    printk("Starting Beacon Demo\n");

    /* Initialize the Bluetooth Subsystem */
    err = bt_enable(bt_ready);
    if (err) {
        printk("Bluetooth init failed (err %d)\n", err);
    }
}

核心的就是bt_le_adv_start(BT_LE_ADV_NCONN, ad, ARRAY_SIZE(ad),sd, ARRAY_SIZE(sd))函數,啓動一個ble廣播,其廣播數據爲static const struct bt_data ad[] 定義的數據。在nRF connect APP中可以搜索到該beacon信息:

在搜索列表裏會發現有個叫Eddystone的藍牙設備,其廣播的數據爲zephyr的主頁網址~

時間不早了,其他更好玩的東西會在今後的文章中介紹~

[1].getting started.
[2].nrf51_pca10028 doc
[3].ERROR: ld.so: object 'libgtk3-nocsd.so.0' from LD_PRELOAD

@beautifulzzzz
智能硬件、物聯網,熱愛技術,關注產品
博客:http://blog.beautifulzzzz.com
園友交流羣:414948975
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章