5 #include <sys/robsys.h>
9 #include <lib/regfunc.h>
11 #define MEM_SIZE 0x00010000
12 #define MEM_OFFSET 0x20000000
14 uint32_t get_msp(void);
18 uint32_t tmp = *MCU_ID;
19 cputs("# ROBSYS 0.1 LOADING...\n");
20 cputs("# DEVICE ID: ");
23 cputs("HIGH DENSITY\n");
29 cputs("# REVISION: ");
32 cputs("REVISION A\n");
35 cputs("REVISION Z\n");
38 cputs("REVISION 1/2/3/X/Y\n");
44 extern char _endofbss;
46 uint32_t current_stack = get_msp();
47 uint32_t stack_usage = (MEM_OFFSET + MEM_SIZE) - current_stack;
48 uint32_t data_bss = &_endofbss - MEM_OFFSET;
49 uint32_t mem_free = MEM_SIZE - stack_usage - data_bss;
51 cputs("# TOTAL MEMORY: ");
52 cputs(regtohex(MEM_SIZE));
54 cputs("# FREE MEMORY: ");
55 cputs(regtohex(mem_free));
57 cputs("# STACK USAGE: ");
58 cputs(regtohex(stack_usage));
63 /* Get the master stack pointer's position
64 * Here we use a so-called naked function,
65 * that doesn't automatically push and pop */
67 uint32_t get_msp(void) __attribute__( ( naked ) );
68 uint32_t get_msp(void)
71 __asm__ volatile ("mrs %0, msp\n\t"
73 "bx lr \n\t" : "=r" (msp) );