星期五, 14. 九月 2018 02:18上午 - BEAUTIFULZZZZhtml
0) 前言python
Zephyr™项目是一个采用Apache 2.0协议许可,Linux基金会托管的协做项目。为全部资源受限设备,构建了针对低功耗、小型内存微处理器设备而进行优化的物联网嵌入式小型、可扩展的实时操做系统(RTOS),支持多种硬件架构及多种开发板,能够在小至8 kB内存的系统上运行。linux
采用深刻的安全开发生命周期:安全验证,模糊和渗透测试,频繁的代码审查,静态代码分析,威胁建模和审查,以防止代码中的后门 。ios
支持Bluetooth, Bluetooth Low Energy, Wi-Fi, 802.15.4,6Lowpan, CoAP, IPv4, IPv6, 和 NFC 等标准,经过社区驱动的发展来改进和加强功能 。git
这里做为入门篇,将介绍在linux上安装Zephyr,并基于模拟器和实体开发板进行DEMO编译运行。github
1)下载、克隆到本地vim
将zephyr克隆到本地home目录下:安全
cd ~ git clone git@github.com:zephyrproject-rtos/zephyr.git
2) Zephyr Build系统简介架构
Zephyr工程使用CMake做为管理工程开发的工具。CMake可以生成不一样格式的build文件,当前Zephyr支持下面两种构建管理工具:app
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支持如下架构:
按照如下步骤在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:
6) 分析一个简单应用层代码,带你更深刻一步
和5同样的nRF51开发板,不只支持闪灯和按键工程,还支持不少骚操做。咱们就拿最简单的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