Skip to content

Mynewt
Apache 开源、适用于微型嵌入式设备的组件化实时操作系统

简介

Mynewt 是一款适用于微型嵌入式设备的组件化开源操作系统。Apache Mynewt 使用 Newt 构建和包管理系统,它允许开发者仅选择所需的组件来构建操作系统。其目标是使功耗和成本成为驱动因素的微控制器环境的应用开发变得容易。

Mynewt 提供开源蓝牙 5.0 协议栈和嵌入式中间件、闪存文件系统、网络堆栈、引导程序、FATFS、引导程序、统计和记录基础设施等的支持。

安装 Newt

为了是开发者能够更好地使用 Mynewt 提供的组件来开发应用,Mynewt 引入了一个名为 newt 的构建工具和包管理器。该工具支持跨平台,可以运行在 Windows,Linux 和 macOS 平台上。

下面将介绍在不同平台上如何安装 newt

Windows

在 Windows 平台,最简单的方式是安装一个 Unix 开发环境,例如 MSYS2。你可以按照以下步骤进行配置:

  1. 前往 MSYS2 官网下载软件并安装(64 位系统选择 "x86_64",32 位系统选择 "i686");

  2. 打开 MSYS2,更新系统软件包:

    $ pacman -Syu
    
  3. 如果需要的话,关闭 MSYS2,重新运行以完成更新:

    $ pacman -Su
    
  4. 安装 gittar 工具:

    $ pacman -S git tar
    
  5. 下载并解压 newt 源码:

    $ wget -P /tmp https://github.com/apache/mynewt-newt/archive/mynewt_1_3_0_tag.tar.gz
    $ tar -xzf /tmp/mynewt_1_3_0_tag.tar.gz
    
  6. 运行 build.sh 来编译 newt 工具:

    $ cd mynewt-newt-mynewt_1_3_0_tag   
    $ ./build.sh
    $ rm /tmp/mynewt_1_3_0_tag.tar.gz
    
  7. 编译成功后将生成 newt/newt.exe 可执行文件,将其移动到系统目录:

    $ mv newt/newt.exe /usr/bin
    

macOS

在 macOS 上可以直接使用 Homebrew 来安装 newt。如果是第一次安装,需要先运行以下命令:

$ brew tap runtimeco/homebrew-mynewt
$ brew update

然后安装最新版 newt 工具:

$ brew update
$ brew install mynewt-newt

Linux

在 Linux 系统(比如 Ubuntu),直接运行以下命令即可安装 newt:

$ sudo apt-get update
$ sudo apt-get install newt

Note

如果遇到错误 (比如丢失 sys/mman.h 文件), 需要先确认已经安装了 32位 glibc:

$ sudo apt-get install gcc-multilib

运行 Blinky 示例

安装好 newt 之后就可以尝试编译第一个示例了,我们提供了 blinky 示例,你可以按照以下步骤进行验证:

打开命令行终端并切换到 blinky 示例目录:

$ cd ./nrf52840-mdk/examples/mynewt/blinky

使用 newt install 命令安装示例依赖项:

blinky$ newt install
apache-mynewt-core successfully installed version 0.0.0-none
mynewt_nrf52840_mdk successfully installed version 0.0.0-none

该示例已经提供了几个可用的 target,其中 nrf52_blinky 为应用程序、nrf52_boot 为 Bootloader,可以使用 newt target show 命令查看:

blinky$ newt target show
targets/my_blinky_sim
    app=apps/blinky
    bsp=@apache-mynewt-core/hw/bsp/native
    build_profile=debug
targets/nrf52_blinky
    app=apps/blinky
    bsp=@mynewt_nrf52840_mdk/hw/bsp/nrf52840_mdk
    build_profile=debug
targets/nrf52_boot
    app=@apache-mynewt-core/apps/boot
    bsp=@mynewt_nrf52840_mdk/hw/bsp/nrf52840_mdk
    build_profile=optimized

