| |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| -> 嵌入式 -> CM4核的单片机在加了bootloader后跑app总是出现异常复位的现象分析 -> 正文阅读 |
|
|
[嵌入式]CM4核的单片机在加了bootloader后跑app总是出现异常复位的现象分析 |
?1 现象SAMG55(CM4)在加了bootloader后跑app总是出现异常复位的现象。当时是在如下情况下复现: 打开spi开始接收数据,一段时间后就直接进入HardFault_Handler异常中断。 2 调试过程
3 原因分析本着挖掘问题根源的想法在继续查询一些资料后受到一些启发,反汇编提示访问了非法内存,那还是得从栈这里分析,会不会是从boot跳转到applacation中实际的栈空间划分和map里面的栈空间不一样呢? 我们知道,中断向量表里面的第一个4字节单位存的就是栈顶指针,然后我将bootloader中的栈顶指针和app中的栈顶指针分别在他们刚开始运行的时候打印出来,果然发现了问题:
如上图所示,因为bootloader的ram占用比较少,因此在进入main函数的时候分配的栈顶指针在0x20000690处,main函数里面的所有东西将从这个地址开始分配栈空间,因为栈指针是自上而下生长的,那我们剩余的ram空间范围是0x20000000的0x20000690,共1k字节。 当跳转到app后,栈指针居然是从boot分配后的栈指针开始的,也就是说app的总共可用的ram空间从复位开始就只有1kb可用,然而map里面是正常的:
这也是一开始没找到问题的原因。 分析到这里就知道出现这个bug的具体原因了,因为没有在跳转到app前重新初始化栈顶指针… 4 解决方法分析出了具体原因解决方法就很简单,在boot程序中,要跳到app前重新初始化栈顶指针即可,其实这个操作在正常的MCU厂商提供的启动文件里的复位函数里面就做好了,然而microchip这个折磨人的烂库没有如此操作!只能自己添加。
加上这一句程序就正常了,测试如下:
由上图可以看出来,跳转到app后栈顶指针为0x200144b0,到0x20000000尚有83k的空间,说明app占用的ram为83k,至此再无复位现象。 5 总结之前用的很多库都比较成熟,很多东西帮我们做好了,导致一些东西、流程没有理解清楚,在用到比较烂的库的时候就一时半会找不到原因,所以以后还是不要太依赖已有的东西,自己理解清楚才比较好。 下次在遇到这种非法内存访问的时候,可以按以下流程走:
|
|
|
| 嵌入式 最新文章 |
| 基于高精度单片机开发红外测温仪方案 |
| 89C51单片机与DAC0832 |
| 基于51单片机宠物自动投料喂食器控制系统仿 |
| 《痞子衡嵌入式半月刊》 第 68 期 |
| 多思计组实验实验七 简单模型机实验 |
| CSC7720 |
| 启明智显分享| ESP32学习笔记参考--PWM(脉冲 |
| STM32初探 |
| STM32 总结 |
| 【STM32】CubeMX例程四---定时器中断(附工 |
|
|
| 上一篇文章 下一篇文章 查看所有文章 |
|
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
| 360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年10日历 | -2025/10/26 4:55:31- |
|
| 网站联系: qq:121756557 email:121756557@qq.com IT数码 |