1 /* (CC-BY-NC-SA) ROBIN KRENS - ROBIN @ ROBINKRENS.NL
4 * 2019/7/20 - ROBIN KRENS
13 #include <sys/robsys.h>
16 #include <lib/stdio.h>
17 #include <lib/regfunc.h>
20 uint32_t get_msp(void);
24 uint32_t tmp = *MCU_ID;
25 cputs("# ROBSYS 0.1 LOADING...\n");
26 cputs("# DEVICE ID: ");
29 cputs("HIGH DENSITY\n");
35 cputs("# REVISION: ");
38 cputs("REVISION A\n");
41 cputs("REVISION Z\n");
44 cputs("REVISION 1/2/3/X/Y\n");
50 extern char _endofbss;
52 uint32_t current_stack = get_msp();
53 uint32_t stack_usage = (SRAM_OFFSET + SRAM_SIZE) - current_stack;
54 uint32_t data_bss = &_endofbss - SRAM_OFFSET;
55 uint32_t mem_free = SRAM_SIZE - stack_usage - data_bss;
57 cputs("# TOTAL MEMORY: ");
58 cputs(regtohex(SRAM_SIZE));
60 cputs("# FREE MEMORY: ");
61 cputs(regtohex(mem_free));
63 cputs("# STACK USAGE: ");
64 cputs(regtohex(stack_usage));
69 /* Get the master stack pointer's position
70 * Here we use a so-called naked function,
71 * that doesn't automatically push and pop */
73 uint32_t get_msp(void) __attribute__( ( naked ) );
74 uint32_t get_msp(void)
77 __asm__ volatile ("mrs %0, msp\n\t"
79 "bx lr \n\t" : "=r" (msp) );