星期五, 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. starting Tomcat v8.5 at localhost has encountered a problem

    好像有很多初学者会遇到这个问题 我也遇到这个问题了, 我的问题在于:

  2. VUE项目快速构建

    IDE  :VScode 1.新建项目文件夹 ctrl+~   调出命令板,/IDE找到当前文件夹右键 点击‘在命令提示符中打开’ 安装 node:官网(https://nodejs.org/en/d ...

  3. MQTT控制---connect

    连接服务端 客户端到服务端的第一个报文必须是CONNECT,且只能发送一次,发送的第二个connect报文当作违规处理并断开连接. 有效载荷包含一个或者多个编码的字段.包括客户端的唯一标识符,Will ...

  4. PADS Layout VX.2.3 设置测量精度

    操作系统:Windows 10 x64 工具1:PADS Layout VX.2.3 Pin #7.#8的实际距离是0.65mm,但是测量的结果却是0.7mm.为什么呢?这是由于测量精度的设置不恰当造 ...

  5. 64位windows8.1下安装 ImageMagick 总结

    1.  安装 ImageMagick-6.7.7-Q16-x64 下载地址:http://ftp.sunet.se/pub/multimedia/graphics/ImageMagick/binari ...

  6. urlparse解析URL参数

    python2 #! /usr/bin/env python # -*- coding:utf8 -*- # Author:zhangning import urlparse def url2Dict ...

  7. thinkphp查询某个字段为空的数据

    $where['name'] = ['exp', 'is null']; //为空的 $where['name'] = ['exp', 'is not null']; //不为空的

  8. win10家庭版升级为专业版(win10专业版激活方法)

    替换专业版密钥 1.在win10家庭版桌面上鼠标右键点击[此电脑]-[属性],点击右下角的[更改产品密钥] 2.也可以点击开始-设置-更新和安全-激活-[更改产品密钥] 3.输入要升级的win10版本 ...

  9. C# Post方式下,取得其它端传过来的数据

    // Post方式下,取得java端传过来的数据 if ("post".Equals(context.Request.HttpMethod.ToLower())) { contex ...

  10. 搭建 eclipse,maven,tomcat 环境

    1,安装jdk 2,安装eclipse,可以写java程序 3,安装tomcat,可以写简单的web页面 4,安装maven,再eclipse中可以构建maven管理的java程序 5,将maven程 ...