【ARM】Bootloader的调试

news2024/10/3 2:20:25

Bootloader

为啥要做一个bootloader,因为最近客户调试MCU中,中断向量表和代码不设置一个区域内,在0x0的地址放置中断向量表,并在0x18000000的地址放置代码,发现会有一点问题,想测试一下在0x18000000的地址是否有问题,所以做了个Bootloader

1.解释原理

Bootloader其实是一个程序引导的过程,将APP的程序从板子的某个固定存储器Flash中“搬运到”SRAM/RAM中,将MSP和PC指针指向我们的APP的程序,就可以跑起来了
在这里插入图片描述

2.Bootloader到APP的步骤

我是FPGA+MCU的开发板

1.ARM准备APP

1.我们首先准备一个APP的ARM工程,然后编译后的hex文件通过FPGA去烧录到Flash中,这里使用的时led亮灭的APP,对照自己的芯片修改工程

void delay(int n)
{
    int i, j;
    for (i = 0; i <= n; i++) {
        for (j = 0; j <= 1000; j++) {
            __NOP();
        }
    }
    return;
}

int main(void)
{
		HME_GPIO_InitTypeDef Init;

		HME_GPIO_DeInit(PORTA);

    Init.Mode = PIN_MODE_OUTPUT;
		Init.Pins = GPIO_PIN1;
    HME_GPIO_Init(PORTA, &Init);

    while (1) {
        HME_GPIO_Set(PORTA, GPIO_PIN1);
        delay(5000);
        HME_GPIO_Clear(PORTA, GPIO_PIN1);
        delay(5000);
    }
    return 0;
}

同时把APP的程序存储的起始地址为0x18000000

在这里插入图片描述

2.FPGA的工程配置一个led引脚

assign ledo=gpio_porta_dr[1]&gpio_porta_ddr[1];;

2.FPGA烧录hex文件

通过FPGA将APP的hex文件烧录到外置Flash的0x300000地址上

在这里插入图片描述

3.SPI读hex文件并写入SRAM

因为我们的MCU是有SRAM的,将Flash上地址为0x300000的代码写到指定位置0x18000000的SRAM上

一次页写是256Byte的数据,hex文件没有那么小,一次肯定不够,同时对地址赋值

for(k = 0 ; k < (APP_SIZE>>8) + 1 ; k++)
{
	spiFlashPageRead(inData,0x300000+256*k, DEMO_SPI_PAGE_SIZE);
	for(j = 0;j < DEMO_SPI_PAGE_SIZE;j++)
    {
		*(unsigned int *)(0x10000000+j+256*k) = inData[j];
	}
}

4.Bootloader跳转

f_jmp_app这个函数是汇编语言的,我其实也不太懂,就是给SP,PC两个指针跳转就完事了,具体情况看实现Cortex-M3内核芯片(如STM32,LPC1768)的boot升级跳转到APP操作

#define APP_SIZE 													0x3F0
#define APPADDRESS 												0x18000000

__asm void f_jmp_app(uint32_t address)
{
	LDR SP, [R0]
	LDR PC, [R0, #4]
}

	__disable_irq();
	
	//set intr vector
	SCB->VTOR = APPADDRESS;
		
	f_jmp_app(APPADDRESS);

5.Debug调试

首先是看看hex是否写入了SRAM的指定地址,将hex和memory对比是否一致,

memory窗口0x18000000地址的开始数据

在这里插入图片描述

memory窗口0x180003EC地址的最后数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZO5WLSQq-1668504280538)(Bootloader.assets/1668499638952.png)]

对应hex文件的数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4Oe8FmOz-1668504280539)(Bootloader.assets/1668499558806.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MXsPUyO8-1668504280539)(Bootloader.assets/1668499597134.png)]

发现是一致的,说明APP的代码是已经搬过来了

然后是看SP和PC指针的跳转

SP指针成功跳转到了0x18004600的地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kerpeKfZ-1668504280539)(Bootloader.assets/1668500169327.png)]

对照APP的map文件,SP栈顶指针指向的是0x18004600的地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WKLwOned-1668504280539)(Bootloader.assets/1668500446548.png)]

PC指针跳转到了0x180000B8的值

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Rq6lOgPU-1668504280540)(Bootloader.assets/1668502508243.png)]

