中级会员
 
- 积分
- 280
- 金钱
- 280
- 注册时间
- 2013-6-18
- 在线时间
- 15 小时
|
1金钱
简单明了点,我是初学者,有些小白问题请见谅。
1.原子内存管理程序 以外部SRAM为例
#define MEM1_BLOCK_SIZE 32
#define MEM1_MAX_SIZE 100*1024
#define MEM1_ALLOC_TABLE_SIZE MEM1_MAX_SIZE/MEM1_BLOCK_SIZE
最小内存块32个字节,看了内存分配函数,需要找到连续空的内存块,满足分配内存的大小才能分配。
也就是说分配内存的时候中间肯定有零散的内存块。
一个内存块是32个字节,也就是说我申请一个 U8类型(1byte)的,也会占据一个内存块(好浪费)。
为什么最小内存块为32个byte,如果改小点 4个byte 或 1byte,会不会好点,我也是初学不太懂,想必是有些更生层次的考虑吧,
还望原子哥,指点。
2.内存分配中变量的申请。
__align(32) u8 mem2base[MEM2_MAX_SIZE] __attribute__((at(0X68000000)));
内存池定义的时候是U8类型。
STM32是32位的,也就是说普通的定义变量u8 /u16/u32 都是占4字节的,在申请内存的时候,
U8 *p1;
p1=mymalloc(sramx,1);//申请1个内存
U16 *p2;
p2=mymalloc(sramx,1);//申请1个内存
U32 *p3;
p3=mymalloc(sramx,1);//申请1个内存
以往定义变量
u8 num1; u16 num2; u32 num3; u8 rxbuf[100];
现在都是用指针,感觉好不习惯,感觉在定义数组的时候,不太直观
U8 *p; 你能告诉我这是什么内类的东西,他只是个指针, U8 (*p)[4] 看见数组指针是这样定义的,所以不直观。
不知大家是怎么解决的,内人C语言功底一般。指针用的少。
我是刚学到这一步,发的帖子没有往下深究,发帖的目的只为互相学习。
|
最佳答案
查看完整内容[请看2#楼]
第一个问题,内存块做成32字节的目的是为了尽可能的减小内存碎片化,你做成1字节表面上看是省内存,但是随着内存分配的次数增多,你的内存碎片就会越小,极限情况下内存碎片就是1个字节了!至于什么叫内存碎片这些东西百度多找找内存分配算法的设计思路就知道了。至于第二个问题,C语言指针的知识,找本书多看多练,C语言指针在嵌入式开发中非常见,必须掌握!
|