硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1074|回复: 13
收起左侧

bootloader程序跳转APP异常

[复制链接]

4

主题

17

回帖

29

积分

新手上路

积分
29
发表于 2024-2-1 14:57:48 | 显示全部楼层 |阅读模式
硬件环境:STM32F429
软件环境:Keil环境 AC6
实现思路:学习一下BootLoader程序的实现过程(根据韦东山老师的视频例程,移植到F429上),BootLoader程序存放在Flash起始地址为0x08000000的地址空间上,APP程序存放在0x08040000(通过修改程序的散列文件.sct文件设定程序的链接地址为0x20008000),要求Bootloader程序上电后将0x0804000地址上的所有程序段复制到RAM上进而跳转。
遇到的问题:bootloader程序和APP程序外设均只有串口打印程序和LED引脚控制,当前发现boot程序能够正常调用app程序,但是串口打印数据不完全就卡死了,使用在硬汉哥论坛上面的方法和bibili上视频的方法,保证有一个干净的环境进行跳转(失能外设和中断),也没成功调用APP


以下均使用反汇编文件观察程序的链接地址
测试过程1.将APP程序不做任何搬运,直接烧录(设定存储地址和链接地址均在flash-0x08000000上,默认程序RAM和ROM布局映射)APP程序测试正常。


测试过程二:设定APP程序的链接地址为0x20008000(将APP的程序段分配到于BootLoader使用的全局变量之后的RAM空间0x20000000之后),使用BootLoader程序调用APP,并且使能Boot外设
2.1设定APP程序的链接地址0x20008000,使用mkimage工具拼接有用的头部bin信息到app_with_header.bin,通过stm32CubePro程序烧录app_with_header.bin程序到Flash地址0x08040000上




2.2 boot程序调用APP程序,调用一半卡死。
2.2.1 程序调用逻辑


2.2.2 boot前部分执行正常,程序搬运正常


2.2.3 进入APP,程序后使用快捷键在汇编窗口单步调试,在app的串口打印函数位置卡死






测试过程三: 将bootloader程序中外设调用部分代码关闭/关闭中断(Boot程序始终使用默认的RAM和ROM布局),卡死

回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2024-2-1 15:04:13 | 显示全部楼层
回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2024-2-1 15:04:55 | 显示全部楼层
https://www.yuque.com/stayhungry-x4wmv/bwzety/ghkbswcm0np4cpnw 好像照片上传有点问题 请移步这里
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106867
QQ
发表于 2024-2-2 01:16:48 | 显示全部楼层
boot里面什么都不做,main函数里面第1条语句直接跳转正常不。

ps:这个方案的跳转肯定是没问题的,你看看是跳转失败了还是APP运行异常了。

实战技能分享,一劳永逸的解决BOOT跳转APP失败问题,含MDK AC5,AC6和IAR,同时制作了一个视频操作说明
https://www.armbbs.cn/forum.php? ... 9595&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2024-2-2 12:29:35 | 显示全部楼层
eric2013 发表于 2024-2-2 01:16
boot里面什么都不做,main函数里面第1条语句直接跳转正常不。

ps:这个方案的跳转肯定是没问题的,你看 ...

谢谢您 经过调试后,初始化外设后直接复制跳转 还是卡在了串口打印函数位置
是否是APP的分散加载文件的格式书写的有问题,暂定读写数据段在程序段的后面
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106867
QQ
发表于 2024-2-3 08:21:30 | 显示全部楼层
风沙盗影 发表于 2024-2-2 12:29
谢谢您 经过调试后,初始化外设后直接复制跳转 还是卡在了串口打印函数位置
是否是APP的分散加载文件的 ...

测试阶段,boot里面外设初始化也不做,main里面直接跳转,这个时候正常不
回复

使用道具 举报

66

主题

100

回帖

298

积分

高级会员

积分
298
发表于 2024-2-5 09:02:49 | 显示全部楼层
后续呢
回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2024-2-17 18:19:02 | 显示全部楼层
eric2013 发表于 2024-2-3 08:21
测试阶段,boot里面外设初始化也不做,main里面直接跳转,这个时候正常不

