parent
f26089762e
commit
3fada9a2c5
|
@ -2,6 +2,7 @@
|
||||||
#include "Interrupt.h"
|
#include "Interrupt.h"
|
||||||
|
|
||||||
#include "Heap.h"
|
#include "Heap.h"
|
||||||
|
#include "TTime.h"
|
||||||
|
|
||||||
#define MEMORY_ALIGN 4
|
#define MEMORY_ALIGN 4
|
||||||
|
|
||||||
|
@ -48,6 +49,9 @@ Heap::Heap(uint addr, uint size)
|
||||||
_Used = sizeof(MemoryBlock) << 1;
|
_Used = sizeof(MemoryBlock) << 1;
|
||||||
_Count = 0;
|
_Count = 0;
|
||||||
|
|
||||||
|
// 记录第一个有空闲内存的块,减少内存分配时的查找次数
|
||||||
|
_First = mb;
|
||||||
|
|
||||||
debug_printf("Heap::Init(%p, %d) Free=%d \r\n", Address, Size, FreeSize());
|
debug_printf("Heap::Init(%p, %d) Free=%d \r\n", Address, Size, FreeSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,7 +79,7 @@ void* Heap::Alloc(uint size)
|
||||||
int need = size + sizeof(MemoryBlock);
|
int need = size + sizeof(MemoryBlock);
|
||||||
|
|
||||||
SmartIRQ irq;
|
SmartIRQ irq;
|
||||||
for(auto mcb=(MemoryBlock*)Address; mcb->Next!=nullptr; mcb=mcb->Next)
|
for(auto mcb=(MemoryBlock*)_First; mcb->Next!=nullptr; mcb=mcb->Next)
|
||||||
{
|
{
|
||||||
// 找到一块满足大小的内存块。计算当前块剩余长度
|
// 找到一块满足大小的内存块。计算当前块剩余长度
|
||||||
int free = (int)mcb->Next - (int)mcb - mcb->Used;
|
int free = (int)mcb->Next - (int)mcb - mcb->Used;
|
||||||
|
@ -87,12 +91,15 @@ void* Heap::Alloc(uint size)
|
||||||
tmp->Used = need;
|
tmp->Used = need;
|
||||||
mcb->Next = tmp;
|
mcb->Next = tmp;
|
||||||
|
|
||||||
|
// 记录第一个有空闲内存的块,减少内存分配时的查找次数
|
||||||
|
_First = tmp;
|
||||||
|
|
||||||
ret = (void*)((uint)(tmp+1));
|
ret = (void*)((uint)(tmp+1));
|
||||||
|
|
||||||
_Used += need;
|
_Used += need;
|
||||||
_Count++;
|
_Count++;
|
||||||
|
|
||||||
debug_printf("Heap::Alloc (%p, %d) Used=%d Count=%d \r\n", ret, need, _Used, _Count);
|
//debug_printf("Heap::Alloc (%p, %d) First=%p Used=%d Count=%d \r\n", ret, need, _First, _Used, _Count);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -106,23 +113,26 @@ void* Heap::Alloc(uint size)
|
||||||
void Heap::Free(void* ptr)
|
void Heap::Free(void* ptr)
|
||||||
{
|
{
|
||||||
auto prev = (MemoryBlock*)Address;
|
auto prev = (MemoryBlock*)Address;
|
||||||
auto mcb = (MemoryBlock*)ptr - 1;
|
auto cur = (MemoryBlock*)ptr - 1;
|
||||||
|
|
||||||
SmartIRQ irq;
|
SmartIRQ irq;
|
||||||
for(auto find=prev->Next; find->Next!=nullptr; find=find->Next)
|
for(auto mcb=prev->Next; mcb->Next!=nullptr; mcb=mcb->Next)
|
||||||
{
|
{
|
||||||
// 找到内存块
|
// 找到内存块
|
||||||
if(find == mcb)
|
if(mcb == cur)
|
||||||
{
|
{
|
||||||
_Used -= find->Used;
|
_Used -= cur->Used;
|
||||||
_Count--;
|
_Count--;
|
||||||
|
|
||||||
debug_printf("Heap::Free (%p, %d) Used=%d Count=%d \r\n", ptr, find->Used, _Used, _Count);
|
// 前面有空闲位置
|
||||||
|
if(cur <= _First) _First = prev;
|
||||||
|
|
||||||
prev->Next = find->Next;
|
//debug_printf("Heap::Free (%p, %d) First=%p Used=%d Count=%d \r\n", ptr, cur->Used, _First, _Used, _Count);
|
||||||
|
|
||||||
|
prev->Next = cur->Next;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
prev = find;
|
prev = mcb;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,6 +23,7 @@ public:
|
||||||
private:
|
private:
|
||||||
uint _Used;
|
uint _Used;
|
||||||
uint _Count;
|
uint _Count;
|
||||||
|
void* _First; // 第一个有空闲的内存块,加速搜索
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue