找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 17370|回复: 0
打印 上一主题 下一主题
收起左侧

stm32程序下载成功但是不运行

[复制链接]
跳转到指定楼层
楼主
ID:104126 发表于 2016-1-23 00:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
调试stm32程序,发现如下问题:
      STM32编写程序,当程序中没有sd卡部分时,程序正常下载,正常运行。当程序中运行sd卡加文件系统时程序能正常下载但是不能正常的运行。发现问题就要解决问题呀,好了大家一起来和我解决问题吧!?
根据自己问题,上网查找解决办法,最终将问题锁定在堆栈设置问题上。(堆栈设置的空间不够大)
解决办法在?stm32的程序目录下查找STM32F10x.s(或者是startup_stm32f10x_hd,这取决于你是用的寄存器还是函数库)
在打开文件,在文件的开头很醒目的位置,发现了关于堆栈的设置。??


从中我们可以看出来对于栈(stack)的大小设置为0x200,堆(heap)的大小为0x0,当修改程序为栈(stack)的大小设置为0x800,堆(heap)的大小为0x400。再试一下,没错,程序可以正常的运行了!



     注意我曾尝试单纯的修改栈或者单纯的修改堆的大小但是程序还都是不运行。这似乎说明程序中即有栈溢出,也有堆不够的情况。
分析:原来的设置栈stack的数量是0x200即512个字节。在Fatfs操作过程中,他的每一个写操作的单位就是512字节,堆栈也是512字节,自然会溢出没得说,然后程序就会跳到硬件中断那里歇着去了。所以我们把他改成了2048个字节。(大点应该没有坏处吧。。)
      另外,??栈溢出不一定会死机,比如栈只生长到堆区,或者稍微进入变量区,而且溢出整个过程不对这些区域做写入操作,不对这些区域做取指操作,就可以完美避免hardfault,但溢出还是溢出了,数据还是被修改了.最"直接"的表现是函数调用后,还没看到执行用户代码就发现某些不相干的数据被修改,不过这也足够隐蔽了. 而且,hardfault也不一定是栈溢出的直接结果,只是入栈后数据被修改,出栈时跳转错误(最容易出现),导致指令访问错误,或者数据访问错误。
好这里就说到这里了,下一篇将是对stm32堆栈的引申学习:http://www.51hei.com/bbs/dpj-42731-1.html

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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