对照APP的map文件,PC栈顶指针指向的是0x180000B9的地址

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cHZRteXI-1668504280540)(Bootloader.assets/1668502596255.png)]
因为ARM 内核有历史遗留问题,反正指针就是-1,是没有问题的

3.总结

做了本次调试,熟悉了Bootloader的整体流程和MCU的启动过程,其实就是把程序换了个地址开始启动,一般来说MCU的启动就是从0x0地址开始,SP和PC指针指向的就是默认的,现在多加了一个Bootloader的过程,再把程序放在了后面的地址了,SP和PC指针就得跳转到后面程序开始的地址了,简简单单的。但我还是在领导的帮助下,完成了调试。

我只是提供思路,说的不一定对。

4.参考资料

推荐看B站
从bootloader跳到APP需要几步?

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

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

相关文章

Linux C/C++异常处理方法

简介 C/C属于较为接近底层的语言&#xff0c;不像Java等“高级”语言&#xff0c;所有异常都能catch住&#xff08;例如常见的core dumped&#xff09;异常&#xff1a; int first_func() {int* error_integer nullptr;return *error_integer; } 对于异常&#xff0c;首要任…

传统 Web 框架部署与迁移

与其说 Serverless 架构是一个新的概念&#xff0c;不如说它是一种全新的思路&#xff0c;一种新的编程范式。 但是原生的 Serverless 开发框架却非常少。以 Web 框架为例&#xff0c;目前主流的 Web 框架“均不支持 Serverless 模式部署”&#xff0c;因此我们一方面要尝试接…

跳槽or裸辞?2022年真不建议···

2022年是个“难过”的一年。 疫情、经济寒冬、房价跳水、基金股票一片红。其实这些都是连锁反应。 企业不好过&#xff0c;也会引发一系列裁人潮&#xff0c;其实最近挺多小伙伴反映过&#xff0c;今年过的如牛马&#xff0c;一人干活量顶仨。想辞职躺平&#xff0c;又没有绝…

BurpSuit官方实验室之信息泄露

BurpSuit官方实验室之信息泄露 这是BurpSuit官方的实验室靶场&#xff0c;以下将记录个人信息泄露共5个Lab的通关过程 Web Security Academy: Free Online Training from PortSwigger lab1&#xff1a; Information disclosure in error messages 错误消息中的信息泄露 在…

从金鸡百花电影节,看“鼓浪屿元宇宙”的元力、魅力与想象力

文|智能相对论 作者|青月 元宇宙的走红&#xff0c;始于2021年3月10日Roblox在美上市&#xff0c;这个和现实世界相平行又相交叉的虚拟世界开始引起市场的注意&#xff0c;并迅速风靡全球。 虽然2022年&#xff0c;关于元宇宙的探索已经进入了一个相对务实的阶段&#xff0c…

【毕业设计】机器视觉停车位识别检测系统 - python 深度学习

文章目录1 简介2 检测效果3 实现方式3.1 整体思路3.2 检测空车位3.3 车辆识别4 最后1 简介 &#x1f525; Hi&#xff0c;大家好&#xff0c;这里是丹成学长的毕设系列文章&#xff01; &#x1f525; 对毕设有任何疑问都可以问学长哦! 这两年开始&#xff0c;各个学校对毕设…

【面试题】「2023」JavaScript 最新高频 前端面试题 指南 (必看)

前言 大家好&#xff0c;本次总结了关于JavaScript的上百道高频面试考点&#xff0c;感谢大家的留言点赞收藏 &#x1f497; 如果文中有不对、疑惑或者错字的地方&#xff0c;欢迎在评论区留言指正&#x1f33b; 更多题库 地址&#xff1a;前端面试题库 基础篇 1. 将数组的…

【微前端开发环境下,加载远程子应用的实战。】

一开始我们的本地开发运行的环境&#xff0c;如果没有启动子应用的话。对应的页面是白屏的。 问题&#xff1a; 当有关联资源需要跳转时无法跳转&#xff0c;需要额外打开一个浏览器tab页到环境上面执行操作。当bug类型为纯ui-server端的内容时&#xff0c;需要手动启动bug相关…

【数据库原理及应用】——事务并发控制和恢复技术(学习笔记)

&#x1f4d6; 前言&#xff1a;事务是数据库操作的基本逻辑单元&#xff0c;事务处理技术主要包括数据库并发控制技术和恢复技术。本章首先介绍了事务的基本概念和四个特性&#xff0c;然后讨论事务并发操作可能引起数据库的不一致性&#xff0c;继而引入数据库的并发控制技术…

