定义数组后出现错误 HardFault_Handler

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:15   2739   0

最近学习stm32.

在原子的串口程序前加了几个数组定义,加了个对数组处理的函数,出现了HardFault_Handler的错误,不知道怎么解决!!!代码如下

void calDist(float dist[8][8],float real[8],float test[8])
{
    for(i=0; i<8;i++)
 {
  for(j=0; j<8;j++)
  {
    dist[i][j]=(test[i]-real[j])*(test[i]-real[j]);
    printf("dist[%d][%d]=%d",i,j,dist[i][j]);
  }
  printf("\r\n");
 }
}
 float calMinDis(float dist[8][8],float route[8][8]){  
  for(i=0; i<8;i++){for(j=0; j<8;j++){      
  if(i+j==0)    
  {       
  route[i][j]=dist[i][j];     
    continue;}if(i==0){  
   route[i][j]=dist[i][j]+route[i][j-1];
   continue;
}
if(j==0)
{    
 route[i][j]=dist[i][j]+route[i-1][j];  
 continue;}      
  route[i][j]=route[i-1][j-1];      
  if(route[i][j]>route[i][j-1])  route[i][j]=route[i][j-1];     
                 if(route[i][j]>route[i-1][j]) 
 route[i][j]=route[i-1][j];
 route[i][j]+=dist[i][j];}}   
 return route[8-1][8-1];}
 int main(void){  
float real[8]={1,2,3,4,5,6,7,8};float test[8]={11,12,13,14,15,16,17,18};
float dist[8][8];        
float minDis,route[8][8]; 
Stm32_Clock_Init(9); //系统时钟设置          !!!!!!错误产生的地方!!!!!!!!!!!  
delay_init(72);      //延时初始化 
uart_init(72,9600);  //串口初始化为9600
LED_Init();      //初始化与LED连接的硬件接口      
while(1){
printf("begin calDist   ");
calDist(dist,real,test);
printf("begin  minDisminDis");       
minDis=calMinDis(dist,route);          若是将这个函数注释,则可以解决上述问题!!!!!!!!!!!!! 
// printf("minDis=%d",minDis); }}


后来在原子论坛得到解决。


因为局部变量是存放在栈区的,而全局变量在全局区(静态区),如果栈区较小,会产生溢出。

在库文件里 Libraries\CMSIS\CM3\DeviceSupport\ST\STM32F10x\startup\arm中修改启动代码,

Stack_Size EQU 0x00000800

对 stack size 进行设定太小。

栈不能开的太大,除了变量需要,调用的函数参数也需要压栈。

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP