中级会员
 
- 积分
- 330
- 金钱
- 330
- 注册时间
- 2015-6-24
- 在线时间
- 124 小时
|
1金钱
原子哥,请教一下,使用STM32F446,程序参考STM32F407探索者程序,移植了EMWIN,初始化SRAM正常,使用程序system_exsram_test()测试,读写正常,在GUI_X_Config()分配外部内存时调用 U32 *aMemory = mymalloc(SRAMEX,GUI_NUMBYTES); 返回值是0,SRAM和MALLOC程序是STM32F407原程序,请问下,分配内存不成功有可能是什么原因,有没有什么方法可以测试。
u8 system_exsram_test(void)
{
u32 i=0;
u16 temp=0;
u16 sval=0; //在地址0读到的数据
//每隔1K字节,写入一个数据,总共写入1024个数据,刚好是1M字节
for(i=0;i<1024*1024;i+=1024)
{
FSMC_SRAM_WriteBuffer((u8*)&temp,i,2);
temp++;
}
//依次读出之前写入的数据,进行校验
for(i=0;i<1024*1024;i+=1024)
{
FSMC_SRAM_ReadBuffer((u8*)&temp,i,2);
if(i==0)
sval=temp;
else if(temp<=sval)
break;//后面读出的数据一定要比第一次读到的数据大.
}
if(i>=1024*1024)
{
return 0;//内存正常,成功
}
return 1;//失败
}
void *mymalloc(u8 memx,u32 size)
{
u32 offset;
offset = mem_malloc(memx,size);
if(offset == 0XFFFFFFFF)
return NULL;
else
return (void*)((u32)mallco_dev.membase[memx] + offset);
}
u32 mem_malloc(u8 memx,u32 size)
{
signed long offset=0;
u16 nmemb; //需要的内存块数
u16 cmemb=0;//连续空内存块数
u32 i;
if(!mallco_dev.memrdy[memx])mallco_dev.init(memx);//未初始化,先执行初始化
if(size==0)return 0XFFFFFFFF;//不需要分配
nmemb=size/memblksize[memx]; //获取需要分配的连续内存块数
if(size%memblksize[memx])nmemb++;
for(offset=memtblsize[memx]-1;offset>=0;offset--)//搜索整个内存控制区
{
if(!mallco_dev.memmap[memx][offset])cmemb++;//连续空内存块数增加
else cmemb=0; //连续内存块清零
if(cmemb==nmemb) //找到了连续nmemb个空内存块
{
for(i=0;i<nmemb;i++) //标注内存块非空
{
mallco_dev.memmap[memx][offset+i]=nmemb;
}
return (offset*memblksize[memx]);//返回偏移地址
}
}
return 0XFFFFFFFF;//未找到符合分配条件的内存块
}
|
|