Compare线刷包与卡刷包

Android系统分为卡刷包和线刷包 小米11线刷包 从该版本的boot.img中抽取出的内容如下图 小米11卡刷包 从该版本的boot.img中可以提取的内容是 也就是说&#xff0c;想要做配置文件抽取需要用线刷包。经过测试&#xff0c;目前高版本的卡刷包通过解压都无法获取到boot.img…

图像分割 - 阈值处理 - 固定阈值法

目录 1. 介绍 2. 固定阈值处理 1. 介绍 图像分割就是将图像分成不同的区域&#xff0c;每个区域满足相似的条件。通常&#xff0c;都是将图像分为两个区域&#xff1a;前景区域和背景区域。 前景就是人们感兴趣的位置&#xff0c;例如一副Lena图像&#xff0c;我们只对这副图…

Redis-Mysql八股总结

Redis 说一下 Redis以及Redis 使用场景 答&#xff1a;Redis 是一种基于内存的数据库&#xff0c;对数据的读写操作都是在内存中完成&#xff0c;因此读写速度非常快&#xff0c;常用于缓存&#xff0c;消息队列、分布式锁等场景。 Redis 设置过期时间的命令 # 设置 key 在…

上网行为监控都能审计到哪些内容?

现在很多企业都部署了上网行为监控系统&#xff0c;那么&#xff0c;它可以审计到哪些内容呢&#xff1f;目前市面上有不同种类的上网行为监控系统&#xff0c;其功能都是大同小异的&#xff0c;这里我们以墨门云为例&#xff0c;了解一下装了这个软件之后管理者可以审计到哪些…

WPF探究【一】

文章目录WPF的概述&#xff1a;控件分类XAML对象元素语法XAML根元素WPF和XAML命名空间声明控件Lablel示例继承关系TextBlockbuttonBorderWPF的概述&#xff1a; WindowsPresentationFoundation&#xff08;简称WPF&#xff09;WPF的核心是一个与分辩率无关且基于实量的呈现引擎…

【深入理解Kotlin协程】使用Job控制协程的生命周期

Job 是协程上下文CoroutineContext的实现之一&#xff0c;通过它我们可以对协程的生命周期进行一些控制操作。Job 是协程的句柄。使用 launch 或 async 创建的每个协程都会返回一个 Job 实例对象&#xff0c;该实例是相应协程的唯一标识并管理其生命周期。还可以将 Job 传递给 …

数据结构与算法(四) 广度优先搜索

本篇文章继续来学习广度优先搜索算法&#xff08;Broad-First-Search&#xff0c;BFS&#xff09; 1、本质 广度优先搜索本质上还是遍历整个搜索空间&#xff0c;找到给定问题的解 实际上也是一种暴力搜索算法&#xff0c;不过其中的实现细节和优化细节还是值得探讨的 与深度…

基于PHP+MySQL的大学生交友社交网站

近年来,大学生的数量在逐步的增加,为了能够让这些大学生有一个更好的交友环境,需要创建一个基于大学生的社交交友网站。这样可以拉近彼此大学生之间的感情,让他们可以更好的进行学习和交流。 PHP大学生交友社交网站通过PHP&#xff1a;MySQL进行开发,分为前台和后台两部分,通过…

线程的状态

Java中线程的状态是通过枚举类型Thread.State表示的 &#xff0c;通过打印这些枚举类型&#xff0c;就可以知道java中线程的状态有哪些 public class ThreadState {public static void main(String[] args) {for (Thread.State state : Thread.State.values()) {System.out.pr…

进销存管理系统是什么?有哪些功能?

对于2022年刚开始&#xff0c;但是可以的确的是禽流感在短时期内是不可能返回他们&#xff0c;作为虚拟店面批发商想勇往直前中&#xff0c;就必须要亲吻网络&#xff0c;把销售业务从实体店搬至线上去。 想突破现状&#xff0c;化解虚拟店面批发民营企业的存活问题&#xff0…

ES初使用记录——写入与查询数据

本周接到一个任务&#xff1a;定时统计订单表中的数据&#xff0c;将异常订单挑出来&#xff0c;放入ES中供统计页面从总数点击跳转过去进行列表展示。 一、配置ES 配置maven&#xff0c;注入template Resource private ElasticsearchTemplate elasticsearchTemplate; 二、…