星期五, 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. python socket.error: [Errno 24] Too many open files

    以openwrt AR9331开发板为例,socket连接到1019个就报错 “python socket.error: [Errno 24] Too many open files” 1.查看开发板 ...

  2. C++ 生成洛伦兹的蝴蝶

    这里使用 C++ 计算轨迹,生成 Python 文件,使用 matplotlib 绘图. // simulator.cpp : 此文件包含 "main" 函数.程序执行将在此处开始 ...

  3. Xpath Helper的使用

    xPath Helper插件 xPath helper是一款Chrome浏览器的开发者插件,安装了xPath helper后就能轻松获取HTML元素的xPath,程序员就再也不需要通过搜索html源代 ...

  4. AspNet Core下利用 app-metrics+Grafana + InfluxDB实现高大上的性能监控界面

    在日常系统工作中,我们为了洞察系统的问题和运作情况通常会记录日志的方式来进行分析,但是在很多情况下都是被动的在出问题后才会去查日志.在很多时候,我们可能更需要相对实时的了解整个系统或者某一时段的运行的 ...

  5. docker容器访问宿主机IP

    宿主机执行ifconfig 会看到docker0那个ip,可以使用来访问宿主机

  6. 高性能HTTP加速器Varnish-3.0.3搭建、配置及优化步骤

    经过一天的努力,终于将Varnish缓存服务器部署到线上服务器了.趁着热乎劲儿,赶紧给大家分享一下.Varnish是一个轻量级的Cache和反向代理软件.先进的设计理念和成熟的设计框架是Varnish ...

  7. python之socketserver实现并发

    python之socketserver实现并发 服务端 import socketserver #socketserver模块是用来实现并发 # 我们自己的类里一定要继承socketserver.Ba ...

  8. [Union]C++中Union学习笔记

    C++ union结构式一种特殊的类.它能够包含访问权限.成员变量.成员函数(可以包含构造函数和析构函数).它不能包含虚函数和静态数据变量.它也不能被用作其他类的基类,它本身也不能有从某个基类派生而来 ...

  9. pythonpipinstallpymongo报错

    1.安装pymongo模块,报错pip版本低,升级版本又报错找不到合适的版本,网友说网络问题,要使用国内的镜像源来加速:pip install pymongo -i http://pypi.douba ...

  10. mysql注释方法【自用】

    原文链接:https://www.jb51.net/article/125991.htm 一.MySQL支持三种注释方式: 1.从‘#'字符从行尾. 2.从‘-- '序列到行尾.请注意‘-- '(双破 ...