zephyr OS架构下构建Nordic MCU boot

目录

概述

1.  软硬件环境

1.1 软件开发环境

1.2 硬件环境 

2 MCU boot

2.1 核心功能

2.2   关键术语

 2.3 重要字段介绍

3 VS-Code下创建MCU-BOOT项目

3.1 软件框架结构

 3.2 创建测试项目

3.3 编译项目

3.3 固件在Flash中的分布

4 验证 

4.1 烧写固件

​ 4.2 代码实现原理

4.3 验证固件升级功能


概述

本文主要介绍在 Zephyr RTOS 架构下为 Nordic MCU (如 nRF52/nRF53 系列) 构建 MCUboot 引导加载程序,需要遵循的主要步骤。包括MCU boot介绍,VS-Code下创建MCU-BOOT项目的方法,以及在nRF52840开发板上验证该程序。

1.  软硬件环境

1.1 软件开发环境

nordic提供了基于zephyr平台sdk, 其提供了大量的demo可供开发者参考和使用,同时nordi还提供一个集成的软件库工具,方便开发者安装相应的SDK和编译工具链。集成环境同时包含了其他的一些软件,非常便于进行项目开发。

软件工具功能版本信息
nRF Connect SDK nordic提供基于zephyr的代码库v2.9.0 
nRF Connect SDK Toolchain代码编译工具v2.9.1
VS-CODE集成开发环境v1.99.3 
nRF Connect for Desktopnordic集成工具链v5.1.0
nRF Connect手机App

手机App下载地址:

https://nav.nordicsemi.com/search?query=nRF%20Connect

搭建编译环境的注意点

安装工具时,在D:\ncs\v2.9.0目录下执行如下语句,安装与编译器相关的工具链

pip3 install --user -r scripts/requirements.txt

运行该语句后,安装信息如下:

1.2 硬件环境 

本案例是在nRF52840开发板(nRF52-DK)上实现的,该开发板nRF52840的主要特点如下:

1)板载j-link调试接口

2)引出所有 IO接口,用户可根据实际应用,外载其他设备

3)支持4个LED

4)支持4路Key接口

5)板载UART调试接口,方便打印调试信息

2 MCU boot

MCUboot 是一个开源的安全引导加载程序(Secure Bootloader),专为微控制器(MCU)设计,支持固件验证、安全更新和回滚保护等功能。以下是 MCUboot 的详细使用方法。

2.1 核心功能

  • 安全启动:验证固件签名后再执行

  • 固件更新:支持多种更新机制

  • 回滚保护:防止降级到不安全版本

  • 多镜像支持:A/B分区、升级/回滚机制

2.2   关键术语

  • Primary slot:主运行分区

  • Secondary slot:备用/升级分区

  • Image trailer:镜像尾部的元数据区

  • Swap type:交换类型(测试/永久)

 2.3 重要字段介绍

以如下字段为例介绍,mcu boot 提供信息的字段解释:

Primary image: magic=good, swap_type=0x3, copy_done=0x1, image_ok=0x1 

字段解析:


magic=good

magic:  是一个固定值(例如 0x77d4b535),用于验证镜像头的有效性。

good:   表示该值匹配预期,说明镜像头部是合法的,可以被引导加载程序识别。


swap_type=0x3

表示镜像交换(swap)的类型,常见于支持固件双分区(A/B分区)的系统中。

0x3 可能对应某种特定的交换模式,例如:

0x1:测试镜像(测试后回滚或确认)。

0x2:永久性交换(确认更新)。

0x3:可能是“恢复模式”或“回滚操作”

(注:具体含义需结合具体引导加载程序的实现,例如 MCUboot 的 swap_type 定义。)


copy_done=0x1

标志位,通常表示“镜像已成功复制到目标分区”。

0x1: 表示完成,

0x0 :表示未完成。


image_ok=0x1

标志位,表示“当前镜像已验证且可启动”。

0x1 :表示镜像有效,系统可以安全启动;

0x0 :可能表示镜像损坏或需要回滚。

3 VS-Code下创建MCU-BOOT项目

3.1 软件框架结构

1) sysbuild.conf

使能和boot相关的配置信息,SB_CONFIG_BOOTLOADER_MCUBOOT=y用于使能mcuboot

SB_CONFIG_BOOTLOADER_MCUBOOT=y
SB_CONFIG_PARTITION_MANAGER=n

2) \sysbuild\mcuboot.conf

设置boot编译选项

文件的内容如下:

CONFIG_MCUBOOT_LOG_LEVEL_INF=y

 3.2 创建测试项目

分别创建两个测试项目,用于验证Boot之间的跳转

3.3 编译项目

 完成以上配置后,就可以编译项目,具体编译结果如下:

上图有3个编译结果,其中mcuboot为bootloader的生成目录 

3.3 固件在Flash中的分布

在nRF52840的设备树中已经分配了固件Image的空间,其具体内容如下:

boot_partition:  mcu boot存储的位置

