Add FreeRTOS heap4 intro card
This commit is contained in:
@@ -0,0 +1,76 @@
|
||||
#include "heap4_common.h"
|
||||
|
||||
static uint8_t heap_area[192];
|
||||
static HeapBlock start;
|
||||
static HeapBlock *end_marker;
|
||||
|
||||
volatile int g_free_count;
|
||||
volatile size_t g_merged_size;
|
||||
volatile int g_merged_with_right;
|
||||
|
||||
static void insert_block_merge(HeapBlock *block)
|
||||
{
|
||||
HeapBlock *iterator;
|
||||
uint8_t *block_end;
|
||||
|
||||
for (iterator = &start; iterator->next < block; iterator = iterator->next)
|
||||
;
|
||||
|
||||
block_end = (uint8_t *)block + block->size;
|
||||
if (block_end == (uint8_t *)iterator->next) {
|
||||
block->size += iterator->next->size;
|
||||
block->next = iterator->next->next;
|
||||
} else {
|
||||
block->next = iterator->next;
|
||||
}
|
||||
|
||||
if (iterator != &start && heap4_blocks_touch(iterator, block)) {
|
||||
iterator->size += block->size;
|
||||
iterator->next = block->next;
|
||||
} else {
|
||||
iterator->next = block;
|
||||
}
|
||||
}
|
||||
|
||||
static int count_free(void)
|
||||
{
|
||||
HeapBlock *block;
|
||||
int count;
|
||||
|
||||
count = 0;
|
||||
for (block = start.next; block != end_marker; block = block->next)
|
||||
count++;
|
||||
return count;
|
||||
}
|
||||
|
||||
int main(void)
|
||||
{
|
||||
HeapBlock *left;
|
||||
HeapBlock *middle;
|
||||
HeapBlock *right;
|
||||
|
||||
left = (HeapBlock *)&heap_area[0];
|
||||
middle = (HeapBlock *)&heap_area[48];
|
||||
right = (HeapBlock *)&heap_area[96];
|
||||
end_marker = (HeapBlock *)&heap_area[160];
|
||||
|
||||
start.next = left;
|
||||
left->next = right;
|
||||
right->next = end_marker;
|
||||
end_marker->next = 0;
|
||||
|
||||
left->size = 48U;
|
||||
middle->size = 48U;
|
||||
right->size = 64U;
|
||||
end_marker->size = 0U;
|
||||
|
||||
insert_block_merge(middle);
|
||||
|
||||
g_free_count = count_free();
|
||||
g_merged_size = start.next->size;
|
||||
g_merged_with_right = start.next->next == end_marker;
|
||||
|
||||
TRACE_PRINTF("count=%d size=%u merged_right=%d\n",
|
||||
g_free_count, (unsigned)g_merged_size, g_merged_with_right);
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user