运行 newt build nrf52_boot 命令编译 Bootloader:

blinky$ newt build nrf52_boot
Building target targets/nrf52_boot
Compiling repos/apache-mynewt-core/boot/bootutil/src/image_ec256.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/image_ec.c
Compiling repos/apache-mynewt-core/apps/boot/src/boot.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/bootutil_misc.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/image_rsa.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/image_validate.c
Compiling repos/apache-mynewt-core/boot/bootutil/src/loader.c
Compiling repos/apache-mynewt-core/crypto/mbedtls/src/aes.c
Compiling repos/apache-mynewt-core/crypto/mbedtls/src/aesni.c
Compiling repos/apache-mynewt-core/crypto/mbedtls/src/arc4.c
Compiling repos/apache-mynewt-core/crypto/mbedtls/src/asn1parse.c
Compiling repos/apache-mynewt-core/crypto/mbedtls/src/asn1write.c
Compiling repos/apache-mynewt-core/crypto/mbedtls/src/base64.c
...
Archiving nrf52_boot-sysinit-app.a
Archiving sys_flash_map.a
Archiving sys_mfg.a
Archiving sys_sysinit.a
Archiving util_mem.a
Linking /makerdiary/nrf52840-mdk/examples/mynewt/blinky/bin/targets/nrf52_boot/app/apps/boot/boot.elf
Target successfully built: targets/nrf52_boot

运行 newt build nrf52_blinky 命令编译 blinky 应用:

blinky$ newt build nrf52_blinky
Building target targets/nrf52_blinky
Assembling repos/mynewt_nrf52840_mdk/hw/bsp/nrf52840_mdk/src/arch/cortex_m4/gcc_startup_nrf52840.s
Compiling repos/mynewt_nrf52840_mdk/hw/bsp/nrf52840_mdk/src/sbrk.c
Compiling apps/blinky/src/main.c
Assembling repos/mynewt_nrf52840_mdk/hw/bsp/nrf52840_mdk/src/arch/cortex_m4/gcc_startup_nrf52_split.s
Compiling repos/mynewt_nrf52840_mdk/hw/bsp/nrf52840_mdk/src/hal_bsp.c
Compiling repos/apache-mynewt-core/hw/drivers/uart/src/uart.c
Compiling repos/apache-mynewt-core/hw/cmsis-core/src/cmsis_nvic.c
Compiling repos/apache-mynewt-core/hw/hal/src/hal_common.c
Compiling repos/apache-mynewt-core/hw/drivers/uart/uart_hal/src/uart_hal.c
Compiling repos/apache-mynewt-core/hw/hal/src/hal_flash.c
...
Archiving nrf52_blinky-sysinit-app.a
Archiving sys_flash_map.a
Archiving sys_mfg.a
Archiving sys_sysinit.a
Archiving util_mem.a
Linking /makerdiary/nrf52840-mdk/examples/mynewt/blinky/bin/targets/nrf52_blinky/app/apps/blinky/blinky.elf
Target successfully built: targets/nrf52_blinky

编译成功后,可以使用 newt create-image nrf52_blinky 1.0.0 命令创建镜像,你可以自己指定版本号,这里以 1.0.0 作为示例:

blinky$ newt create-image nrf52_blinky 1.0.0
App image succesfully generated: /makerdiary/nrf52840-mdk/examples/mynewt/blinky/bin/targets/nrf52_blinky/app/apps/blinky/blinky.img

一切进行正常,运行 newt load nrf52_boot 命令下载 Bootloader:

提示

nRF52840-MDK 硬件支持 OpenOCD 调试器,Mynewt 使用 OpenOCD 来下载固件和调试,可以按照以下链接指引完成安装:OpenOCD 安装指引

blinky$ newt load nrf52_boot
Loading bootloader

运行 newt load nrf52_blinky 命令下载 blinky 应用:

blinky$ newt load nrf52_blinky
Loading app image into slot 1

观察程序是否运行正常:

