1 /* (CC-BY-NC-SA) ROBIN KRENS - ROBIN @ ROBINKRENS.NL
4 * 2019/7/20 - ROBIN KRENS
8 * Simple bitmap on bitband memory implementation for kernel
9 * heap. Sensitive to fragmentation over time. Bitband
10 * memory makes it possible to access each bit of memory
27 #define MEM_VALUE(addr) *((volatile uint32_t *) (addr))
28 #define MEM_ADDR(addr) ((uint32_t *) (addr))
29 #define BITBAND(a, b) ((a & 0xF0000000) + 0x02000000 + ((a &0xFFFFF)<<5) + (b<<2))
30 #define INDEXTOADDR(a) (((a & 0xFFFFF) >> 5) + ((a & 0xFF000000) - 0x02000000))
34 * Divided into chunks (256 bytes)
35 * Each bit will index a chunk
36 * Bits needed: 0x100 (= 4 uint32_t)
39 //uint32_t chunk_index[4];
44 // memset(&chunk_index, 0, sizeof(uint32_t) * 4);
47 // uint32_t *p = MEM_ADDR(0x20000278);
51 // __asm__ __volatile__ ("udiv r1, r3 ,%0" :: "r"(0));
54 // *p = (uint32_t volatile) 0x12345678;
55 // *x = (uint32_t volatile) 0x12345679;
62 // char * new = malloc(10);
64 // char * new2 = malloc(10);
68 //uint32_t * test = MEM_ADDR(0x20000000);
69 //uint32_t random_location = MEM_VALUE(0x20000000);
71 //uint32_t random_location = 0x20000900;
73 //MEM_VALUE(random_location);
74 //MEM_VALUE(BITBAND(random_location, 0)) = 0x1;
76 //addrtohex(MEM_VALUE(random_location));
82 void test_memory(uint32_t * ptr) {
85 for (int i = 0; i < 100; i++) {
94 /* uint32_t fits(uint32_t * current, size_t size) {
96 uint32_t addr_start = current;
98 for (int i = 1; i < size; i++) {
99 current + 4; // next bit offset is 0x4
100 if ((MEM_VALUE(current)) == 0x1)
107 /* void * malloc(size_t size) {
111 extern char * _endofbss;
113 uint32_t start = (uint32_t) &chunk_index[0];
117 uint32_t * index = MEM_ADDR(BITBAND(start, 0));
118 for(int i = 0; i < CHUNKS; i++) {
122 return INDEXTOADDR(((uint32_t)index)) + (i * offset);