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.pswp.cn/pingmian/79573.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/79573.shtml
英文地址,請注明出處:http://en.pswp.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…