创建新工程

你也可以从头创建自己的新工程,按照以下步骤即可快速完成。

在你的工作目录(这里假设为 dev)运行 newt new myproj 创建名为 myproj 的新工程:

$cd ~/dev
$ newt new myproj
Downloading project skeleton from apache/mynewt-blinky...
Installing skeleton in myproj...
Project myproj successfully created.

完成后 newt 会自动创建一个基本项目模板,大致的目录结构如下:

.
├── LICENSE
├── NOTICE
├── README.md
├── apps
│   └── blinky
│       ├── pkg.yml
│       └── src
│           └── main.c
├── project.yml
└── targets
    ├── my_blinky_sim
    │   ├── pkg.yml
    │   └── target.yml
    └── unittest
        ├── pkg.yml
        └── target.yml

6 directories, 10 files

我们已经为 nRF52840-MDK 提供 Mynewt 板级支持包 mynewt_nrf52840_mdk,可以在 project.yml 项目配置文件中进行配置:

注意

你需要将 vers 变量设置为 0-dev 以便使用 master 分支的最新代码。

project.name: "myproj"

project.repositories:
    - apache-mynewt-core
    - mynewt_nrf52840_mdk

# Use github's distribution mechanism for core ASF libraries.
# This provides mirroring automatically for us.
#
repository.apache-mynewt-core:
    type: github
    vers: 0-dev
    user: apache
    repo: mynewt-core

# a special repo to hold hardware specific stuff for nRF52840-MDK
repository.mynewt_nrf52840_mdk:
    type: github
    vers: 0-dev
    user: makerdiary
    repo: mynewt_nrf52840_mdk

运行 newt install 安装所有依赖项:

myproj$ newt install
apache-mynewt-core successfully installed version 0.0.0-none
mynewt_nrf52840_mdk successfully installed version 0.0.0-none

接下来,你需要为项目创建两个 target,一个是 Bootloader,一个是应用程序:

myproj$ newt target create nrf52_boot
myproj$ newt target set nrf52_boot app=@apache-mynewt-core/apps/boot
myproj$ newt target set nrf52_boot bsp=@mynewt_nrf52840_mdk/hw/bsp/nrf52840_mdk
myproj$ newt target set nrf52_boot build_profile=optimized
myproj$ newt target create nrf52_blinky
myproj$ newt target set nrf52_blinky app=apps/blinky
myproj$ newt target set nrf52_blinky bsp=@mynewt_nrf52840_mdk/hw/bsp/nrf52840_mdk
myproj$ newt target set nrf52_blinky build_profile=debug

运行 newt target show 查看目标设置:

myproj$ newt target show
targets/my_blinky_sim
    app=apps/blinky
    bsp=@apache-mynewt-core/hw/bsp/native
    build_profile=debug
targets/nrf52_blinky
    app=apps/blinky
    bsp=@mynewt_nrf52840_mdk/hw/bsp/nrf52840_mdk
    build_profile=debug
targets/nrf52_boot
    app=@apache-mynewt-core/apps/boot
    bsp=@mynewt_nrf52840_mdk/hw/bsp/nrf52840_mdk
    build_profile=optimized

这时可以开始编译目标代码:

myproj$ newt build nrf52_boot
myproj$ newt build nrf52_blinky

编译完成后,创建镜像:

myproj$ newt create-image nrf52_blinky 1.0.0

最后,使用 newt load 加载固件:

myproj$ newt load nrf52_boot
Loading bootloader

myproj$ newt load nrf52_blinky
Loading app image into slot 1

整个过程就是这样,你已成功完成新工程创建。

更多示例

随着 Mynewt 功能不断丰富,我们会不断增加一些新的应用示例到 nrf52840-mdk 仓库,你可以在 nrf52840-mdk/examples/mynewt/ 目录找到这些示例代码。

参考资源

问题反馈

如果在开发过程遇到任何问题,可以通过 GitHub Issue 寻求解决。

Comments