初始化 所用内存块为静态数组 优点:能够合并相邻的内存,减少内存碎片化 缺点:空间浪费,每块申请的内存都需要头信息,也就意味着,原本使用1G空间给freertos内存模块使用,但是申请越多的内存且不释放的情况下,用户可用内存就越少。举例子,当用户申请1块内存时,只包含一个头信息,假如头信息内存大小18bytes,那用户可用内存就是1G-18bytes;如果用户申请2块内存时,那用户可用内存就是1G-18bytes*2,以此类推。
初始化
1、头指针指向整块内存的起始地址、
2、计算结尾地址 起始地址+内存长度 内存长度就是静态数组的长度,字节长度
3、结尾地址减去头信息的长度,余处的这块内存给尾指针用的
4、尾指针指向结尾地址
5、第一块可用内存的下一个指针指向尾指针
Malloc
1、将用户传入的size加上头信息的长度,
2、检查申请的内存长度是否合理。
3、取出头指针和第一块可用内存。
4、遍历内存,找到第一块大于所需内存的地址
5、获取所需内存的首地址
6、将新的未使用地址链接到上一块地址上
7、可用内存减去申请的size
free
1、将用户传入的需要释放的内存减去头信息的长度,前移
2、可用长度加回来
3、找到插入内存的位置,条件就是当前节点的下一个地址比要释放的地址大
4、判断前向内存,当前地址是否和需要释放的地址连续,如果连续就合并2块内存 (前向内存);如果不连续,暂时不做任何操作。
5、判断后向内存,如果和后向内存连续且后向内存不为尾节点,则合并2块内存;如果后向内存是尾节点,则把尾节点给到释放内存的下一个地址;如果不连续直接把后向内存给到释放内存的下一个地址。
6、判断是否和前向内存合并,如果没合并,说明不连续,则把前向内存的下一个地址指向释放内存地址。
才疏学浅,还请指正