slot0_partition:  image-0的地址

slot1_partition:  image-1的地址

 设备树已经计算出了所占Flash的空间大小:

4 验证 

4.1 烧写固件

完成编译后,会在Build目录下分别生成3个编译项目,其对应3块固件

下面分别烧录3块固件,观察MCU的运行情况

1) 擦除整块Flash

2) 烧写MCU boot 

 烧写完成后,MCU会复位,串口打印如下log:

查看Flash中的数据, MCU boot已经烧写到Flash中

3) 烧写Image-0

串上已经输出Image-0的log:

 查看Flash中的数据信息:

 4)烧写Image-1

 串口终端上并没有打印Image-1运行的log:

查看Flash中的内容:

 4.2 代码实现原理

1)固件升级实现代码

代码101行: 实现固件升级功能

代码106行: MCU复位

2)测试函数代码

代码第81行: 调用固件升级功能

代码第88行: 删除Image-1

 固件升级后,可以通过该语句删除Image-0

4.3 验证固件升级功能

在通过使用DK-52840上的两个按键,选择是否升级或者删除Image-1

1) 按下button-0:

 log信息

*** Booting MCUboot v2.1.0-dev-12e5ee106034 ***
*** Using nRF Connect SDK v2.9.0-7787b2649840 ***
*** Using Zephyr OS v3.7.99-1f8f3dc29142 ***
I: Starting bootloader
I: Primary image: magic=unset, swap_type=0x1, copy_done=0x3, image_ok=0x3
I: Secondary image: magic=good, swap_type=0x3, copy_done=0x3, image_ok=0x1
I: Boot source: none
I: Image index: 0, Swap type: perm
I: Starting swap using move algorithm.
I: Bootloader chainload address offset: 0xc000


*** Booting nRF Connect SDK v2.9.0-7787b2649840 ***
*** Using Zephyr OS v3.7.99-1f8f3dc29142 ***
Swapped application booted on nrf52840dk

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/79573.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Mytais系列】介绍、核心概念

MyBatis 是一款优秀的 持久层框架,它通过简化 JDBC 操作、提供灵活的 SQL 映射能力,成为 Java 开发中处理数据库交互的核心工具之一。以下是 MyBatis 的核心框架和概念解析: 一、MyBatis 框架概述 1. 核心定位 作用:将 Java 对象…

IO模型和多路复用

一、IO模型的基础理解 什么是IO? IO全称是 Input/Output(输入/输出),在计算机科学里主要指程序与外部设备(硬盘、网络、用户终端等)进行数据交换的操作。首要特点是: IO通常很慢(从CPU和内存的视角看)经常需要等待外部设备响应1. 为什么要谈IO模型? 当一个程序需要…

深入理解 Bash 中的 $‘...‘ 字符串语法糖

在 Bash 脚本编程中,字符串处理是不可或缺的一部分。为了让开发者更高效地处理特殊字符和控制字符,Bash 引入了一种独特的字符串语法糖:$(带单引号的 ANSI-C 风格字符串)。这种语法来源于 C 语言的 ANSI-C 标准&#x…

用Python打造自己的专属命令行工具

