1 | #include <avr/io.h> // RAMEND
|
2 | #include "mem-check.h"
|
3 |
|
4 | // Mask to init SRAM and check against
|
5 | #define MASK 0xaa
|
6 |
|
7 | // From linker script
|
8 | extern unsigned char __heap_start;
|
9 |
|
10 | unsigned short
|
11 | get_mem_unused (void)
|
12 | {
|
13 | unsigned short unused = 0;
|
14 | unsigned char *p = &__heap_start;
|
15 |
|
16 | do
|
17 | {
|
18 | if (*p++ != MASK)
|
19 | break;
|
20 |
|
21 | unused++;
|
22 | } while (p <= (unsigned char*) RAMEND);
|
23 |
|
24 | return unused;
|
25 | }
|
26 |
|
27 | /* !!! never call this function !!! */
|
28 | void __attribute__ ((naked, section (".init8")))
|
29 | __init8_mem (void)
|
30 | {
|
31 | __asm volatile (
|
32 | "ldi r30, lo8 (__heap_start)" "\n\t"
|
33 | "ldi r31, hi8 (__heap_start)" "\n\t"
|
34 | "ldi r24, %0" "\n\t"
|
35 | "ldi r25, hi8 (%1)" "\n"
|
36 | "0:" "\n\t"
|
37 | "st Z+, r24" "\n\t"
|
38 | "cpi r30, lo8 (%1)" "\n\t"
|
39 | "cpc r31, r25" "\n\t"
|
40 | "brlo 0b"
|
41 | :
|
42 | : "i" (MASK), "i" (RAMEND+1)
|
43 | );
|
44 | }
|