完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
STM32F103VC 移植FreeRTOS+FATFS一直运行都挺正常的,由于需要使用文件系统和字库.所以移植了原子哥的SPI flash 代码;
SPI Flash W25QXX_Write() 写函数因为需要使用到一个 4k 的buf做数据暂存;为了使用方便引用了FreeRTOS 的 heap_4 内存管理方式; pvPortMalloc(); 申请内存 vPortFree(); 释放内存 问题描述: 初始化过程中从SD卡拷贝字库到SPI flash 前段都顺利通过,字库文件顺利写入也成功正常;退出字库更新函数的时候问题来了,此时还没有开始创建FreeRTOS任务. FreeRTOS 断言函数 configASSERT(x) 通过串口输出: FreeRTOS Error:..FreeRTOSportableMemMangheap_4.c,320 FreeRTOS Error:..FreeRTOSportableMemMangheap_4.c,321 红色部分; 琢磨了好久硬是不知道那里出错了;希望有高手指点一下. void vPortFree( void *pv ) //heap_4 内存释放函数 { uint8_t *puc = ( uint8_t * ) pv; BlockLink_t *pxLink; if( pv != NULL ) { /* The memory being freed will have an BlockLink_t structure immediately before it. */ puc -= xHeapStructSize; /* This casting is to keep the compiler from issuing warnings. */ pxLink = ( void * ) puc; /* Check the block is actually allocated. */ configASSERT( ( pxLink->xBlockSize & xBlockAllocatedBit ) != 0 ); configASSERT( pxLink->pxNextFreeBlock == NULL ); |
|
相关推荐
4个回答
|
|
确实如你所说;
//更新字体文件,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 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的时候正好出现更新完字库后提示错误 |
|
|
|
有可能释放了一个没有申请的内存块
|
|
|
|
我也遇到了这个问题,我的内存是申请过的
[C] 纯文本查看 复制代码 t = pvPortMalloc(256);printf("point(t) = %prn", t);sprintf(t, "%s:%s", serverhost, serverport);// Cache Hostcontent = pvPortMalloc(256);sprintf(content, GET, p, t);printf("%srn", content);esp8266_send_data((u8*)content, (u8*)"200 OK", 400);// printf("%srn", USART3_RX_BUF);t = strstr((char*)USART3_RX_BUF, "{");switchUtf8ToGbk(t, content);vPortFree(t);t = NULL; |
|
|
|
现在还不知道是什么原因
|
|
|
|
只有小组成员才能发言,加入小组>>
791 浏览 0 评论
1151 浏览 1 评论
2527 浏览 5 评论
2860 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2710 浏览 6 评论
keil5中manage run-time environment怎么是灰色,不可以操作吗?
1070浏览 3评论
193浏览 2评论
455浏览 2评论
368浏览 2评论
M0518 PWM的电压输出只有2V左右,没有3.3V是怎么回事?
453浏览 1评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 15:05 , Processed in 1.225211 second(s), Total 87, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号