在日常的开发和使用过程中,我们常常会编写一些实用的Python脚本,比如用来批量处理文件、获取系统信息等。然而,每次都要输入python script_name.py来运行脚本,时间一长难免觉得繁琐。要是能像使用系统自带的命令(如ls、…

【KWDB 创作者计划】KWDB 2.2.0多模融合架构与分布式时序引擎

KWDB介绍 KWDB数据库是由开放原子开源基金会孵化的分布式多模数据库,专为AIoT场景设计,支持时序数据、关系数据和非结构化数据的统一管理。其核心架构采用多模融合引擎,集成列式时序存储、行式关系存储及自适应查询优化器,实现跨模…

学习Linux的第二天

如何在Linux环境下做开发 Linux的一些基操 Tips:平常最表层的是命令行模式,最多见这个默认叫做命令行模式 Vi操作是什么意思呢 就是在提示符输入vi a.c 是可以创建一个a.c这个文件并进入这个输入模式 按i可以输入代码 要退出的时候按esc 再按:(冒号…

链表操作练习

要求 现在有一个双向链表&#xff0c;里面要保存歌曲的名字&#xff1b;例如 蔡琴/渡口.mp3 我们把它定义在一个link.h文件中。 #ifndef LINK_H #define LINK_H #include <stdlib.h> #include <stdio.h> #include <string.h>typedef struct Node {//保存歌…

MATLAB制作散点图:从基础到进阶的三种类型讲解

一、什么是散点图 散点图是一种用来展示两个或多个变量之间关系的图表形式。它可以帮助我们直观地观察变量之间是否存在相关性、趋势或异常值&#xff0c;常用于数据分析的初步探索阶段。 二、三种类型散点图 1. 基本二维散点图&#xff1a;最简单、最常用 基本二维散点图的…

模块方法模式(Module Method Pattern)

&#x1f9e0; 模块方法模式&#xff08;Module Method Pattern&#xff09; 模块方法模式是一种结构型设计模式&#xff0c;它将复杂的操作分解成一系列相对简单、独立且单一职责的模块。每个模块负责完成一种具体的操作&#xff0c;其他模块或系统可以通过调用这些模块的公开…

Python中的JSON库,详细介绍与代码示例

目录 1. 前言 2. json 库基本概念 3. json 的适应场景 4. json 库的基本用法 4.1 导 json入 模块 4.2 将 Python 对象转换为 JSON 字符串 4.3 将 JSON 字符串转换为 Python 对象 4.4 将 Python 对象写入 JSON 文件 4.5 从 JSON 文件读取数据 4.6 json 的其他方法 5.…

网狐旗舰大联盟组件源码私测笔记:结构分层、UI重构与本地实操全流程

作为一套衍生于传统网狐架构的源码版本&#xff0c;大联盟这套源码组件可谓是在经典基础上进行了深度重塑。与老版死板的框架风格不同&#xff0c;它不仅对界面做了大刀阔斧的重构&#xff0c;还在组件层级的组织上做了优化。本文将基于一整套源码进行深度解析&#xff0c;强调…

STM32 PulseSensor心跳传感器驱动代码

STM32CubeMX中准备工作&#xff1a; 1、设置AD 通道 2、设置一个定时器中断&#xff0c;间隔时间2ms&#xff0c;我这里采用的是定时器7 3、代码优化01 PulseSensor.c文件 #include "main.h" #include "PulseSensor/PulseSensor.h"/******************…

C++项目容易犯错的点

1. 矩阵q要先定义大小&#xff0c;再赋值。不可以直接赋值。下面这种方式是错误的Eigen::MatrixXd q&#xff1b;q<<1,2&#xff1b;正确的这样的&#xff1a; Eigen::MatrixXd q(2,1); q<<1.4, 1.5; 2. 不要重复加载variables.h头文件&#xff0c;这样变量会被…

在阿里云 Ubuntu 24.04 上部署 RabbitMQ:一篇实战指南

前言 RabbitMQ 是业界常用的开源消息中间件,支持 AMQP 协议,易于部署、高可用、插件丰富。本文以阿里云 ECS 上运行的 Ubuntu 24.04 LTS 为例,手把手带你完成 RabbitMQ 从仓库配置到运行的全流程,并分享在国内环境下常见的坑与对应解决方案。 环境概况 操作系统:Ubuntu …

【论文笔记】SOTR: Segmenting Objects with Transformers

【题目】&#xff1a;SOTR: Segmenting Objects with Transformers 【引用格式】&#xff1a;Guo R, Niu D, Qu L, et al. Sotr: Segmenting objects with transformers[C]//Proceedings of the IEEE/CVF international conference on computer vision. 2021: 7157-7166. 【网…

MinIO实现https访问

Windows下实现MinIO的https访问. 首先需要自己解决证书问题, 这里可以是个人证书 也可以是花钱买的证书. 现在使用个人开发者证书举例子。 将证书数据解压到你知道的目录之下 然后直接使用命令启动MinIO start minio.exe server --certs-dir D:\xxxxx\tools\certs …

基于 jQuery 实现灵活可配置的输入框验证功能

在 Web 表单开发中&#xff0c;输入框验证是保障数据准确性和安全性的关键环节。无论是用户注册、信息提交还是数据录入场景&#xff0c;都需要对用户输入内容进行合法性检查。本文将介绍如何使用 HTML、CSS 和 jQuery 构建一个可灵活配置的输入框验证系统&#xff0c;轻松应对…

Kotlin 04Flow stateIn 和 shareIn的区别

一 Kotlin Flow 中的 stateIn 和 shareIn 一、简单比喻理解 想象一个水龙头&#xff08;数据源&#xff09;和几个水杯&#xff08;数据接收者&#xff09;&#xff1a; 普通 Flow&#xff08;冷流&#xff09;&#xff1a;每个水杯来接水时&#xff0c;都要重新打开水龙头从…

WebRTC 服务器之SRS服务器概述和环境搭建

1.概述 SRS&#xff08;Simple Realtime Server&#xff09;是一款高性能、跨平台的流媒体服务器&#xff0c;支持多种协议&#xff0c;包括 RTMP、WebRTC、HLS、HTTP-FLV、SRT、MPEG-DASH 和 GB28181。本文介绍了 SRS&#xff0c;包括其用途、关键功能、架构和支持协议。SRS 旨…

Dify - Embedding Rerank

注意&#xff1a;v100显卡会出现不适配&#xff0c;不推荐使用 1. 安装 Docker ubuntu 22.04 docker 安装&使用_ubuntu22.04 安装docker-CSDN博客 2. 安装vllm pip install -U xformers torch torchvision torchaudio triton --index-url https://download.pytorch.org/w…