blob: 9ad4ca51ee9007ae90461e9352df0e05222ca615 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
/*
* Heap Handler
*
* COPYRIGHT (c) 1989-1999.
* On-Line Applications Research Corporation (OAR).
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.OARcorp.com/rtems/license.html.
*
* $Id$
*/
#include <rtems/system.h>
#include <rtems/score/sysstate.h>
#include <rtems/score/heap.h>
/*PAGE
*
* _Heap_Initialize
*
* This kernel routine initializes a heap.
*
* Input parameters:
* the_heap - pointer to heap header
* starting_address - starting address of heap
* size - size of heap
* page_size - allocatable unit of memory
*
* Output parameters:
* returns - maximum memory available if RTEMS_SUCCESSFUL
* 0 - otherwise
*
* This is what a heap looks like in memory immediately
* after initialization:
*
* +--------------------------------+
* 0 | size = 0 | status = used | a.k.a. dummy back flag
* +--------------------------------+
* 4 | size = size-8 | status = free | a.k.a. front flag
* +--------------------------------+
* 8 | next = PERM HEAP_TAIL |
* +--------------------------------+
* 12 | previous = PERM HEAP_HEAD |
* +--------------------------------+
* | |
* | memory available |
* | for allocation |
* | |
* +--------------------------------+
* size - 8 | size = size-8 | status = free | a.k.a. back flag
* +--------------------------------+
* size - 4 | size = 0 | status = used | a.k.a. dummy front flag
* +--------------------------------+
*/
unsigned32 _Heap_Initialize(
Heap_Control *the_heap,
void *starting_address,
unsigned32 size,
unsigned32 page_size
)
{
Heap_Block *the_block;
unsigned32 the_size;
if ( !_Heap_Is_page_size_valid( page_size ) ||
(size < HEAP_MINIMUM_SIZE) )
return 0;
the_heap->page_size = page_size;
the_size = size - HEAP_OVERHEAD;
the_block = (Heap_Block *) starting_address;
the_block->back_flag = HEAP_DUMMY_FLAG;
the_block->front_flag = the_size;
the_block->next = _Heap_Tail( the_heap );
the_block->previous = _Heap_Head( the_heap );
the_heap->start = the_block;
the_heap->first = the_block;
the_heap->permanent_null = NULL;
the_heap->last = the_block;
the_block = _Heap_Next_block( the_block );
the_block->back_flag = the_size;
the_block->front_flag = HEAP_DUMMY_FLAG;
the_heap->final = the_block;
return ( the_size - HEAP_BLOCK_USED_OVERHEAD );
}
|