智能车制作

标题: 解决default isr问题 [打印本页]

作者: Originition    时间: 2013-3-12 23:16
标题: 解决default isr问题
今天遇到一个纠结的问题,程序进入到黑线提取程序时还是可以的,但是当图像发生大的变化时,程序就卡在了某一个地方通过在线调试,它卡在default isr:0X4acc的位置,一是很郁闷,但是没有卡在那一句程序上,所以单步调试找不住原因,希望哪位同仁能帮到忙。
黑线提取程序:
void Black_select()
{
  s8   pre_left_point  ;
  s8   Left_point;
  s8   pre_right_point ;
  s8   Right_point;
  u8   i;
  u8   j;
  u8   k = 0;
  u8   l = 0;
  u8   Flag_solve = 0;
  //u8   first_left[start_check_lie-end_check_lie]  ;
  //u8   first_right[start_check_lie-end_check_lie] ;
  u8   left_find[80]   ;
  u8   right_find[80]  ;
  u8   max           ;
// u8   left_mis   = 0;  
// u8   right_mis  = 0;

/*****************************************************************寻找引导线的起点*****************************************************************************/
  for(i=start_check_lie;i>end_check_lie;i--)
  {
   for(j=0;j<=79;j++)
                {      
                        if((road_img1[i][j]||road_img1[i][j+1]||road_img1[i][j+2]||road_img1[i][j+3]==1)&&(road_img1[i][j-1]&&road_img1[i][j-2]&&road_img1[i][j-3]&&road_img1[i][j-4]==0))
                        {      
                                Left_point=j;                               
                               
                                Flag_solve++;
                        }
                }
                 if(Flag_solve==0)
                {  
                   Left_point = pre_left_point;
                   pre_left_point = pre_left_point;
                   border_line[i][left_border] = 0;
                   ///left_mis = 1;               
                }
                if(Flag_solve>0)
                {
                Flag_solve = 0;
                left_find[k++]=Left_point;

                }




                   for(j=79;j>0;j--)
                {
                        if((road_img1[i][j]&&road_img1[i][j+1]&&road_img1[i][j+2]&&road_img1[i][j+3]==0)&&(road_img1[i][j-1]||road_img1[i][j-2]||road_img1[i][j-3]==1)) ///||road_img1[i][j-4]
                        {
                                Right_point=j;
                               
                                Flag_solve++;
                        }

                }
            if(Flag_solve==0)
                {
                   Right_point = pre_right_point;
                   pre_right_point = pre_right_point;
                   border_line[i][right_border] = 79;
                 //  right_mis = 1;               
                }
                if(Flag_solve>0)
                {
                Flag_solve = 0;
              //  pre_right_point=Right_point;
                right_find[l++]=Right_point;
                }

   if(k&&l>0)
   {
     while(right_find[l]<left_find[k])
     {
       max = (k>l)? 1 : 0;
       if(max==1)
       {
       k--;
       }
       if(max==0)
       {
       l--;
       }

     }
       pre_right_point = right_find[l];
       pre_left_point  = left_find[k] ;
       border_line[i][right_border] = right_find[l];
       border_line[i][left_border]  = left_find[k] ;

   }
   else
   {
     if((k==0)&&(l>0))
     {
     pre_right_point = right_find[l];
     border_line[i][right_border] = right_find[l];
     }
     if((k>1)&&(l==0))
     {
     pre_left_point  = left_find[k] ;
     border_line[i][left_border]  = left_find[k] ;

     }


   }

  }




  /**********************************求中线从start_lie到end_lie*****************************************************************************/
  /**********************************求中线从start_lie到end_lie*****************************************************************************/
  for(i=start_lie; i>end_lie; i--)
        {
                ////////////////////////////////////////找左邊界點
                for(j=pre_left_point-3;j<=pre_left_point+10;j++)
                {      
                        if((road_img1[i][j]||road_img1[i][j+1]||road_img1[i][j+2]||road_img1[i][j+3]==1)&&(road_img1[i][j-1]&&road_img1[i][j-2]&&road_img1[i][j-3]&&road_img1[i][j-4]==0))
                        {      
                                Left_point=j;
                               
                                border_line[i][left_border]=j;
                                Flag_solve++;
                        }



                }
                if(Flag_solve==0)
                {
                   Left_point = pre_left_point;
                   pre_left_point = pre_left_point;
                   border_line[i][left_border] = 0;
               //    left_mis = 1;               
                }
                if(Flag_solve>0)
                {
                Flag_solve = 0;
                pre_left_point=Left_point;
                }

                ////////////////////////////////////////找右邊界點
                for(j=pre_right_point+3;j>=pre_right_point-10;j--)
                {
                        if((road_img1[i][j]&&road_img1[i][j+1]&&road_img1[i][j+2]&&road_img1[i][j+3]==0)&&(road_img1[i][j-1]||road_img1[i][j-2]||road_img1[i][j-3]==1)) ///||road_img1[i][j-4]
                        {
                                Right_point=j;
                                border_line[i][right_border]=j;
                                Flag_solve++;
                        }

                }
            if(Flag_solve==0)
                {
                   Right_point = pre_right_point;
                   pre_right_point = pre_right_point;
                   border_line[i][right_border] = 79;
                 //  right_mis = 1;               
                }
                if(Flag_solve>0)
                {
                Flag_solve = 0;
                pre_right_point=Right_point;
                }               

                border_line[i][mid_border]=Left_point/2+Right_point/2;


        }


}


作者: HEYsir    时间: 2013-3-13 00:40
这么长程序谁看啊,看看是不是哪个符号打错了,我调了一个月bug发现全是打错了符号。还会进入default isr
作者: 洋葱圈    时间: 2013-3-13 08:48
程序实在太长了,没全看。但是进入default_isr的原因有一下几种情况:
数组下标溢出,也就是使用超出了数组范围的索引
模块时钟未使能就使用模块寄存器
使用了非法的Flash地址
没有定义中断服务子程序

如有不全欢迎补充,LZ的问题如果单步调试不行,建议你在可能出问题的地方使用串口输出特定字符进行查找。
作者: Originition    时间: 2013-3-18 00:15
恩,谢谢拉普兰德大哥了,我尝试着改了一下,for循环中的写法,“--”改为“++”,问题居然神奇的解决了,估么着是原来的写法,和某些东西冲突了…
作者: Originition    时间: 2013-3-18 00:16
HEYsir 发表于 2013-3-13 00:40
这么长程序谁看啊,看看是不是哪个符号打错了,我调了一个月bug发现全是打错了符号。还会进入default isr

恩,改了写法,效果好了点,感觉是和之前写的某些东西冲突了,现在解决了~~~~





欢迎光临 智能车制作 (http://dns.znczz.com/) Powered by Discuz! X3.2