OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 27660|回复: 15

程序调试时遇到的问题

[复制链接]

29

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-7-25
在线时间
0 小时
发表于 2013-8-5 13:37:34 | 显示全部楼层 |阅读模式
HardFault_Handler\
                PROC
                EXPORT  HardFault_Handler          [WEAK]
                B       .
                ENDP
我的stm32板子,调试过程中突然不动了,停止运行后发现程序死在了startup_stm32f10x_hd.s文件的这段话中,这是什么原因呢?
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-7 21:14:02 | 显示全部楼层
硬件错误,估计八成是你内存访问出问题了.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-7-25
在线时间
0 小时
 楼主| 发表于 2013-8-7 23:10:08 | 显示全部楼层
回复【2楼】正点原子:
---------------------------------
我是把一组数据存到了flash里,首地址是0X08070000,应该是这里出现了问题?可是不应该呀,我用的是战舰的板子,数据大小是float adc_buf[200],不应该溢出呀。程序大小:Program Size: Code=36158 RO-data=3398 RW-data=392 ZI-data=5616。我把数据存到这个地址里面没有什么问题,但是一读出之后就会死在那个地方。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-7 23:49:54 | 显示全部楼层
回复【3楼】风:
---------------------------------
得看代码才知道了。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-7-25
在线时间
0 小时
 楼主| 发表于 2013-8-9 16:49:30 | 显示全部楼层
这里的 stop/run键, store键 , call_out键 是画在触摸屏上的按键



void Display_Wave(void)
{
int j;
float store_buf[200];
float voltage; //计算电压
float max=0,min=4096,vpp=0; //最大值
int a,b; //显示最大值和最小值的整数部分和小数部分
Display_Table();
if(flag)    //adc采满200个样本后就会置flag为1
{
while(!stop_run)
{
tp_dev.scan(0);
if((tp_dev.sta &0XC0) ==TP_CATH_PRES)
{  
tp_dev.sta &=~(1<<6); //清除标志
if(tp_dev.x>210 && tp_dev.x<280) //按下stop/run键
{
if(tp_dev.y>165 && tp_dev.y<195)
stop_run=!stop_run;
}
if(tp_dev.y>165&&tp_dev.y<195)
{
if(tp_dev.x>155&&tp_dev.x<195) //按下store键
STMFLASH_Write(FLASH_SAVE_ADDR,(u16*)adc_buf,sizeof(adc_buf));    //这里的adc_buf是ad采集回来的值,在外部文件中,数据类型是也是float型
}
if(tp_dev.x>210 && tp_dev.x<280)
{
if(tp_dev.y>205 && tp_dev.y<235) //按下call_out键
{
POINT_COLOR=WHITE;
for(j=0;j<199;j++) //清除原有波形
{
LCD_DrawLine(j,(int)(adc_buf[j]),j+1,(int)(adc_buf[j+1]));
}
Display_Table(); //画表格
STMFLASH_Read(FLASH_SAVE_ADDR,(u16*)store_buf,sizeof(store_buf));    //把波形的数据提取出来.就是执行这一步之后,退出这个while循环,程序执行这个函数执行完就会死在HardFault_Handler\中,FLASH_SAVE_ADDR的值为0X08070000。调试了好久,也不知道问题出在了哪里。但是如果只是按下store键,然后退出这循环,程序还是可以正常执行的。就是按下call_out键之后就出了那种问题
POINT_COLOR=RED;
for(j=0;j<199;j++)
{
LCD_DrawLine(j,(int)(store_buf[j]),j+1,(int)(store_buf[j+1]));
adc_buf[j]=store_buf[j];
}
adc_buf[199]=store_buf[199];
}
}
}
}

POINT_COLOR=WHITE;
for(j=0;j<199;j++)
{
LCD_DrawLine(j,(int)(adc_buf[j]),j+1,(int)(adc_buf[j+1]));
}

POINT_COLOR=RED;
for(j=0;j<199;j++)
{
 
adc_buf[j]=(80-(float)buf[j]*(3.3*DIV/4096));
if(adc_buf[j]<0) adc_buf[j]=0; //边界检测
if(adc_buf[j]>160) adc_buf[j]=160;

if(max<(80-adc_buf[j])/DIV) //比较最大值最小值
max=(80-adc_buf[j])/DIV;
if(min>(80-adc_buf[j])/DIV)
min=(80-adc_buf[j])/DIV;

adc_buf[j+1]=(80-(float)buf[j+1]*(3.3*DIV/4096));
if(adc_buf[j+1]<0) adc_buf[j+1]=0; //边界检测
if(adc_buf[j+1]>160) adc_buf[j+1]=160;
LCD_DrawLine(j,(int)(adc_buf[j]),j+1,(int)(adc_buf[j+1]));
}
a=(int)max; //显示最大值
LCD_ShowxNum(250,55,a,1,16,0);
b=(int)((max-a)*10);
LCD_ShowxNum(266,55,b,1,16,0);
b=(int)((max-a)*100);
b%=10;
LCD_ShowxNum(274,55,b,1,16,0);
b=(int)((max-a)*1000);
b%=10;
LCD_ShowxNum(282,55,b,1,16,0);
a=(int)min; //显示最小值
LCD_ShowxNum(250,95,a,1,16,0);
b=(int)((min-a)*10);
LCD_ShowxNum(266,95,b,1,16,0);
b=(int)((min-a)*100);
b%=10;
LCD_ShowxNum(274,95,b,1,16,0);
b=(int)((min-a)*1000);
b%=10;
LCD_ShowxNum(282,95,b,1,16,0);
vpp=max-min;
a=(int)vpp; //显示峰峰值
LCD_ShowxNum(242,135,a,1,16,0);
b=(int)((vpp-a)*10);
LCD_ShowxNum(258,135,b,1,16,0);
b=(int)((vpp-a)*100);
b%=10;
LCD_ShowxNum(266,135,b,1,16,0);
b=(int)((vpp-a)*1000);
b%=10;
LCD_ShowxNum(274,135,b,1,16,0);
  delay_ms(400);
TIM5->CR1|=0X01; //开启定时器5
TIM5->DIER|=1<<0; //允许更新中断
TIM5->DIER|=1<<1; //允许捕获中断
flag=0;
}
}
回复 支持 反对

