星期五, 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可以在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的主页网址~

时间不早了,其他更好玩的东西会在今后的文章中介绍~

LINKS

[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

[Zephyr] 1、在linux上安装Zephyr-OS并跑DEMO的更多相关文章

  1. 在 Linux 的 KVM虚拟机 上安装 Mac OS 系统的研究总结

    在 Linux 的 KVM虚拟机 上安装 Mac OS 系统的研究总结 一.资料来源:    网上一共找到两个方法,一个是视频上的教程,一个是网页资料. 二.视频资料方法内容:1.install qe ...

  2. 在Linux上安装Hadoop

    先决条件: Hadoop是用JAVA写的,所以首先要安装Java.在Ubuntu上安装JDK见:http://blog.csdn.net/microfhu/article/details/766739 ...

  3. linux上安装Eclipse

    之所以要在linux上安装Eclipse,是因为一开始我是通过Eclipse+MingW+Samba+GDBserver方式在Windows上远程操作,准备编译调试nginx源代码的,可是在编译调试过 ...

  4. 在Windows和Linux上安装paramiko模块以及easy_install的安装方法

    一.paramiko模块有什么用? paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.由于使用的是python这样的能够跨平台运行的语言 ...

  5. 在Linux上安装Oracle RAC 12 c(12.1) 虚拟机,一步一步向导

    Oracle RAC 12 c(12.1)在Linux上安装虚拟机,一步一步向导 今天我们将看到如何安装 12 c版本1 RAC(真正的应用程序集群)数据库2 Linux 64位的虚拟机 使用VMWa ...

  6. WINDOWS和Linux上安装php7 alpha 并安装 yaf

    WINDOWS和Linux上安装php7 alpha 并安装 yaf PHP技术  widuu  2个月前 (06-15)  126浏览  0评论 windows 1.windows上安装 php7 ...

  7. 在Windows和Linux上安装paramiko模块

    一.paramiko模块有什么用? paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接.由于使用的是python这样的能够跨平台运行的语言 ...

  8. Linux上安装使用boost入门指导

    Data Mining Linux上安装使用boost入门指导 获得boost boost分布 只需要头文件的库 使用boost建立一个简单的程序 准备使用boost二进制文件库 把你的程序链接到bo ...

  9. 如何在Linux上安装Storm

    Storm是开源的分布式实时计算系统,能够让数据流处理变得简单.可靠,也因此在大数据领域有广泛的实际 应用.下面介绍一下如何在Linux系统上安装Storm.根据Storm官网介绍,安装Storm软件 ...

随机推荐

  1. SQL08 清空日志文件语句

    --1.先查询数据的日志文件的名称 USE lwlz_zhiluo GO SELECT name FROM SYS.database_files WHERE type_desc='LOG' --2.执 ...

  2. javaweb c3p0连接oracle12c

    最近在搞javaweb,在连接池上碰到了一系列的问题,在Junit测试时,oracle12c报错: ORA-28040: 没有匹配的验证协议 百度解决:修改 $ORACLE_HOME/network/ ...

  3. layUI弹出框提示

    简单介绍:项目使用layUI框架好久了,也没来的及写一篇关于layUI弹出层的随笔.现在补上.经常用到的,一般都是在ajax成功回调函数后边写. //js代码 s和fail 是ajax返回的数据lay ...

  4. memcpy一种实现方法

    #include<stdio.h> #include<stdlib.h> void* memncpy(void* dest, const void* src, int coun ...

  5. 单机MongoD搭建

    MongoD 安装 1 .下载地址: wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.6.8.tgz 2 .添加 ...

  6. [原创]Cadence Allegro16.6安装

    选择Cancel. lisence managner安装完成,然后安装Product installation Cadence OrCad Allegro SPB 16.6 完整版+和谐文件 链接:h ...

  7. swagger出现no response from server错误的解决办法

    解决办法:1.启用80端口2.如果不是使用的80端口,是用的nginx做了映射的其他端口的话可以用Springfox swagger-ui 覆盖默认request host,加上这个在spring的应 ...

  8. 路漫漫其修远兮,吾将上下而求索--2019OKR规划

    一.前言 加入博客园半年多,认识了很多优秀上进,乐于分享的人,我的男神:EdisonZhou,还有张队长,叶伟民,腾飞,梁桐铭 等等. 半年来写了26篇随笔,我的第一篇随笔 C# DynamicObj ...

  9. 【Vue】删除数组元素,导致剩余元素被重新渲染

    最近在项目中有使用Vue,然而在开发过程中发现,当我对数组中的元素进行删除时,会导致该元素后面的元素没有被重新渲染. html代码如下:有两个组件:一个是Main组件,用来包含所有的内容容器:一个是子 ...

  10. 短网址API

    http://tao.tf/open/ API简介 API允许第三方自由调用URL缩短,基于text/json/jsonp/js模式,支持post.get提交. 支持缩短网址: 淘宝网(*.taoba ...