新手入门
- 积分
- 16
- 金钱
- 16
- 注册时间
- 2016-5-5
- 在线时间
- 2 小时
|
1金钱
本帖最后由 txc3210 于 2016-5-5 09:53 编辑
各位大神,我照着F407开发板做了块板子,接的SRAM是IS62WV51216,在做内存管理的时候,发现一个奇怪问题。
使用开发板的例子,外部SRAM最大管理960K字节,我连续申请2K字节内存直到全部分配完毕,然后把地址打印出来,结果发现无法申请到总共960K字节空间。
而且打印出来的地址也不是连续的(声明:为了专门测试内存管理,程序其它地方未用到外部SRAM),
例如
【2016-05-05 09:17:14:890】addr[062]=680D0800
【2016-05-05 09:17:15:095】addr[063]=680D0000
【2016-05-05 09:17:15:300】addr[064]=680BF800
【2016-05-05 09:17:15:506】addr[065]=680BF000
这中间少了一大块680C开头的地址。
还有
【2016-05-05 09:17:28:074】addr[126]=680A0800
【2016-05-05 09:17:28:280】addr[127]=680A0000
【2016-05-05 09:17:28:487】addr[128]=6807F800
【2016-05-05 09:17:28:694】addr[129]=6807F000
这中间少了6809 6808开头的地址
还有
【2016-05-05 09:17:41:348】addr[190]=68060800
【2016-05-05 09:17:41:556】addr[191]=68060000
【2016-05-05 09:17:41:765】addr[192]=6803F800
【2016-05-05 09:17:41:974】addr[193]=6803F000
这中间也少了一大块
最后分配到68020000就没有了。
【2016-05-05 09:17:54:724】addr[254]=68020800
【2016-05-05 09:17:54:933】addr[255]=68020000
【2016-05-05 09:17:55:143】addr[256]=0
【2016-05-05 09:17:55:153】SRAMEX used 100
还有奇怪的是,最后应该是分配到68000000才对啊。在FSMC初始化之后有调用过初始化程序
FSMC_SRAM_Init(); //初始化外部SRAM
my_mem_init(SRAMIN); //初始化内部内存池
my_mem_init(SRAMEX); //初始化外部内存池
my_mem_init(SRAMCCM); //初始化CCM内存池
总共分配了256块2K字节的内存,这加起来才512K字节啊,并不是960K字节。开始还怀疑是地址线有问题,于是不做内存管理,直接定义一个外部SRAM数组 ,
u16 sram[512*1024] __attribute__((at(0X68000000)));//测试用数组
然后每隔1K写入一个数据,写完后数据加1,再读出数据后是正确的,而且打印来的数据地址是从68000000开始的,直到68100000,
这说明地址线也没有问题啊。
//mem1内存参数设定.mem1完全处于内部SRAM里面.
#define MEM1_BLOCK_SIZE 32 //内存块大小为32字节
#define MEM1_MAX_SIZE 60*1024 //最大管理内存 100K
#define MEM1_ALLOC_TABLE_SIZE MEM1_MAX_SIZE/MEM1_BLOCK_SIZE //内存表大小
//mem2内存参数设定.mem2的内存池处于外部SRAM里面
#define MEM2_BLOCK_SIZE 32 //内存块大小为32字节
#define MEM2_MAX_SIZE 960 *1024 //最大管理内存960K
#define MEM2_ALLOC_TABLE_SIZE MEM2_MAX_SIZE/MEM2_BLOCK_SIZE //内存表大小
//mem3内存参数设定.mem3处于CCM,用于管理CCM(特别注意,这部分SRAM,仅CPU可以访问!!)
#define MEM3_BLOCK_SIZE 32 //内存块大小为32字节
#define MEM3_MAX_SIZE 30 *1024 //最大管理内存60K
#define MEM3_ALLOC_TABLE_SIZE MEM3_MAX_SIZE/MEM3_BLOCK_SIZE //内存表大小
//内存池(32字节对齐)
__align(32) u8 mem1base[MEM1_MAX_SIZE]; //内部SRAM内存池
__align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000))); //外部SRAM内存池
__align(32) u8 mem3base[MEM3_MAX_SIZE] __attribute__((at(0X10000000))); //内部CCM内存池
//内存管理表
u16 mem1mapbase[MEM1_ALLOC_TABLE_SIZE]; //内部SRAM内存池MAP
u16 mem2mapbase[MEM2_ALLOC_TABLE_SIZE] __attribute__((at(0X68000000+MEM2_MAX_SIZE))); //外部SRAM内存池MAP
u16 mem3mapbase[MEM3_ALLOC_TABLE_SIZE] __attribute__((at(0X10000000+MEM3_MAX_SIZE))); //内部CCM内存池MAP
//内存管理参数
const u32 memtblsize[SRAMBANK]={MEM1_ALLOC_TABLE_SIZE,MEM2_ALLOC_TABLE_SIZE,MEM3_ALLOC_TABLE_SIZE}; //内存表大小
const u32 memblksize[SRAMBANK]={MEM1_BLOCK_SIZE,MEM2_BLOCK_SIZE,MEM3_BLOCK_SIZE}; //内存分块大小
const u32 memsize[SRAMBANK]={MEM1_MAX_SIZE,MEM2_MAX_SIZE,MEM3_MAX_SIZE}; //内存总大小
测试内存管理的程序。
void Task9(void *p_arg)
{
unsigned char *p;
u8 peruse;
unsigned short i=0;
char buf[50];
OSTimeDlyHMSM(0,0,10,0);
while(1)
{
OSTimeDlyHMSM(0,0,0,200);
p=(unsigned char *)mymalloc(SRAMEX,2*1024);
sprintf(buf,"addr[%03d]=%X",i,p);
UDP_Send(buf);
if(p==NULL)
{
peruse=my_mem_perused(SRAMEX);
sprintf(buf,"SRAMEX used %d",peruse);
UDP_Send(buf);
break;
}
i++;
}
}
打印出来的地址
【2016-05-05 09:17:02:180】addr[000]=680EF800
【2016-05-05 09:17:02:385】addr[001]=680EF000
【2016-05-05 09:17:02:590】addr[002]=680EE800
【2016-05-05 09:17:02:795】addr[003]=680EE000
【2016-05-05 09:17:03:000】addr[004]=680ED800
【2016-05-05 09:17:03:205】addr[005]=680ED000
【2016-05-05 09:17:03:410】addr[006]=680EC800
【2016-05-05 09:17:03:615】addr[007]=680EC000
【2016-05-05 09:17:03:820】addr[008]=680EB800
【2016-05-05 09:17:04:025】addr[009]=680EB000
【2016-05-05 09:17:04:232】addr[010]=680EA800
【2016-05-05 09:17:04:435】addr[011]=680EA000
【2016-05-05 09:17:04:641】addr[012]=680E9800
【2016-05-05 09:17:04:845】addr[013]=680E9000
【2016-05-05 09:17:05:050】addr[014]=680E8800
【2016-05-05 09:17:05:255】addr[015]=680E8000
【2016-05-05 09:17:05:462】addr[016]=680E7800
【2016-05-05 09:17:05:666】addr[017]=680E7000
【2016-05-05 09:17:05:870】addr[018]=680E6800
【2016-05-05 09:17:06:075】addr[019]=680E6000
【2016-05-05 09:17:06:280】addr[020]=680E5800
【2016-05-05 09:17:06:485】addr[021]=680E5000
【2016-05-05 09:17:06:690】addr[022]=680E4800
【2016-05-05 09:17:06:896】addr[023]=680E4000
【2016-05-05 09:17:07:100】addr[024]=680E3800
【2016-05-05 09:17:07:305】addr[025]=680E3000
【2016-05-05 09:17:07:510】addr[026]=680E2800
【2016-05-05 09:17:07:715】addr[027]=680E2000
【2016-05-05 09:17:07:920】addr[028]=680E1800
【2016-05-05 09:17:08:125】addr[029]=680E1000
【2016-05-05 09:17:08:331】addr[030]=680E0800
【2016-05-05 09:17:08:535】addr[031]=680E0000
【2016-05-05 09:17:08:740】addr[032]=680DF800
【2016-05-05 09:17:08:945】addr[033]=680DF000
【2016-05-05 09:17:09:150】addr[034]=680DE800
【2016-05-05 09:17:09:355】addr[035]=680DE000
【2016-05-05 09:17:09:560】addr[036]=680DD800
【2016-05-05 09:17:09:765】addr[037]=680DD000
【2016-05-05 09:17:09:970】addr[038]=680DC800
【2016-05-05 09:17:10:175】addr[039]=680DC000
【2016-05-05 09:17:10:380】addr[040]=680DB800
【2016-05-05 09:17:10:585】addr[041]=680DB000
【2016-05-05 09:17:10:790】addr[042]=680DA800
【2016-05-05 09:17:10:995】addr[043]=680DA000
【2016-05-05 09:17:11:201】addr[044]=680D9800
【2016-05-05 09:17:11:405】addr[045]=680D9000
【2016-05-05 09:17:11:610】addr[046]=680D8800
【2016-05-05 09:17:11:815】addr[047]=680D8000
【2016-05-05 09:17:12:020】addr[048]=680D7800
【2016-05-05 09:17:12:225】addr[049]=680D7000
【2016-05-05 09:17:12:430】addr[050]=680D6800
【2016-05-05 09:17:12:635】addr[051]=680D6000
【2016-05-05 09:17:12:840】addr[052]=680D5800
【2016-05-05 09:17:13:045】addr[053]=680D5000
【2016-05-05 09:17:13:250】addr[054]=680D4800
【2016-05-05 09:17:13:455】addr[055]=680D4000
【2016-05-05 09:17:13:660】addr[056]=680D3800
【2016-05-05 09:17:13:866】addr[057]=680D3000
【2016-05-05 09:17:14:072】addr[058]=680D2800
【2016-05-05 09:17:14:275】addr[059]=680D2000
【2016-05-05 09:17:14:480】addr[060]=680D1800
【2016-05-05 09:17:14:685】addr[061]=680D1000
【2016-05-05 09:17:14:890】addr[062]=680D0800
【2016-05-05 09:17:15:095】addr[063]=680D0000
【2016-05-05 09:17:15:300】addr[064]=680BF800
【2016-05-05 09:17:15:506】addr[065]=680BF000
【2016-05-05 09:17:15:712】addr[066]=680BE800
【2016-05-05 09:17:15:919】addr[067]=680BE000
【2016-05-05 09:17:16:126】addr[068]=680BD800
【2016-05-05 09:17:16:331】addr[069]=680BD000
【2016-05-05 09:17:16:538】addr[070]=680BC800
【2016-05-05 09:17:16:744】addr[071]=680BC000
【2016-05-05 09:17:16:950】addr[072]=680BB800
【2016-05-05 09:17:17:156】addr[073]=680BB000
【2016-05-05 09:17:17:362】addr[074]=680BA800
【2016-05-05 09:17:17:568】addr[075]=680BA000
【2016-05-05 09:17:17:774】addr[076]=680B9800
【2016-05-05 09:17:17:980】addr[077]=680B9000
【2016-05-05 09:17:18:186】addr[078]=680B8800
【2016-05-05 09:17:18:392】addr[079]=680B8000
【2016-05-05 09:17:18:598】addr[080]=680B7800
【2016-05-05 09:17:18:804】addr[081]=680B7000
【2016-05-05 09:17:19:010】addr[082]=680B6800
【2016-05-05 09:17:19:216】addr[083]=680B6000
【2016-05-05 09:17:19:422】addr[084]=680B5800
【2016-05-05 09:17:19:628】addr[085]=680B5000
【2016-05-05 09:17:19:834】addr[086]=680B4800
【2016-05-05 09:17:20:040】addr[087]=680B4000
【2016-05-05 09:17:20:246】addr[088]=680B3800
【2016-05-05 09:17:20:452】addr[089]=680B3000
【2016-05-05 09:17:20:658】addr[090]=680B2800
【2016-05-05 09:17:20:864】addr[091]=680B2000
【2016-05-05 09:17:21:070】addr[092]=680B1800
【2016-05-05 09:17:21:276】addr[093]=680B1000
【2016-05-05 09:17:21:483】addr[094]=680B0800
【2016-05-05 09:17:21:688】addr[095]=680B0000
【2016-05-05 09:17:21:894】addr[096]=680AF800
【2016-05-05 09:17:22:100】addr[097]=680AF000
【2016-05-05 09:17:22:306】addr[098]=680AE800
【2016-05-05 09:17:22:512】addr[099]=680AE000
【2016-05-05 09:17:22:718】addr[100]=680AD800
【2016-05-05 09:17:22:924】addr[101]=680AD000
【2016-05-05 09:17:23:130】addr[102]=680AC800
【2016-05-05 09:17:23:336】addr[103]=680AC000
【2016-05-05 09:17:23:543】addr[104]=680AB800
【2016-05-05 09:17:23:748】addr[105]=680AB000
【2016-05-05 09:17:23:954】addr[106]=680AA800
【2016-05-05 09:17:24:160】addr[107]=680AA000
【2016-05-05 09:17:24:367】addr[108]=680A9800
【2016-05-05 09:17:24:573】addr[109]=680A9000
【2016-05-05 09:17:24:778】addr[110]=680A8800
【2016-05-05 09:17:24:984】addr[111]=680A8000
【2016-05-05 09:17:25:190】addr[112]=680A7800
【2016-05-05 09:17:25:396】addr[113]=680A7000
【2016-05-05 09:17:25:603】addr[114]=680A6800
【2016-05-05 09:17:25:808】addr[115]=680A6000
【2016-05-05 09:17:26:014】addr[116]=680A5800
【2016-05-05 09:17:26:220】addr[117]=680A5000
【2016-05-05 09:17:26:426】addr[118]=680A4800
【2016-05-05 09:17:26:632】addr[119]=680A4000
【2016-05-05 09:17:26:838】addr[120]=680A3800
【2016-05-05 09:17:27:044】addr[121]=680A3000
【2016-05-05 09:17:27:250】addr[122]=680A2800
【2016-05-05 09:17:27:456】addr[123]=680A2000
【2016-05-05 09:17:27:662】addr[124]=680A1800
【2016-05-05 09:17:27:868】addr[125]=680A1000
【2016-05-05 09:17:28:074】addr[126]=680A0800
【2016-05-05 09:17:28:280】addr[127]=680A0000
【2016-05-05 09:17:28:487】addr[128]=6807F800
【2016-05-05 09:17:28:694】addr[129]=6807F000
【2016-05-05 09:17:28:901】addr[130]=6807E800
【2016-05-05 09:17:29:108】addr[131]=6807E000
【2016-05-05 09:17:29:315】addr[132]=6807D800
【2016-05-05 09:17:29:522】addr[133]=6807D000
【2016-05-05 09:17:29:729】addr[134]=6807C800
【2016-05-05 09:17:29:936】addr[135]=6807C000
【2016-05-05 09:17:30:143】addr[136]=6807B800
【2016-05-05 09:17:30:350】addr[137]=6807B000
【2016-05-05 09:17:30:557】addr[138]=6807A800
【2016-05-05 09:17:30:764】addr[139]=6807A000
【2016-05-05 09:17:30:972】addr[140]=68079800
【2016-05-05 09:17:31:178】addr[141]=68079000
【2016-05-05 09:17:31:385】addr[142]=68078800
【2016-05-05 09:17:31:593】addr[143]=68078000
【2016-05-05 09:17:31:799】addr[144]=68077800
【2016-05-05 09:17:32:006】addr[145]=68077000
【2016-05-05 09:17:32:213】addr[146]=68076800
【2016-05-05 09:17:32:420】addr[147]=68076000
【2016-05-05 09:17:32:627】addr[148]=68075800
【2016-05-05 09:17:32:834】addr[149]=68075000
【2016-05-05 09:17:33:042】addr[150]=68074800
【2016-05-05 09:17:33:248】addr[151]=68074000
【2016-05-05 09:17:33:456】addr[152]=68073800
【2016-05-05 09:17:33:663】addr[153]=68073000
【2016-05-05 09:17:33:870】addr[154]=68072800
【2016-05-05 09:17:34:077】addr[155]=68072000
【2016-05-05 09:17:34:284】addr[156]=68071800
【2016-05-05 09:17:34:491】addr[157]=68071000
【2016-05-05 09:17:34:698】addr[158]=68070800
【2016-05-05 09:17:34:905】addr[159]=68070000
【2016-05-05 09:17:35:112】addr[160]=6806F800
【2016-05-05 09:17:35:319】addr[161]=6806F000
【2016-05-05 09:17:35:526】addr[162]=6806E800
【2016-05-05 09:17:35:733】addr[163]=6806E000
【2016-05-05 09:17:35:940】addr[164]=6806D800
【2016-05-05 09:17:36:147】addr[165]=6806D000
【2016-05-05 09:17:36:355】addr[166]=6806C800
【2016-05-05 09:17:36:563】addr[167]=6806C000
【2016-05-05 09:17:36:771】addr[168]=6806B800
【2016-05-05 09:17:36:979】addr[169]=6806B000
【2016-05-05 09:17:37:187】addr[170]=6806A800
【2016-05-05 09:17:37:395】addr[171]=6806A000
【2016-05-05 09:17:37:603】addr[172]=68069800
【2016-05-05 09:17:37:811】addr[173]=68069000
【2016-05-05 09:17:38:019】addr[174]=68068800
【2016-05-05 09:17:38:227】addr[175]=68068000
【2016-05-05 09:17:38:435】addr[176]=68067800
【2016-05-05 09:17:38:644】addr[177]=68067000
【2016-05-05 09:17:38:852】addr[178]=68066800
【2016-05-05 09:17:39:060】addr[179]=68066000
【2016-05-05 09:17:39:268】addr[180]=68065800
【2016-05-05 09:17:39:476】addr[181]=68065000
【2016-05-05 09:17:39:684】addr[182]=68064800
【2016-05-05 09:17:39:892】addr[183]=68064000
【2016-05-05 09:17:40:100】addr[184]=68063800
【2016-05-05 09:17:40:308】addr[185]=68063000
【2016-05-05 09:17:40:516】addr[186]=68062800
【2016-05-05 09:17:40:724】addr[187]=68062000
【2016-05-05 09:17:40:932】addr[188]=68061800
【2016-05-05 09:17:41:140】addr[189]=68061000
【2016-05-05 09:17:41:348】addr[190]=68060800
【2016-05-05 09:17:41:556】addr[191]=68060000
【2016-05-05 09:17:41:765】addr[192]=6803F800
【2016-05-05 09:17:41:974】addr[193]=6803F000
【2016-05-05 09:17:42:184】addr[194]=6803E800
【2016-05-05 09:17:42:392】addr[195]=6803E000
【2016-05-05 09:17:42:601】addr[196]=6803D800
【2016-05-05 09:17:42:810】addr[197]=6803D000
【2016-05-05 09:17:43:019】addr[198]=6803C800
【2016-05-05 09:17:43:228】addr[199]=6803C000
【2016-05-05 09:17:43:437】addr[200]=6803B800
【2016-05-05 09:17:43:646】addr[201]=6803B000
【2016-05-05 09:17:43:855】addr[202]=6803A800
【2016-05-05 09:17:44:064】addr[203]=6803A000
【2016-05-05 09:17:44:273】addr[204]=68039800
【2016-05-05 09:17:44:482】addr[205]=68039000
【2016-05-05 09:17:44:691】addr[206]=68038800
【2016-05-05 09:17:44:900】addr[207]=68038000
【2016-05-05 09:17:45:109】addr[208]=68037800
【2016-05-05 09:17:45:318】addr[209]=68037000
【2016-05-05 09:17:45:527】addr[210]=68036800
【2016-05-05 09:17:45:736】addr[211]=68036000
【2016-05-05 09:17:45:945】addr[212]=68035800
【2016-05-05 09:17:46:154】addr[213]=68035000
【2016-05-05 09:17:46:363】addr[214]=68034800
【2016-05-05 09:17:46:572】addr[215]=68034000
【2016-05-05 09:17:46:781】addr[216]=68033800
【2016-05-05 09:17:46:990】addr[217]=68033000
【2016-05-05 09:17:47:199】addr[218]=68032800
【2016-05-05 09:17:47:408】addr[219]=68032000
【2016-05-05 09:17:47:617】addr[220]=68031800
【2016-05-05 09:17:47:826】addr[221]=68031000
【2016-05-05 09:17:48:035】addr[222]=68030800
【2016-05-05 09:17:48:244】addr[223]=68030000
【2016-05-05 09:17:48:455】addr[224]=6802F800
【2016-05-05 09:17:48:662】addr[225]=6802F000
【2016-05-05 09:17:48:871】addr[226]=6802E800
【2016-05-05 09:17:49:080】addr[227]=6802E000
【2016-05-05 09:17:49:289】addr[228]=6802D800
【2016-05-05 09:17:49:498】addr[229]=6802D000
【2016-05-05 09:17:49:707】addr[230]=6802C800
【2016-05-05 09:17:49:916】addr[231]=6802C000
【2016-05-05 09:17:50:125】addr[232]=6802B800
【2016-05-05 09:17:50:334】addr[233]=6802B000
【2016-05-05 09:17:50:544】addr[234]=6802A800
【2016-05-05 09:17:50:752】addr[235]=6802A000
【2016-05-05 09:17:50:962】addr[236]=68029800
【2016-05-05 09:17:51:171】addr[237]=68029000
【2016-05-05 09:17:51:380】addr[238]=68028800
【2016-05-05 09:17:51:589】addr[239]=68028000
【2016-05-05 09:17:51:798】addr[240]=68027800
【2016-05-05 09:17:52:007】addr[241]=68027000
【2016-05-05 09:17:52:216】addr[242]=68026800
【2016-05-05 09:17:52:425】addr[243]=68026000
【2016-05-05 09:17:52:635】addr[244]=68025800
【2016-05-05 09:17:52:843】addr[245]=68025000
【2016-05-05 09:17:53:052】addr[246]=68024800
【2016-05-05 09:17:53:261】addr[247]=68024000
【2016-05-05 09:17:53:470】addr[248]=68023800
【2016-05-05 09:17:53:679】addr[249]=68023000
【2016-05-05 09:17:53:888】addr[250]=68022800
【2016-05-05 09:17:54:097】addr[251]=68022000
【2016-05-05 09:17:54:306】addr[252]=68021800
【2016-05-05 09:17:54:515】addr[253]=68021000
【2016-05-05 09:17:54:724】addr[254]=68020800
【2016-05-05 09:17:54:933】addr[255]=68020000
【2016-05-05 09:17:55:143】addr[256]=0
【2016-05-05 09:17:55:153】SRAMEX used 100
|
|