bootloader程序跳转到app的程序 始终是正常的 但是app程序执行中串口打印执行一半卡死只能打印“step into”
在bootloader程序复制app程序从flash地址到RAM后,也对外设做了相关操作:外设失能和关闭中断
跳转到app程序后debug调试 卡死的的位置变为在其后面的一条语句Hal_delay(1000)
回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2024-2-17 19:25:27 | 显示全部楼层
eric2013 发表于 2024-2-3 08:21
测试阶段,boot里面外设初始化也不做,main里面直接跳转,这个时候正常不

还想问一下您 如何制作在RAM中的算法文件,想使用keil在RAM中调试,我直接修改这个工程结构体中相应的加载地址可以吗?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106867
QQ
发表于 2024-2-18 00:48:55 | 显示全部楼层
风沙盗影 发表于 2024-2-17 18:19
bootloader程序跳转到app的程序 始终是正常的 但是app程序执行中串口打印执行一半卡死只能打印“step int ...

最关键的一点,你的这个是boot里面什么都不做,直接跳转测试的嘛
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106867
QQ
发表于 2024-2-18 00:49:41 | 显示全部楼层
风沙盗影 发表于 2024-2-17 19:25
还想问一下您 如何制作在RAM中的算法文件,想使用keil在RAM中调试,我直接修改这个工程结构体中相应的加 ...


基于STM32H7的内部SRAM程序调试工程模板(512KB的AXI SRAM存程序,DTCM做主RAM)
https://www.armbbs.cn/forum.php? ... id=93112&fromuid=58
(出处: 硬汉嵌入式论坛)

制作了一个通过BOOT复制APP程序到AXI SRAM运行的案例,适合H750,H7B0玩
https://www.armbbs.cn/forum.php? ... 2748&fromuid=58
(出处: 硬汉嵌入式论坛)

回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2024-2-19 03:02:11 | 显示全部楼层
eric2013 发表于 2024-2-18 00:48
最关键的一点,你的这个是boot里面什么都不做,直接跳转测试的嘛

仔细看了一下,感觉可能app程序的分散加载文件有问题,我配置了一个最简单的LED翻转 k++延时的程序也卡死了,也卡死在app程序的__main函数__scatterload部分 5.png
这部分一直不会,发怵,明天多看看点资料,补充点理论知识。
分散加载文件,规定数据的存储格式/顺序/起始地址和大小,可能是使用了__main函数,修改了这个分散加载文件有问题导致的),




回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2024-2-20 13:32:59 | 显示全部楼层
谢谢硬汉哥 最终回复一下:最终使用了安富莱的例子和百问网的例子,成功将APP程序从flash上搬运到RAM上进行调用,关于之前的代码的问题还会进行测试,
1.修改App程序的分散加载文件,将所有段均放在SRAM中
1.png
2.通过定义宏,设定app的中断向量表为内存0x20000000+偏移0x00008000U,
2.png

3.通过CubePro烧录app.bin文件在0x08040000
4.bootLoader程序中实现将bin文件从0x08040000搬运到0x20008000部分的代码
3.png

回复

使用道具 举报

4

主题

17

回帖

29

积分

新手上路

积分
29
 楼主| 发表于 2024-2-21 18:34:37 | 显示全部楼层
本帖最后由 风沙盗影 于 2024-2-21 18:45 编辑

之前代码的问题也找到了,之前是仿照韦东山老师的例子 他的程序在bootloader代码中使用汇编重定向中断向量表(其app程序是自己写的 没有调用_main中的SystemInit函数重定位中断向量表,所以他的程序是能够正常运行的),我的APP代码是使用HAL库的初始化,由于没有定义宏VECT_TAB_SRAM(所以在Bootloader中的中断向量表初始化无效-进一步导致问题)

评分

参与人数 1金币 +2 收起 理由
啦啦啦啦 + 2 很给力!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-8 08:52 , Processed in 0.302029 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表