对于zephyr这个实时嵌入式操作系统,可以先在x86架构上搭建运行环境,学习相关知识。之后,根据实际需求,再将操作系统移植到不同架构的MCU上。
一、环境搭建
准备工作:安装ubuntu操作系统
虚拟机软件版本:VMware Workstation 12
Ubuntu版本:ubuntu 16.04 LTS 桌面版 64位(ubuntu-16.04.6-desktop-amd64.iso)
zephyr版本:v1.14.0 |
如何在虚拟机软件中安装64位的ubuntu操作系统,这里不再做过多的介绍,请自行安装,其他文章中也有介绍,可供参考。
推荐两个学习Zephyr的连接:
中文资料地址链接(仅供参考): https://zephyr-doc.readthedocs.io/zh_CN/latest/
官方英文地址链接: |
具体环境搭建过程,官方英文文档都有详细说明。下面简单介绍如何根据官网说明,一步步地在Linux中搭建运行环境,主要是记录一些自己踩过的坑,供大家参考。
1. 对Linux系统的要求
官方文档中就有明确的说明,指定是64位的,如果在32位的操作系统中搭建运行环境,那么就会产生一系列的问题(库文件缺少、找不到依赖、编译不通过......)。
2. CMake版本
一般来说,ubuntu自带的CMake版本都太低,而Zephyr编译环境最低要求是版本3.13.1,官方文档给出了更新CMake的几种方式。如下图
如果选择第一种方式进行CMake版本的更新,直接输入命令即可,命令:pip install --user cmake,但是可能会由于网络问题而导致失败。推荐使用第二种方式,在windows下先下载(速度会快很多)文件cmake-3.14.7-Linux-x86_64.sh,再拷贝到ubuntu中,执行对应的命令。
文件cmake-3.14.7-Linux-x86_64.sh下载,百度网盘链接:
链接:https://pan.baidu.com/s/1jzlPLIFoZpy1Pg-MluaNxA |
3. 安装SDK
官方说明如下图
在ubuntu上使用wget命令去下载SDK安装包,下载速度可能会比较慢,可以在windows上下载成功之后,再拷贝到ubuntu中进行SDK的安装。
SDK安装包百度网盘下载链接:
链接:https://pan.baidu.com/s/1yaTP2XP5eyAxXGsQuej9hA
提取码:pj4c |
在根目录下新建目录zephyrsdk,把下载好的SDK安装文件放入该目录中。
更新CMake版本和下载SDK,都属于准备工作。接下来,就安装SDK。
(1) 执行安装命令
wgp@wgp:/zephyrsdk$ sudo sh zephyr-sdk-0.10.0-setup.run
|
注意:
A. 要使用sudo进行安装,否则提示“权限不够……”。
B. 安装时,使用默认的安装目录即可,默认安装在:/opt/zephyr-sdk/ 。安装结束,可以看到/opt/zephyr-sdk目录下生成了很多文件,说明SDK安装成功。
(2)设置系统环境变量,如下
export ZEPHYR_GCC_VARIANT= zephyr export ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk |
4. 跳到Getting Started Guide 文档
安装完SDK,接着跳转到Getting Started Guide 文档,如下图。
从这里开始继续阅读
按照官方文档的说明,接下来就需要安装west工具。
5. 安装west工具并克隆远程代码仓库
执行命令:pip install --user west
之后使用west下载Zephyr源码仓库,命令如下。
west init zephyrproject //先下载到源码 cd zephyrproject west update //然后更新源码 |
官方文档说明,如下图
需要注意的是要在用户目录下执行命令:west init zephyrproject。因为在安装west的时候,加了参数--user。下载到源码仓库。
源码仓库下载过程中的打印:
wgp@wgp:~$ west init zephyrproject
.................................................................................................................................................................................... |
成功下到源码仓库,如下图。
更新源码仓库,执行命令:west init
更新完整个源码仓库,可以发现,里面包含有截至目前官方更新的所有zephyr源码版本。可以使用git命令查看所有的本地代码版本库,命令:git branch -a
创建一个本地分支,假设拉取的是版本V1.14.0的,在源码目录下,执行命令:
// 取远程分支并创建一个本地分支 //命令格式:git checkout –b 本地分支名 origin/远程分支名 wgp@wgp:~/zephyrproject/zephyr$ git checkout -b v1.14.0 remotes/origin/v1.14-branch |
查看刚创建好的本地仓库,命令:git branch
这样就成功地取到了版本1.14.0的源代码。
6 . 安装python依赖包
Zephyr源码里面有个文件requirements.txt,目录:/zephyr/scripts/requirements.txt
官网描述如下
所以,在zephyr源码的跟目录下,执行命令即可安装依赖包:
wgp@wgp:~/zephyrproject$ pip3 install --user -r zephyr/scripts/requirements.txt |
如下图
7. 设置工具链
官方说明:
目前是在X86平台上搭建并运行程序,所以,ZEPHYR_TOOLCHAIN_VARIANT设置为:host
ZEPHYR_TOOLCHAIN_VARIANT=host |
后续如果要移植到微处理器上,就需要指定自己的工具链。第一部分,运行环境搭建结束,接下来简单介绍如何构建和运行自己的应用程序。
二、构建和运行自己的应用程序
以编译和运行hello_world这个demo为例。
1. 进入源码的根目录
2. 设置环境变量
export ZEPHYR_TOOLCHAIN_VARIANT=host export ZEPHYR_GCC_VARIANT=zephyr export ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk |
方式1: 设置系统环境变量仅生效于当前控制台
方式2:环境变量永久生效
避免每次打开终端都设置一遍环境变量,可以把这些环境变量的设置放入/ect/profile中。重启虚拟机,使环境变量永久生效,这样就不用每次打开终端都要执行 source /etc/profile。
重启ubuntu之后,可以再将这几个环境变量的值打印出来,进行核对。
如果要释放环境变量,则使用unset命令,可以在unset之后,再打印环境变量的值,什么都没有。
注意:设置环境变量的时候,等号右边不能有空格!否则,环境变量设置失效!这虽然是基础知识,但是难免也有大意的时候。
例子
A.在/ect/profile中设置 export ZEPHYR_GCC_VARIANT= zephyr
B.然后:source /etc/profile
C.最后在终端打印环境变量的值:echo $ ZEPHYR_GCC_VARIANT 打印出来的结果是空格!并不是正确的环境变量值zephyr |
3. 配置Zephyr构建环境
每次打开新的终端,编译新的应用程序的时候,都要source一下zephyr-env.sh
命令:source zephyr-env.sh
4. 在Demo里面新建一个build
hello_world这个Demo在源码根目录下的samples目录中,在Demo目录下新建一个build目录,并进入build目录,如下图。
5 . 执行命令
首先指定目标板型并编译,这里是运行在X86平台上,所以指定的板型为:qemu_x86
命令:
wgp@wgp:~/zephyrproject/zephyr/samples/hello_world/build$ cmake -GNinja -DBOARD=qemu_x86 .. |
然后再执行命令
wgp@wgp:~/zephyrproject/zephyr/samples/hello_world/build$ ninja |
最后运行目标程序
wgp@wgp:~/zephyrproject/zephyr/samples/hello_world/build$ ninja run |
过程记录,如下图:
运行结果如下图:
打印出了hello world! qemu_x86
三、源码目录结构简介
Arch目录:存放特定处理器架构的芯片平台源码。 Boards目录:存放与开发板相关的源代码和配置文件。 Doc目录:存放相关的文件和工具。 Driver目录:存放设备驱动源码。 Include目录:存放除了在lib文件夹定义的其他公共APIs包含的文件。 Kernel目录:存放zephyr微内核源码。 Lib目录:存放库源码,包括最小的C标准库。 Misc目录:存放各种源码文件 Net目录:存放网络通信源码,包括蓝牙协议栈和网络通信协议栈。 Samples目录:存放zephyr内核、蓝牙协议栈、网络通信协议栈示例应用程序。 Tests目录:存放内核功能的测试代码和参考基准。 Script目录:存放编译和测试应用程序的各种各种程序和其他文件。 Subsys目录:子系统目录。 |
四、应用程序开发
一个简单的App目录结构如下:
wgp@wgp:~/zephyrproject/zephyr/samples/hello_world$ tree . ├── CMakeLists.txt ├── prj.conf ├── README.rst ├── sample.yaml └── src └── main.c 1 directory, 5 files wgp@wgp:~/zephyrproject/zephyr/samples/hello_world$ |
说明:
- CMakeLists.txt:文件列表。该文件告诉zephyr系统,在哪里可以找到其他的支持和依赖文件,并将App目录和zephyr的CMake开发系统链接起来。
- prj.conf:内核配置文件。一个应用程序通常要提供一个配置文件(prj.conf),它为一个或者多个内核配置选项指定配置参数,这些应用程序设置和开发板的设置合并,产生内核配置文件。
- main.c:是应用程序的源代码文件。一个应用程序通常需要一个或者多个源文件,这些源文件通常位于子目录src中。