embkernel
 All Classes Functions Variables Typedefs Groups Pages
RtosHeap.cpp
1 //------------------------------------------------------------------------------
2 //This file is part of embKernel.
3 //See license.txt for the full license governing this code.
4 //------------------------------------------------------------------------------
8 #include "RtosHeap.hpp"
9 #include "new"
10 #include <string.h>
11 
12 //simbols given by linker script
13 extern unsigned long _heap;
14 extern unsigned long _eheap;
15 
16 bool RtosHeap::sIsInitialized = false;
17 uint8_t RtosHeap::sSemaphoreLocation[sizeof(RtosSemaphore)];
18 RtosSemaphore* RtosHeap::sSemaphore;
19 uint8_t RtosHeap::sMemLocation[sizeof(LibDmem)];
20 LibDmem* RtosHeap::sMem;
21 
26 void* RtosHeap::alloc(size_t size) {
27  if (!sIsInitialized) {
28  RtosHeap::sSemaphore = new (sSemaphoreLocation) RtosSemaphore(1, 1);
29  RtosHeap::sMem = new (sMemLocation) LibDmem(&_heap, (uint32_t) &_eheap - (uint32_t) &_heap);
30  sIsInitialized = true;
31  }
32  sSemaphore->take(Rtos::TICK_INFINITE);
33  void* result = sMem->alloc(size);
34  sSemaphore->give(Rtos::TICK_INFINITE);
35  return result;
36 }
37 
42 void RtosHeap::free(void* p) {
43  sSemaphore->take(Rtos::TICK_INFINITE);
44  sMem->free(p);
45  sSemaphore->give(Rtos::TICK_INFINITE);
46 }
47 
53 void* RtosHeap::resize(void* p, size_t size) {
54  sSemaphore->take(Rtos::TICK_INFINITE);
55  void* result = sMem->resize(p, size);
56  sSemaphore->give(Rtos::TICK_INFINITE);
57  return result;
58 }
59 
65 void* RtosHeap::resizeLeft(void* p, size_t left) {
66  sSemaphore->take(Rtos::TICK_INFINITE);
67  void* result = sMem->resizeLeft(p, left);
68  sSemaphore->give(Rtos::TICK_INFINITE);
69  return result;
70 }
71 
77  return sMem->getTotalMemory();
78 }
79 
85  return sMem->getFreeMemory();
86 }
87 
92 unsigned int RtosHeap::getBlockCount() {
93  return sMem->getBlockCount();
94 }