100分请教---- DataAbort exception!----关于数据终止异常

gjb04720650   2010-6-9 21:31 楼主
            一般数据终止异常在编程方面是:指针操作错误,或者数组越界等等!而我现在一下的程序(在S3C2440裸奔时)就是看不出哪里造成数据终止异常,现在请教各位大侠!
struct FAT_Init_Arg Init_Arg_SD;       
struct FAT_Init_Arg *pArg=NULL;

UINT32 FAT_Enter_Dir(INT8 *path)
{
UINT32 Cur_Clust=0,sec_temp=0,iSec=0,iDir=0,Old_Clust=0;
UINT8 i=1,counter=0,flag=0;                     
struct direntry *pDir=NULL;
INT8 name[20]={0};

  INT8 *Mypath=NULL;
  Mypath=(INT8 *)malloc(30);
  Mypath=path;
  pDir=malloc(sizeof(struct direntry));

pArg=&Init_Arg_SD;
Cur_Clust=pArg->FirstDirClust;  

  if(*(Mypath+1)==0 && *(Mypath+0)=='\\')
      {
          Uart_Printf("*(Mypath+1)=%xh,*(Mypath+0)=%xh \n",  *(Mypath+1),*(Mypath+0));
           return Cur_Clust;
          }
  
else                                         
{
        
  while(*(Mypath+i)!=0)
  {

   if(*(Mypath+i)=='\\')        
   {
   
      for(;counter<8;counter++)  
        {
         name[counter]=' ';           
        }
        name[counter]=0;            
        counter=0;                    
               
        do
        {
         sec_temp=(SOC(Cur_Clust));
         for(iSec=sec_temp;iSecSectorsPerClust;iSec++)  
         {

          Rd_Block(iSec, 1, (U32*)FAT32_Buffer);
          Uart_Printf("iSec one of all sectors =%xh\n", iSec);
          
        for(iDir=0;iDirBytesPerSector;iDir+=sizeof(struct direntry))
      {
       pDir=((struct direntry *)(FAT32_Buffer+iDir));
           if(Compare_Dir_Name((INT8*)pDir->deName,(INT8*)name))     
           {
                    flag=1;                     
                 
                Cur_Clust=pDir->deLowCluster[0]+(pDir->deLowCluster[1]<<8)+(pDir->deHighClust[0]<<16)+(pDir->deHighClust[1]<<24);
                iDir=pArg->BytesPerSector;
                iSec=sec_temp+pArg->SectorsPerClust;
           }
          }
          
         }
         Old_Clust=Cur_Clust;        
        }while(!flag && (Cur_Clust=FAT32_GetNextCluster(Cur_Clust))!=0x0fffffff);
       
        if(!flag)
        {
         temp_dir_cluster=Old_Clust;
         strcpy(temp_dir_name,name);
         flag=0;
         free(pDir);
         free(Mypath);
         return 0;            
        }
        flag=0;

   }
   else
   {
    name[counter++]=(L2U(*(Mypath+i)));
    Uart_Printf("*(Mypath+i)=%xh ,i=%d \n",  *(Mypath+i),i);
   }
   i++;
  }
}


name[counter]=0;
flag=1;
temp_dir_cluster=Cur_Clust;
strcpy(temp_dir_name,name);

  free(pDir);
  free(Mypath);
return Cur_Clust;
}

而当我把红色的代码屏蔽之后,就没出现数据终止异常。

回复评论 (10)

我也出现过这种错误,仅将我的经验说说:
我的是基于wince5.0的,每次在platform builder 5.0下执行了Build and sysgen current BSP后使用bootloader引导下载OS内核时还事,但当内核全部放入SDRAM后,要执行时就会出现数据中止异常,当然开始的时候不知道是执行了Build and sysgen current BSP的缘故,后来经过排除法才确定了是这个原因。

现在我的解释只能是厂家提供的BSP还有问题,没有完全移植好。。。
点赞  2010-6-10 08:33
我的程序不是基于PB编译平台,在ADS1.2编译平台下的,我想我的程序出现 数据终止异常,应该不会是硬件问题吧,因为在软件上,当屏蔽了其中一些代码后,就不会出现异常。在线期待大侠们的回答 .
点赞  2010-6-10 09:37
一定是软件问题。
LZ也说了屏蔽了一些代码,就正常了。
点赞  2010-6-10 10:08
你至少调试一下,看是哪一行代码引起了数据异常吧,这么多代码没头没尾的,又不能调试,别人怎么帮你看.
点赞  2010-6-10 10:40
Lz单步调试 一段一段代码仔细查查吧。。通常是内存越界造成的。。
点赞  2010-6-10 10:47
在没有仿真器的情况下,不能单步实现,一直以串口打印信息,比较难精确找到出错的地方
点赞  2010-6-10 12:57
学了这么久的CPU,没用过仿真器,这样的话就用排除法吧,一句一句的试试。。。
点赞  2010-6-10 13:09
还有就是别人肯定不会帮你从代码中找出错误的,只能说说自已的经验,所以代码中的错误还得自已查。。。
点赞  2010-6-10 13:10
仿真器以前有此资源,在底层驱动调试中仿真器还是比较好用的,而现在没有,CPU出现异常的情况下缺乏仿真器确实不好调试,好吧,咱们现就结贴吧,非常感谢上面大侠的经验分享。
点赞  2010-6-10 13:21
改天与俺的哥们借个仿真器用用,或者自己找找原因啦……嘿嘿
点赞  2010-6-10 13:23
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复