zoukankan      html  css  js  c++  java
  • [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 git@github.com:zephyrproject-rtos/zephyr.git
    

    2) Zephyr Build系统简介

    Zephyr工程使用CMake作为管理工程开发的工具。CMake能够生成不同格式的build文件,当前Zephyr支持下面两种构建管理工具:

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

    Zephyr工程的大多数DEMO采用ninja作为build工具,但是make也是能做所有类似工作的。


    3) 设置开发环境

    Zephyr可以在WindowsMACLinux上开发,这里仅介绍在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)
    ", err);
    		return;
    	}
    
    	printk("Bluetooth initialized
    ");
    
    	/* 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)
    ", err);
    		return;
    	}
    
    	printk("Beacon started
    ");
    }
    
    void main(void)
    {
    	int err;
    
    	printk("Starting Beacon Demo
    ");
    
    	/* Initialize the Bluetooth Subsystem */
    	err = bt_enable(bt_ready);
    	if (err) {
    		printk("Bluetooth init failed (err %d)
    ", 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
    
  • 相关阅读:
    Qt 定时器事件startTimer
    认识网络、几种常用的网络拓扑图
    拓扑结构图,什么是拓扑结构
    Qt 利用QTime类来控制时间,QTime的成员函数的用法
    Qt QTime类的使用
    Qt 打开文件的默认路径 QFileDialog::getOpenFileName()
    Qt QWidget颜色设置的三种方法
    Qt 多个QDockWidget 切换显示
    Qt QString 格式化 arg 前面自动补0
    Qt 使用QMediaPlayer报错 defaultServiceProvider::requestService(): no service found for
  • 原文地址:https://www.cnblogs.com/zjutlitao/p/9644346.html
Copyright © 2011-2022 走看看