【嵌入式】一种优雅的 bootloader 跳转APP 的方式

【嵌入式】一种优雅的 bootloader 跳转APP 的方式

  • 0. 个人简介 && 授权须知
  • 1. 前言
  • 2. 干净的跳转
  • 3.程序的 noinit 段
  • 4. 利用noinit段实现优雅的跳转
    • 4.1 检查栈顶地址是否合法
    • 4.2 栈顶地址 +4
    • 4.3 __set_MSP
  • 5.OTA 过后的运行逻辑

0. 个人简介 && 授权须知

image-20230911133730620

📋 个人简介

  • 💖 作者简介:大家好,我是喜欢记录零碎知识点的菜鸟打工人。😎
  • 📝 个人主页:欢迎访问我的博客主页🔥
  • 🎉 支持我:点赞👍+收藏⭐️+留言📝
  • 📣 系列专栏:嵌入式Linux开发 🍁 🍁
  • 💬格言:写文档啊不是写文章,重要的还是直白!🔥

转载文章,禁止声明原创;不允许直接二次转载,转载请根据原文链接联系作者

若无需改版,在文首清楚标注作者及来源/原文链接,并删除【原创声明】,即可直接转载。
但对于未注明转载来源/原文链接的文章,我将保留追述的权利。

作者:积跬步、至千里

image-20230911133724204

1. 前言

一些需要OTA 的设备大多都是讲程序设计为 bootloader 和 app区域,以便在升级时更加方便。

程序从BT跳转到app:

  • 小白:修改栈顶地址,直接 跳转到APP起始地址,在APP中在修改中断向量表
  • 中级:what the fxxk? 这么省事的吗?还需要做以下事情呢,包括但不限于:
    • 滴答定时器中断关掉、重置计数器
    • 关闭时钟
    • 关闭使能的外设,重新Deinit
    • 关闭看门狗
    • 设置栈顶地址
    • 设置跳转地址
    • 关闭全局中断

​ 归根到底,关中断、外设、去初始化这些操作的本质就是给APP运行提供一个干净的环境

2. 干净的跳转

干净的跳转指的是MCU内部的寄存器没被污染,也即是初始上电状态,咋实现呢?

  • 手动断电复位MCU??可以,但是不现实
  • 启动软件复位,但是软件复位后所有的寄存器都复位了,程序中定义的变量也重新加载了

有时候,见多识广真的会打开思路。

在一篇文章中,看到了如下思路,但是以下思路中的第一条怎么实现?复位后,在程序中定义的变量不会被初始化??

  • 定义一个标志,保证其不会被初始化
  • 每次复位后就立即检查这个标志,如果是跳转标志就跳转,否则就继续运行
  • 当升级完成后就更新跳转标志并软件复位

带着疑问,请看以下章节:

3.程序的 noinit 段

比如我在该段定义了一个变量A,程序在运行过程中A会累加,该段定义的变量可以实现

  • 当程序【软复位】时重启时,该段的变量【不会】被初始化
  • 只有当程序【掉电重启】时,该段的变量才【会】被初始化

在该段中定义的变量会被编译器分配到SRAM中,SRAM 的地址可以手动设置,该段常用来保存一些敏感信息。

比如我想实现以下场景:

要是想监控程序由于看门狗超时复位而造成重启的次数,在不知道 noinit 之前我想到的就是,利用串口打印保存1个小时的打印 log ,然后观察,硬着头皮数重启次数。

就可以通过以上 noinit 段实现

4. 利用noinit段实现优雅的跳转

首先贴出代码:

#define FLASH_APP_ADDR 0x08010000 //应用程序起始地址

/*在 noinit 段中定义一个标志位变量*/
__attribute__((section(".noinit"))) volatile uint32_t JumpFlag;

void SetJumpFlagAndReset(void){
    JumpFlag = 0xA5A5A5A5;/* Setting of signs */
    NVIC_SystemReset();/* Software reset */
}

void CheckJumpFlagAndJump(void){
    if(JumpFlag == 0xA5A5A5A5){
        JumpFlag = 0; /* Clear jump flag */
        iap_load_app(FLASH_APP1_ADDR);/* Loading the application */
    }
}


void iap_load_app(uint32_t app_addr)
{
  typedef void (*jump_app_ptr)(void);

  jump_app_ptr jump2app;

  /* Check the top-of-stack address for legality */
  if(((*(volatile uint32_t *)app_addr) & 0x2FF00000) == 0x20000000)
  {
    jump2app = (jump_app_ptr)(*(volatile uint32_t *)(app_addr + 4));

    __set_MSP(*(__IO uint32_t*)app_addr);

    /* Jump to APP program */
    jump2app();
  }
}

4.1 检查栈顶地址是否合法

