| 
 
初级会员 
 
	积分147金钱147 注册时间2016-11-4在线时间27 小时 | 
 
 
 楼主|
发表于 2017-8-29 11:13:55
|
显示全部楼层 
| 本帖最后由 wuhuigps 于 2017-8-29 13:59 编辑 
 确实如你所说;
 //更新字体文件,UNIGBK,GBK12,GBK16,GBK24一起更新
 //x,y:提示信息的显示地址
 //size:字体大小
 //src:字库来源磁盘."0:",SD卡;"1:",FLASH盘,"2:",U盘.
 //提示信息字体大小
 //返回值:0,更新成功;
 //                 其他,错误代码.
 u8 update_font(u16 x,u16 y,u8 size,u8* src)
 {
 u8 *pname;
 u32 *buf;
 u8 res=0;
 u16 i,j;
 FIL *fftemp;
 u8 rval=0;
 res=0XFF;
 ftinfo.fontok=0XFF;
 pname=mymalloc(SRAMIN,100);        //申请100字节内存
 buf=mymalloc(SRAMIN,4096);        //申请4K字节内存
 fftemp=(FIL*)mymalloc(SRAMIN,sizeof(FIL));        //分配内存
 if(buf==NULL||pname==NULL||fftemp==NULL)
 {
 myfree(SRAMIN,fftemp);
 myfree(SRAMIN,pname);
 myfree(SRAMIN,buf);
 return 5;        //内存申请失败
 }
 //先查找文件是否正常
 strcpy((char*)pname,(char*)src);        //copy src内容到pname
 strcat((char*)pname,(char*)UNIGBK_PATH);
 res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
 if(res)rval|=1<<4;//打开文件失败
 strcpy((char*)pname,(char*)src);        //copy src内容到pname
 strcat((char*)pname,(char*)GBK12_PATH);
 res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
 if(res)rval|=1<<5;//打开文件失败
 strcpy((char*)pname,(char*)src);        //copy src内容到pname
 strcat((char*)pname,(char*)GBK16_PATH);
 res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
 if(res)rval|=1<<6;//打开文件失败
 strcpy((char*)pname,(char*)src);        //copy src内容到pname
 strcat((char*)pname,(char*)GBK24_PATH);
 res=f_open(fftemp,(const TCHAR*)pname,FA_READ);
 if(res)rval|=1<<7;//打开文件失败
 myfree(SRAMIN,fftemp);//释放内存
 if(rval==0)//字库文件都存在.
 {
 LCD_ShowString(x,y,240,320,size,"Erasing sectors... ");//提示正在擦除扇区
 for(i=0;i<FONTSECSIZE;i++)        //先擦除字库区域,提高写入速度
 {
 fupd_prog(x+20*size/2,y,size,FONTSECSIZE,i);//进度显示
 W25QXX_Read((u8*)buf,((FONTINFOADDR/4096)+i)*4096,4096);//读出整个扇区的内容
 for(j=0;j<1024;j++)//校验数据
 {
 if(buf[j]!=0XFFFFFFFF)break;//需要擦除
 }
 if(j!=1024)W25QXX_Erase_Sector((FONTINFOADDR/4096)+i);        //需要擦除的扇区
 }
 myfree(SRAMIN,buf);
 LCD_ShowString(x,y,240,320,size,"Updating UNIGBK.BIN");
 strcpy((char*)pname,(char*)src);                                //copy src内容到pname
 strcat((char*)pname,(char*)UNIGBK_PATH);
 res=updata_fontx(x+20*size/2,y,size,pname,0);        //更新UNIGBK.BIN
 if(res){myfree(SRAMIN,pname);return 1;}
 LCD_ShowString(x,y,240,320,size,"Updating GBK12.BIN  ");
 strcpy((char*)pname,(char*)src);                                //copy src内容到pname
 strcat((char*)pname,(char*)GBK12_PATH);
 res=updata_fontx(x+20*size/2,y,size,pname,1);        //更新GBK12.FON
 if(res){myfree(SRAMIN,pname);return 2;}
 LCD_ShowString(x,y,240,320,size,"Updating GBK16.BIN  ");
 strcpy((char*)pname,(char*)src);                                //copy src内容到pname
 strcat((char*)pname,(char*)GBK16_PATH);
 res=updata_fontx(x+20*size/2,y,size,pname,2);        //更新GBK16.FON
 if(res){myfree(SRAMIN,pname);return 3;}
 LCD_ShowString(x,y,240,320,size,"Updating GBK24.BIN  ");
 strcpy((char*)pname,(char*)src);                                //copy src内容到pname
 strcat((char*)pname,(char*)GBK24_PATH);
 res=updata_fontx(x+20*size/2,y,size,pname,3);        //更新GBK24.FON
 if(res){myfree(SRAMIN,pname);return 4;}
 //全部更新好了
 ftinfo.fontok=0XAA;
 W25QXX_Write((u8*)&ftinfo,FONTINFOADDR,sizeof(ftinfo));        //保存字库信息
 }
 myfree(SRAMIN,pname);//释放内存
 myfree(SRAMIN,buf);
 return rval;//无错误.
 }
 原子哥的代码 buf 被释放了2次.移植到FreeRTOS的时候正好出现更新完字库后提示错误
 
 | 
 |