mem-check.c


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
}