if (((*(volatile u32*)app_addr) & 0x2FFE0000 ) == 0x20000000)分析

  • app_addrapp应用程序的flash首地址
  • (volatile u32*)app_addr 是将该地址转换为 u32 指针类型
  • (*(volatile u32*)app_addr 是取出该地址的内容,假设为 u32 类型的 变量 P
  • 变量P,是 app 程序的堆栈地址 ,该地址指向 RAMRAM 的起始地址为 0x2000_0000
  • p & 0x2FFE_0000 = 0X2000_0000,则 p的范围就是 0x20000000~0x2001ffff
  • 综上,if 语句就是为了判断 ram 是否在 0x20000000~0x2001ffff区间范围内,该区间大小为 128K,可以根据实际情况定义

4.2 栈顶地址 +4

栈顶地址 +4 存放的是 复位地址

4.3 __set_MSP

将用户定义的 flash 首地址存储的栈顶地址,通过 __set_MSP 语句告诉 ARM 内核,该地址就是APP程序区域的栈顶地址

5.OTA 过后的运行逻辑

  • OTA 的最后运行函数 SetJumpFlagAndReset(), 将noinit段的变量设置标志位并且软复位
  • main 函数的初始下运行函数
    • CheckJumpFlagAndJump()
      • 标志位为 0xa5a5_a5a5:表示是 OTA 之后的启动,运行跳转函数
      • 标志位为 0 ,表示是掉电启动的

参考:

IAR下使用noinit段

怎么在Bootloader跳转前给APP提供干净的运行环境

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MongoDB 多层级查询

多层级查询 注意&#xff1a;要注意代码顺序 查询层级数据代码放前面&#xff0c;查询条件放后面 if (StringUtils.isBlank(params.getDocType())) {params.setDocType(DOC_TDCTYPE);}String docName mapper.findByDocInfo(params.getDocType());List<ExpertApprovalOpin…

怎么把Rmvb改成mp4格式?把rmvb改成MP4格式的四种方法

怎么把Rmvb改成mp4格式&#xff1f;在当今的数字时代&#xff0c;视频文件格式的多样性给我们带来了巨大的便利&#xff0c;但也可能带来一些兼容性的问题。rmvb是一种曾经非常流行的视频文件格式&#xff0c;主要由于其较高的压缩效率和相对不错的画质。然而&#xff0c;随着技…

计算机组成原理学习 Part 1

计算机系统 组成 计算机系统 { 硬件 计算机的实体&#xff0c;如主机、外设等 软件 由具有各类特殊功能的信息&#xff08;程序&#xff09;组成 计算机系统 \begin{cases} 硬件 &\text 计算机的实体&#xff0c;如主机、外设等\\ 软件 &\text 由具有各类特殊功能的信…

把Vue项目从Window系统迁移到Mac系统的方案

不能启动vue ui 直接运行&#xff0c;会报错如下&#xff1a; failed to load config from /Users/xiaochen/IdeaProjects/ChatViewer-frontend/vite.config.tserror when starting dev server: Error: You installed esbuild for another platform than the one youre curre…

宝藏速成秘籍(6)归并排序法

一、前言 1.1、概念 归并排序&#xff08;Merge Sort&#xff09;是一种基于分治思想的排序算法。它将数组分成两个子数组&#xff0c;分别对这两个子数组进行排序&#xff0c;然后再将它们合并成一个有序的数组。归并排序是一种经典的分治算法&#xff0c;它的核心思想是将待…

探索交互设计:五大关键维度全面剖析

交互式设计是用户体验&#xff08;UX&#xff09;设计的重要组成部分。在本文中&#xff0c;我将向大家解释什么是交互设计并简要描述交互设计师通常每天都做什么。 一、什么是交互设计 交互式设计用简单的术语来理解就是用户和产品之间的交互。在大多数情况下&#xff0c;当…

详解MySQL中的PERCENT_RANK函数

目录 1. 引入1. 基本使用2&#xff1a;分组使用3&#xff1a;处理重复值4. 使用优势4.1 手动计算百分等级4.2 使用 PERCENT_RANK 的优势4.3 使用 PERCENT_RANK 5. 总结 在 MySQL 中&#xff0c;PERCENT_RANK 函数用于计算一个值在其分组中的百分等级。 它的返回值范围是从 0 …

【LLM】吴恩达『微调大模型』课程完全笔记

Finetuning Large Language Models 版权说明&#xff1a; 『Finetuning Large Language Models』是DeepLearning.AI出品的免费课程&#xff0c;版权属于DeepLearning.AI(https://www.deeplearning.ai/)。 本文是对该课程内容的翻译整理&#xff0c;只作为教育用途&#xff0c;不…

会声会影封面图怎么设置 会声会影渲染封面如何固定 会声会影视频剪辑软件制作教程

使用会声会影剪辑完成过后&#xff0c;通常我们需要给我们的视频设置封面&#xff0c;渲染封面又需要进行固定。本文将围绕会声会影封面图怎么设置和会声会影渲染封面如何固定来进行介绍。 一、会声会影封面图怎么设置 会声会影不能随意自定义设置封面&#xff0c;默认情况下…

中国姓名学十大权威专家颜廷利:全国排名第一的起名大师

颜廷利教授,是济南市历城区唐王镇的名人,位居2023年中国当代十大国学大师排行榜之首。全国排名第一的起名大师颜廷利教授以其深厚的学术造诣和卓越的贡献赢得了名誉和尊重,成为当代国学界的翘楚。他从事国学研究已有数十年,对经史子集的研究融会贯通,展现出了非凡的学术造诣。中…

Navicate操作某一张表后,卡主,无法加载,也无法编辑,更无法读取

说明 Navicate操作某一张表后&#xff0c;卡主&#xff0c;无法加载&#xff0c;也无法编辑&#xff0c;更无法读取&#xff0c;遇到这种情况&#xff0c;一般是因为表被锁住了 解决方案 右击数据库&#xff0c;打开命令号界面 查看进程列表 SHOW PROCESSLIST;mysql> …

FreeRTOS:4.内存管理

FreeRTOS内存管理 目录 FreeRTOS内存管理1. 为什么不直接使用C库函数的malloc和free函数2. FreeRTOS的五种内存管理方式3. heap4源码分析3.1 堆内存池3.2 内存块的链表数据结构3.3 堆的初始化3.4 堆的内存分配3.5 堆的内存释放 4. 总结 1. 为什么不直接使用C库函数的malloc和fr…

LIMS(实验室)信息管理系统源码、有哪些应用领域?采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码

LIMS&#xff08;实验室&#xff09;信息管理系统源码、有哪些应用领域&#xff1f;采用C# ASP.NET dotnet 3.5 开发的一套实验室信息系统源码 LIMS实验室信息管理系统&#xff0c;是一种基于计算机硬件和数据库技术&#xff0c;集多个功能模块为一体的信息管理系统。该系统主…

利用钉钉机器人和PHP开发一款免费的网站可用性检测工具,单节点版

前言 手里有几套系统正在运维&#xff0c;需要保障正常运行&#xff0c;所以可用性检测就必不可少啦&#xff0c; 以前本来是用的阿里官方的云监控&#xff0c;但现在价格感觉太贵了&#xff0c;不划算 那就自己手搓一个简易版的监控吧。 成品效果展示 代码展示 <?php …

2024年哪4种编程语言最值得学习?看JetBrains报告

六个月前,编程工具界的大牛JetBrains发布了他们的全球开发者年度报告。 小吾从这份报告中挑出了关于全球程序员过去一年使用编程语言的情况和未来的采纳趋势,总结出2024年最值得学习的四种编程语言。一起来看看吧。 JetBrains在2023年中开始,就向全球的编程达人们发出了问卷…

海豚调度异常处理: 使用 arthas 在内存中删除启动失败的工作流

&#x1f4a1; 本系列文章是 DolphinScheduler 由浅入深的教程&#xff0c;涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。祝开卷有益。大数据学习指南 大家好&#xff0c;我是小陶&#xff0c;DolphinSch…

笔记本硬盘对拷:升级硬盘的好方法!

如今电子产品更新换代的速度不断加快&#xff0c;笔记本电脑的配置也日新月异。几年前购买的笔记本硬盘容量350G曾经令你感到相当满意。但时至今日&#xff0c;这样的容量是否已经显得有些落后&#xff1f;如果你想要升级硬盘&#xff0c;笔记本硬盘对拷是一个很好的选择。 需要…

工业园区的弱电智能化总体建设规划

在当今迅速发展的工业环境中&#xff0c;一个高效、智能的工业园区是企业成功的重要基石。随着技术的进步&#xff0c;弱电系统的智能化已不仅仅是便利的象征&#xff0c;更是安全生产和效率提升的必要条件。今天&#xff0c;我们将探讨如何通过弱电智能化系统的总体建设规划来…

建筑八大员证报名一寸彩色照片要求及手机自拍方法解读

在建筑行业&#xff0c;八大员证的持有者是广受尊重的专业人士。然而&#xff0c;要成为一名合格的八大员&#xff0c;首先必须通过资格审核和报名流程。其中重要的一步就是提交一寸彩色照片&#xff0c;以确保个人信息准确无误。那么&#xff0c;你是否清楚报名时照片的要求以…

Stable Diffusion 【AI绘画提示词】摄影效果提示词,超美摄影效果摄影特效!让平凡的照片焕发出独特的魅力!

高端的摄影作品需要的专业设备价格昂贵&#xff0c;并不是一般人能够承受的起的&#xff0c;优质摄影作品对光线等一系列要求也非常的高&#xff0c;而AI摄影就完美的解决了这些问题&#xff0c;只需要配合适当的提示词&#xff0c;这些问题都可以迎刃而解。 AI绘画没灵感&…
最新文章