50 lines
1.2 KiB
C
50 lines
1.2 KiB
C
#include "heap4_common.h"
|
|
|
|
#define HEAP_BYTES 160U
|
|
|
|
static uint8_t heap_area[HEAP_BYTES + HEAP4_ALIGNMENT];
|
|
static HeapBlock start;
|
|
static HeapBlock *end_marker;
|
|
|
|
volatile size_t g_initial_free_size;
|
|
volatile uintptr_t g_aligned_offset;
|
|
volatile int g_end_is_last;
|
|
|
|
static void heap_init(void)
|
|
{
|
|
uintptr_t raw;
|
|
uintptr_t aligned;
|
|
size_t available;
|
|
HeapBlock *first;
|
|
|
|
raw = (uintptr_t)&heap_area[0];
|
|
aligned = heap4_align_address(raw);
|
|
available = HEAP_BYTES - (size_t)(aligned - raw);
|
|
available &= ~HEAP4_ALIGNMENT_MASK;
|
|
|
|
first = (HeapBlock *)aligned;
|
|
end_marker = (HeapBlock *)(aligned + available - sizeof(HeapBlock));
|
|
end_marker->next = 0;
|
|
end_marker->size = 0U;
|
|
|
|
first->next = end_marker;
|
|
first->size = (uint8_t *)end_marker - (uint8_t *)first;
|
|
|
|
start.next = first;
|
|
start.size = 0U;
|
|
}
|
|
|
|
int main(void)
|
|
{
|
|
heap_init();
|
|
|
|
g_aligned_offset = (uintptr_t)start.next - (uintptr_t)&heap_area[0];
|
|
g_initial_free_size = start.next->size;
|
|
g_end_is_last = (start.next->next == end_marker) && (end_marker->next == 0);
|
|
|
|
TRACE_PRINTF("offset=%u free=%u end_last=%d\n",
|
|
(unsigned)g_aligned_offset, (unsigned)g_initial_free_size,
|
|
g_end_is_last);
|
|
return 0;
|
|
}
|