文档章节

STM32跳入HardFault Handler中断分析

兔之
 兔之
发布于 2014/04/22 16:18
字数 889
阅读 2356
收藏 2

ARM芯片STM32出现HardFault Handler硬件中断一般有两种情况:

  1. 访问越界导致的Acess Violation或者内存溢出
  2. 堆栈溢出

这次遇到的问题是栈空间不够。

##ARM程序的组成[1]## 在Keil4的Build Out窗口中有下列的调试信息: 在此输入图片描述

那么其中的Program Size: Code=12384 RO-data=420 RW-data=52 ZI-data=37044 分别代表什么意义呢?

此处所说的“ARM程序”是指在ARM系统中正在执行的程序(在RAM中的程序)。

一个ARM程序包含3部分:RO,RW和ZI。RO是程序中的指令和常量;RW是程序中的已初始化变量;ZI是程序中的未初始化的变量.由以上3点说明可以理解为:RO就是readonly,RW就是read/write,ZI就是zero。

##堆和栈的区别##

  • 栈区(stack):由编译器自动分配和释放,存放函数的参数值局部变量的值等,其操作方式类似 于数据结构中的栈。
  • 堆区(heap):一般由程序员分配和释放(malloc),若程序员不释放,程序结束时可能由操作系统回收。分配 方式类似于数据结构中的链表。
  • 全局区(静态区)(static):全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态 变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。程序结束后由系 统自动释放。
  • 文字常量区:常量字符串就是存放在这里的。
  • 程序代码区:存放函数体的二进制代码。

当我把几个全局的数组长度double BUFER[sample_num]都调到10000+时,Keil会出现报错。 在此输入图片描述

BSS指用来存放程序中未初始化的全局变量的一块内存区域,显然这个BUFFER数组存在全局区,而ROM内存不够导致出错。

举个“栗子”说明一下这几个区的不同:

<!-- lang: cpp -->
int aa=0;                             //全局(初始化)区
int bb;                               //全局(未初始化)区
void main()
{
  int b;                             //栈
  char s[]="abc";                    //栈
  char *p= "LZU";                   //在文字常量区
  static int c =0 ;                  //静态初始化区
  p1= (char *)malloc(10);            //堆区
  strcpy(p,"LZU");                  //"LZU"放在常量区
 }

##遇到问题## 在main中有这样几个函数:

<!-- lang: cpp -->
filter(ReceiveData,BUFER,sample_num);
butter_high(BUFER,HighOut,sample_num);
butter_low(HighOut,LowOut,sample_num);
DIFF(&LowOut[0],BUFER,sample_num);

用来滤波和差分,然而继续在后面加上一行cnt=find_max(BUFER,peak,sample_num)时会跳入到HardFault Handler中。跟踪发现,它影响整个程序的方式还特别奇怪,不加入它的时候ADC能采样sample_num个数据。加入它时,ADC在没采够sample_num个数据时就会跳入到HardFault Handler中。这样让我一直以为是ADC采样导致的硬件错误中断。

##解决问题## 仔细看一下cnt=find_max(BUFER,peak,sample_num)的代码

<!-- lang: cpp -->
int find_max(double* in,int* out,int length)
{ 
int i,j;
double Max,Min,Temp=0; 
int WaveStart[1000];
int MaxPoint[1000];
}

发现它定义了两个很大的局部变量数组,而局部变量是存在栈中的,1000+1000大于开始定义的1024个字节。所以出现了硬件中断错误。

因为在程序中没有动态分配内存,可以在startup文件中把Heap_size定义为0. 在此输入图片描述

##Keil输出的MAP文件##

__initial_sp 0x20016c68 Data 0 startup_stm32f2xx.o(STACK)

STACK 0x20014868 Section 9216 startup_stm32f2xx.o(STACK)

说明stack大小为0x2400

在此输入图片描述

##Reference##

[1].http://blog.csdn.net/jamestaosh/article/details/4348385

[2].http://www.mcuc.com.cn/thread-660-1-1.html

[3].http://www.openedv.com/posts/list/24152.htm

© 著作权归作者所有

兔之
粉丝 69
博文 250
码字总数 96477
作品 7
深圳
程序员
私信 提问
STM32开发 -- HardFault_Handler处理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29350001/article/details/87186130 一、造成原因 参看:C语言再学习 – 段错误(核心已转储) STM32出现硬...

聚优致成
02/13
0
0
使用安富莱harldfault调试方法总结

https://blog.csdn.net/zhzht19861011/article/details/8645661 在编写STM32程序代码时由于自己的粗心会发现有时候程序跑着跑着就进入了 HardFaultHandler中断,按照经验来说进入HardFaultHa...

青春无极限
07/04
24
0
破坏STM32中断机制引发的异常

破坏STM32中断机制引发的异常 现象描述 我将一个具有实时任务切换功能的小型嵌入式操作系统内核成功的从具有ARM7内核的ADUC7024芯片移植到了具有cortex内核的LM3S8962芯片,然而在移植到同样...

ifreecoding
2012/09/08
1K
0
stm32 启动文件.s源码 分析

; Amount of memory (in bytes) allocated for Stack ; Tailor this value to your application needs ; <h> Stack Configuration ; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h> S......

cicue
2014/03/19
265
0
GNU __attribute__

attribute可为函数,变量,类型设置属性 const ISRfunc isrvector[76] attribute ((section(.isr_vector))) 该变量放在.isr_vector的section内 static void sysreset(void) attribute_((nak......

lgl88911
2012/07/15
127
0

没有更多内容

加载失败,请刷新页面

加载更多

Nginx 快速安装详解

一、Nginx Nginx (engine x) 是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二的Rambler.ru站点(俄文:Рамбле...

网络小虾米
13分钟前
4
0
技术分享 | slave_relay_log_info 表认知的一些展开

作者:胡呈清 slave_relay_log_info 表是这样的: mysql> select * from mysql.slave_relay_log_info\G *************************** 1. row *************************** Number_of_lin......

爱可生
15分钟前
3
0
nginx配置http访问自动跳转到https

server {listen 80;server_name www.域名.com;rewrite ^(.*) https://$server_name$1 permanent;}server {listen 443;server_name www.域名.com;root /home/www;ssl on;......

很好亦平凡ms
15分钟前
2
0
SpreadJS:一款中国研发的类Excel开发工具,功能涵盖Excel的 95% 以上

Excel 作为一款深受用户喜爱的电子表格工具,借助其直观的界面、出色的计算性能、数据分析和图表,已经成为数据统计领域不可或缺的软件之一。 基于Excel对数据处理与分析的卓越表现,把Excel...

葡萄城技术团队
15分钟前
2
0
用javafx框架tornadofx做了个天气预报的程序

class WeatherApp : App(WeatherView::class)class WeatherView : View("十五天天气预报") { val weatherVM: WeatherViewModel by inject() val controller: WeatherController by......

oschina4cyy
19分钟前
3
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部