Zephyr微内核初探

Linux基金会宣布了微内核项目Zephyr,发布了1.0内核版本。Zephyr微内核将被用于开发针对物联网设备的实时操做系统(RTOS)。该项目获得了英特尔、 NXP半导体、Synopsys和UbiquiOS等公司的支持。linux

更多信息(https://www.zephyrproject.org/content/zephyr-kernel-v100-release-notes)。git


Linux主机开发环境创建

  • 这里使用Ubuntu 14.04 LTS 64 bit发行版,虚拟机软件使用VirtualBox,对于Linux的安装不是本文重点,可参照其它网上的文章。
  • 安装必要的工具包 web

    sudo apt-get install git make gcc gcc-multilib g++ libc6-dev-i386 g++-multilib

Zephyr SDK安装

  • 新建目录shell

    mkdir /home/panguolin/zephyr
  • 下载SDK0.7.2安装文件bash

    wget https://nexus.zephyrproject.org/content/repositories/releases/
    org/zephyrproject/zephyr-sdk/0.7.2-i686/zephyr-sdk-0.7.2-i686-setup.run
  • 安装SDK网络

    chmod +x zephyr-sdk-0.7.2-i686-setup.run
    sudo ./zephyr-sdk-0.7.2-i686-setup.run

    提示默认安装在目录/opt/zephyr-sdk/下架构

    Verifying archive integrity... All good.
    
    Uncompressing SDK for Zephyr  100%
    
    Enter target directory for SDK (default: /opt/zephyr-sdk/):

    若是打算安装到其它目录,看到上述提示输入完整路径回车便可。
    安装信息大体以下:app

    Installing SDK to /opt/zephyr-sdk/
    
    Creating directory /opt/zephyr-sdk/
    
    Success
    
    [*] Installing x86 tools...
    
    [*] Installing arm tools...
    
    [*] Installing arc tools...
    
    ...
    
    [*] Installing additional host tools...
    
    Success installing SDK. SDK is ready to be used.

    SDK安装成功。dom

  • SDK 0.7.2 组成svg

    • 支持的处理器架构
      • IA-32
      • ARM
      • ARC
    • 编译调试工具

      • GCC 5.2.0 cross-compiler for x86 + binutils + gdb, libgcc, newlib
      • GCC 5.2.0 cross-compiler for ARM + binutils + gdb, libgcc, newlib (multilib)
      • GCC 5.2.0 cross-compiler for MIPS + binutils + gdb, libgcc, newlib (multilib)
      • GCC 5.2.1 cross-compiler for IAMCU + binutils + gdb, libgcc, newlib
      • GCC 4.8.3 cross-compiler for ARC + binutils + gdb, libgcc, newlib (multilib)
    • 主机上一些工具

      • GCC 5.2.0 host compiler for i686, binutils, glibc 2.22
      • Python2.7
      • QEMU emulators version 2.1.3:
      • qemu-system-arm (zephyr specific patch)
      • qemu-system-mips
      • qemu-system-i386
      • make (GNU Make 4.1)
      • OpenOCD (Open On-Chip Debugger with additional Quark support)
  • 设置环境变量
    新建文件 ~/.zephyrrc 增长以下内容保存

    export ZEPHYR_GCC_VARIANT=zephyr
    export ZEPHYR_SDK_INSTALL_DIR=/opt/zephyr-sdk

    修改文件~/.bashrc ,在末尾添加一行source ~/.zephyrrc。这样在每次启动linux shell的时候可自动设置环境变量了。

Zephyr应用程序编译和运行

Zephyr已经能够在不少板子上运行了,支持的主板包括:

  • 基于x86 架构
    • MinnowBoard MAX
    • QEMU 2.1
    • Quark D2000 Boards
    • Quark SE Boards
    • Arduino 101 Board
    • Galileo and Galileo Gen 2
  • 基于ARM (v7-M and v7E-M)架构
    • QEMU 2.1 + patch
    • Arduino Due Board
    • NXP Freedom Development Platform

遗憾的是码农我目前没有一块真实的板卡,只能尝试使用QEMU虚拟环境仿真一下。尽管如此,对于Zephyr体验之旅已经足够了。

  • 下载Zephyr源码

    cd /home/panguolin/zephyr
    git clone https://gerrit.zephyrproject.org/r/zephyr zephyr-project
  • 源码目录

    tree -dL 1
    .
    ├── arch           架构相关代码
    ├── boards         板级代码
    ├── doc            一些文档
    ├── drivers        设备驱动
    ├── include        开放接口的头文件
    ├── kernel         Microkernel代码, 以及架构无关的nanokernel代码
    ├── lib            一些库,包括以精简的标准C库
    ├── misc           杂七杂八
    ├── net            网络相关。蓝牙栈和网络协议栈
    ├── samples        例子
    └── scripts        编译、测试有关脚本文件
  • 编译一个hello world应用
    我选择了一个ARM架构的qemu_cortex_m3板,看名称就知道是能够使用QEMU仿真运行的。

    • 进入源码目录

      cd /home/panguolin/zephyr/zephyr-project
    • 设置编译环境变量

      source zephyr-env.sh
    • 进入hello world例子编译目录,编译

      cd samples/microkernel/apps/hello_world
      make BOARD=qemu_cortex_m3 ARCH=arm
    • 编译过程打印大体以下

      Using /home/panguolin/zephyr/zephyr-project/boards/qemu_cortex_m3/qemu_cortex_m3_defconfig as base
      Merging /home/panguolin/zephyr/zephyr-project/kernel/configs/micro.config
      Merging prj.conf
      configuration written to .config
      ...省略一下打印...
      CC      samples/microkernel/apps/hello_world/src/main.o
      LD      samples/microkernel/apps/hello_world/src/built-in.o
      LINK    zephyr.lnk
      BIN     zephyr.bin
      make[2]: Leaving directory /home/panguolin/zephyr/zephyr-
      project/samples/microkernel/apps/hello_world/outdir
      make[1]: Leaving directory /home/panguolin/zephyr/zephyr-project
    • 运行hello world程序

      make qemu

      略去一些输出,最终运行效果

      To exit from QEMU enter: 'CTRL+a, x'
      [QEMU] CPU: cortex-m3
      Hello World!

    能够看到,打印出了Hello World!

    • hello world程序源码

      cat src/main.c

      部分代码以下

      ...
      void main(void)
      {
          PRINT("Hello World!\n");
      }

好了,zephyr之旅结束了。后续有时间更新一些关于zephyr源码分析的文章。

参考文献

https://www.zephyrproject.org