blob: ae2faef3fca7f952208b7bde88f70a4a880a0cac (
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
|
/**
* @file
*
* @brief Heap handling for uncached RAM
*/
/*
* Copyright (c) 2013 embedded brains GmbH. All rights reserved.
*
* embedded brains GmbH
* Dornierstr. 4
* 82178 Puchheim
* Germany
* <rtems@embedded-brains.de>
*
* The license and distribution terms for this file may be
* found in the file LICENSE in this distribution or at
* http://www.rtems.org/license/LICENSE.
*/
#include <assert.h>
#include <bsp/linker-symbols.h>
#include <bsp/nocache-heap.h>
#include <rtems/score/heapimpl.h>
#include <rtems/score/apimutex.h>
/** @brief Uncached RAM pool
*
* Allocate the whole bsp_nocache for the nocache heap */
static char nocache_pool[1024 * 1024]
__attribute__( ( section( ".bsp_nocache" ) ) );
/** @brief Nocache heap
*
* Heap control for the uncached RAM heap */
static Heap_Control nocache_heap;
/** @brief Init nocache heap
*
* Constructor for the uncached RAM heap
* @returns 0 on succuss, error code from errno.h on failure
*/
void altera_cyclone_v_nocache_init_heap( void )
{
uintptr_t heap_status = 0;
heap_status = _Heap_Initialize(
&nocache_heap,
&nocache_pool[0],
sizeof( nocache_pool ),
0
);
assert( heap_status != 0 );
}
/** @brief Allocate uncached RAM
*
* Allocates RAM from the uncached heap
* @param size Number of bytes to be allocated
* @returns Pointer to the allocated RAM
*/
void *altera_cyclone_v_nocache_malloc( const size_t size )
{
void* ret = NULL;
_RTEMS_Lock_allocator();
ret = _Heap_Allocate( &nocache_heap, size );
_RTEMS_Unlock_allocator();
return ret;
}
/** @brief Free uncached RAM
*
* Releases RAM from the uncached heap
* @param ptr Address of the RAM to be released
*/
void altera_cyclone_v_nocache_free( void *ptr )
{
if ( ptr != NULL ) {
bool ok;
_RTEMS_Lock_allocator();
ok = _Heap_Free( &nocache_heap, ptr );
_RTEMS_Unlock_allocator();
assert( ok );
}
}
|