使用道具 举报

29

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-7-25
在线时间
0 小时
 楼主| 发表于 2013-8-9 17:14:45 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
adc_buf存在flash里的值是可以完全正确地读到store_buf中的,但是读取完flash之后,一旦执行完剩下的void Display_Wave(void)的部分,程序就会死在那个地方。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-9 18:09:59 | 显示全部楼层
float store_buf[200];
这个buf,丢到外面去,做成全局变量.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-7-25
在线时间
0 小时
 楼主| 发表于 2013-8-9 20:09:38 | 显示全部楼层
回复【7楼】正点原子:
---------------------------------
太谢谢了,丢到外面去就可以了。但是这是为什么呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-9 21:22:19 | 显示全部楼层
堆栈溢出
不要在函数里面放这么大的数组.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

29

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-7-25
在线时间
0 小时
 楼主| 发表于 2013-8-9 22:00:27 | 显示全部楼层
回复【9楼】正点原子:
---------------------------------
可是为什么只会在读取flash里的数据时出现问题呢?如果是溢出的话,平时运行这个函数的时候就应该溢出啦呀
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2249
金钱
2249
注册时间
2010-12-16
在线时间
203 小时
发表于 2013-8-9 23:25:27 | 显示全部楼层
栈溢出.

栈是动态分配的,如果在使用的少的时候调用,可能没有溢出, 可能溢出了暂时没有发现.
用多了,再加最后一根稻草,可想而知.

提醒一下,Keil MDK没有栈检查功能,栈溢出到堆,甚至到变量区是不一定知道的.只有产生了后果,比如某些变量无故修改,取指错误之类,才会直接怀疑到栈头上.这是个隐患.

所以有1L的说法.

迟点放个栈检查的小代码吧.
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

34

主题

805

帖子

4

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1865
金钱
1865
注册时间
2011-3-29
在线时间
140 小时
发表于 2013-8-10 09:35:48 | 显示全部楼层
回复【10楼】风:
---------------------------------
虽然溢出,但只有实际读写溢出位置的时候,才会产生fault
业余程序玩家。
回复 支持 反对

使用道具 举报

29

主题

71

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
207
金钱
207
注册时间
2013-7-25
在线时间
0 小时
 楼主| 发表于 2013-8-10 12:36:57 | 显示全部楼层
回复【12楼】ofourme:
---------------------------------
哦哦,太谢谢了。
回复 支持 反对

使用道具 举报

2

主题

1446

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
2249
金钱
2249
注册时间
2010-12-16
在线时间
203 小时
发表于 2013-8-13 00:48:15 | 显示全部楼层
回复【12楼】ofourme:
---------------------------------
有意思的是,有时即使溢出了,也不一定hardfault.

来自10L的小代码
http://www.openedv.com/posts/list/19693.htm
技术讨论请发帖 , 需要我回复请点左下的 < 回复 > 让系统通知我 . 本人不通过其他方式返回任何参数.
回复 支持 反对

使用道具 举报

36

主题

1263

帖子

1

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1612
金钱
1612
注册时间
2012-6-15
在线时间
39 小时
发表于 2013-8-13 08:32:53 | 显示全部楼层
回复【10楼】风:
---------------------------------
在启动文件里面 设置下 栈 的大小 就可以了
回复 支持 反对

使用道具 举报

26

主题

202

帖子

3

精华

高级会员

Rank: 4

积分
810
金钱
810
注册时间
2014-3-4
在线时间
11 小时
发表于 2014-3-14 20:04:36 | 显示全部楼层
MARK
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-9 04:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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