内存管理的背景知识
数据对齐
内存管理提到了对数据对齐的概念。简单介绍一下,STM32F4是32位CPU,因而可以得知它的数据总线是32位的也就是说一次可以读取4个字节的内存数据。这就有一个问题了,每一次读取是从哪里开始读4个字节呢?硬件的底层明确了是从4的倍数处读取4个字节。
如果我要读取一个字节的数据,就会一次性读取它所在的地址为x至x+3这4个字节(x是4的倍数,如0,4,8…)。然后剔除不要的部分得到我想要的数据。
如果我要读取两个字节的数据呢?问题来了,假如我正好一个字节在x至x+3,一个字节在x+4至x+7,这就意味着硬件要进行2次读取操作,以及剔除、拼接操作,这些都是很费时的;内存对齐简单理解,就是数据的地址会放在4的倍数处,这样对于2个字节或者4个字节的数据都只需要一次读取就可以完成。,大大提高了效率。
ucos的内存管理要求在申请一段空间并将其初始化为内存分区时要保证数据对齐,也就是说你的数组首地址一定是4的倍数。
内存块大小
另外就是对内存块的大小的要求。对于32位的CPU,它支持的地址空间为4GB,原因就是支持32位的寻址操作,也就意味着指针类型void*的默认类型等价于32位无符号整型。内存块在没有使用的时候会和ucos的消息池比较相似,将未使用的内存块链接成单链表,这样方便获取和回收。
因此内存块在未使用时,它的空间一定是能够放下一个指向下一个内存块的指针,也就是4个字节。综合数据对齐的概念,内存块的大小不得小