OpenEdv-开源电子网

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

SD读写操作完了,返回emWin就死机

[复制链接]

25

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2016-6-2
在线时间
49 小时
发表于 2016-10-1 09:39:15 | 显示全部楼层 |阅读模式
1金钱
emWin里按下按钮,先关闭中断,对SD操作,返回以后,emWin就触发HardFault_Handler

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
      [mw_shl_code=c,true]                case ID_BUTTON_4505: // Notifications sent by 'Button'
      switch(NCode) {
      case WM_NOTIFICATION_CLICKED:
        break;
      case WM_NOTIFICATION_RELEASED:
                          hItem = WM_GetDialogItem(hWin, ID_TEXT_4502);
                    TEXT_SetText(hItem,"Saving Result to SD!");
                                GUI_Delay(200);
                           __disable_irq();
                          
                                if(check_SD()==0)
                                {
                                        if(write_result_to_SD()==0)
                                        {
                                        hItem = WM_GetDialogItem(hWin, ID_TEXT_4502);       
                                        TEXT_SetText(hItem,"Save successfully!");
                                        }
                                        else
                                        {
                                        TEXT_SetText(hItem,"Test result writes error!");
                                        }
                                }
                                else
                                {
                                        TEXT_SetText(hItem,"SD Error");
                                }

                                __enable_irq();               
                                GUI_Delay(500);
        break;[/mw_shl_code]

下面上面调用的两个函数。
/////////////////////////////////////////////////////////////////////////////////////////////////////////////
[mw_shl_code=c,true]int check_SD(void)
{
        u32 total,free;
      u8 i;
      int flag=0;
      i=5;
      while(i)                    //检测SD卡
    {
        if(SD_Initialize())
        {
        delay_ms(100);
        i--;
        flag=1;
        }
        else
            i=0;
    }        
    if(flag!=0) return flag;
     exfuns_init();                            //为fatfs相关变量申请内存        
    f_mount(fs[0],"0:",1);                     //挂载SD卡
     //f_mount(fs[1],"1:",1);                     //挂载FLASH.   
  i=5;
   
    while(i)    //得到SD卡的总容量和剩余容量
    {
        if(exf_getfree("0",&total,&free))
        {
        delay_ms(200);
        i--;
        flag=2;
        }
        else
            i=0;
    }               
  if(flag!=0)
    {LED_B=1;LED_R=0;return flag;    }
    else
    {

    LCD_ShowString(30,180,200,16,16,"SD Test Ok. Free Size:     MB");         
    LCD_ShowNum(220,180,free>>10,5,16);                        //显示SD卡剩余容量 MB        
    delay_ms(200);
    f_mount(NULL, "", 0);
    return flag;
    }
   
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////
int write_result_to_SD(void)
{
      int flag=0;
      uint8_t res;
      u8 i,k;
      FATFS fs;
      uint32_t index = 0x00;
    uint32_t reindex = 0x00;
      char buf[2000] = "\0";
      uint8_t str[15];
   
    char name[50] = "TestData_";
      pht_read_test_result();
      delay_ms(1000);
   
      RTC_get_date(str,0);
      for(i=0;i<10;i++)
            name[9+i]=str;
      name[19]='_';
      RTC_get_time(str,1);
    for(i=0;i<6;i++)
          name[20+i]=str;
      name[26]='.';
        name[27]='t';
      name[28]='x';
      name[29]='t';
        name[30]='\0'; //TestData_2016-07-17_202512.dat
        
    res = f_mount(&fs, "", 0);

    if(res != FR_OK)
    {
            LCD_ShowString(30,180,200,16,16,"file mount error!");
            flag=1;
            delay_ms(1000);
            return flag;
    }
            LCD_ShowString(30,180,200,16,16, "file mount successful!");
            delay_ms(1000);
        
      res = f_open(file,(const TCHAR *)name,FA_READ | FA_WRITE | FA_CREATE_NEW );
    if(res == FR_OK)
    {
            LCD_ShowString(30,180,200,16,16, "file open sucessfully!");
            delay_ms(1000);
        }
        else
        {
            
            LCD_ShowString(30,180,200,16,16,"file open error!");
            flag=2;
            delay_ms(1000);
            return flag;
        }
        
        index=2000;
        
        for(i=0;i<50;i++)
        {
        

            sprintf(buf,"%s","--Record-");
            
            if(rec.RecFlag==0x88)
            {   
            sprintf(buf,"%s%2d%s",buf,i,"--\r\n");        
            sprintf(buf,"%s%s",buf,rec.TestNr);
            sprintf(buf,"%s%s",buf,"\r\n");
            sprintf(buf,"%s%4d",buf,rec.Pres);
            sprintf(buf,"%s%s",buf,"\r\n");
            sprintf(buf,"%s%2d",buf,rec.PresDrL);
            sprintf(buf,"%s%s",buf,"\r\n");
            sprintf(buf,"%s%1d",buf,rec.TDur);
            sprintf(buf,"%s%s",buf,"\r\n");
            sprintf(buf,"%s%8d%4d",buf,rec.RDate,rec.RTime);
            sprintf(buf,"%s%s",buf,"\r\n");
            sprintf(buf,"%s%1d",buf,rec.TResult);
            sprintf(buf,"%s%s",buf,"\r\n");
            sprintf(buf,"%s%s",buf,rec.Tester);
            sprintf(buf,"%s%s",buf,"\r\n");
            for(k=0;k<21;k++)
                sprintf(buf,"%s%4d%s",buf,rec.PresRec[k]," ");
               
            sprintf(buf,"%s%s",buf,"\r\n\r\n\0");
            }
            else
            {
            sprintf(buf,"%s%2d%s",buf,i,"--\r\n");   
            sprintf(buf,"%s%s",buf,"This record is blank!\r\n");
            sprintf(buf,"%s%s",buf,"\r\n\0");
            }
            //index=sizeof(buf)-1;
            index=strlen(buf);
            res = f_write(file,buf,index, &reindex);
      }        
        if((res == FR_OK)&&(reindex == index))
    {
            LCD_ShowString(30,180,200,16,16,"file saved successfully!");
            delay_ms(1000);
            f_close(file);

        }
        else
        {
            LCD_ShowString(30,180,200,16,16, "file save failed!");
            flag=3;
            delay_ms(1000);
            f_mount(NULL, "", 0);  
          return flag;
        }
        
         /* 解除 SD 卡的逻辑驱动挂载 */
        delay_ms(1000);   
    f_mount(NULL, "", 0);   
        return flag;
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

问题已通过优化基本解决。 主要原因: 硬件配置太低,系统资源紧张。 使用的字符数组,改为指针,退出前使用my_free()释放。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

25

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2016-6-2
在线时间
49 小时
 楼主| 发表于 2016-10-1 09:39:16 | 显示全部楼层
本帖最后由 lancker 于 2016-12-29 13:54 编辑

问题已通过优化基本解决。
主要原因:
硬件配置太低,系统资源紧张。
使用的字符数组,改为指针,退出前使用my_free()释放。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165287
金钱
165287
注册时间
2010-12-1
在线时间
2107 小时
发表于 2016-10-1 16:48:16 | 显示全部楼层
估计是数组溢出、或者指针越界、或者堆栈少了导致的
回复

使用道具 举报

25

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2016-6-2
在线时间
49 小时
 楼主| 发表于 2016-10-2 17:48:58 | 显示全部楼层
本帖最后由 lancker 于 2016-10-2 19:27 编辑
正点原子 发表于 2016-10-1 16:48
估计是数组溢出、或者指针越界、或者堆栈少了导致的

在不使用emWin的程序调用,没有任何问题。
现在,函数的返回值也正常,SD的存储数据也正确。
只有回到emWin时死机。
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165287
金钱
165287
注册时间
2010-12-1
在线时间
2107 小时
发表于 2016-10-2 22:01:34 | 显示全部楼层
lancker 发表于 2016-10-2 17:48
在不使用emWin的程序调用,没有任何问题。
现在,函数的返回值也正常,SD的存储数据也正确。
只有回到e ...

检查堆栈
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

25

主题

96

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
297
金钱
297
注册时间
2016-6-2
在线时间
49 小时
 楼主| 发表于 2016-10-17 17:22:52 | 显示全部楼层

没玩过堆栈分析,有相关文档可以学习吗?
谢谢!
回复

使用道具 举报

12

主题

27

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
241
金钱
241
注册时间
2016-9-21
在线时间
59 小时
发表于 2016-10-18 21:10:36 | 显示全部楼层
任务堆栈搞大点
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-2 00:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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