RAM-Wert nach SW-Reset

Gast #1399985
Lesenswert?

Hallo,

seit heute morgen versuche ich vergebens Werte im RAM abzulegen die auch 
nach einem Reset noch vorhanden sind.
Weiß jemand rat, denn in Büchern fand ich die Information, dass ein 
Reset keine Auswirkung auf den Ram hat, nur ein Spannungsverlust.

MC: ATmega16
IDE: Codevision

Testprogramm:
1
.......
2
#pragma regalloc-        /* Deaktivierung der automatischen Vergabe von Adressen an Variablen*/
3
register unsigned char   led_status      @0x0002;
4
register unsigned char   led_wert        @0x0003;
5
#pragma regalloc+        /* Aktivierung der automatischen Vergabe von Adressen an Variablen*/
6
.......
7

8
void main(void)
9
{
10
//Initialisierung
11
.......
12
     putchar(0xAA);                               //Neustart
13
     putchar(led_status);
14
     putchar(led_wert);
15
     i=0;
16
     while (1)
17
     {
18
          #asm("wdr");
19
          if(rx_counter>0)
20
          {
21
               if(i==0)led_status = getchar();
22
               if(i==1)led_wert   = getchar();
23
               if(i==2)
24
               {
25
                    putchar(led_status);
26
                    putchar(led_wert);
27
                    while(1);                     //Watchdogreset
28
               }
29
               i++;
30
               
31
          }
32
          
33
     };
34
}
Moderator Persönliche Seite #1399995
Lesenswert?

Frank Erdrich schrieb:

> Hübsch. Du legst dir die Variablen direkt in die Interrupt Vector
> Tabelle.

Du weißt aber, was eine Harvard-Architektur ist? ;-)

Aber in einem Punkt hast du Recht: er legt sie sich direkt in zwei
CPU-Register...

Ansonsten werden bei C vor dem Start von main() gemäß dem C-Standard
alle globalen Variablen initialisiert.  Daniel, du musst mal ins Manual
deines Compilers gucken, ob man das für einen Teil der Variablen
abschalten kann.  Beim AVR-GCC wäre das der Fall, indem man die
Variablen in der Section .noinit unterbringt.

Vergiss aber nicht, beim regulären Programmstart dann sinnvolle
Werte zuzuweisen.
#1399996
Lesenswert?

Frank Erdrich schrieb:

> Hübsch. Du legst dir die Variablen direkt in die Interrupt Vector
> Tabelle.

Ich habe zwar keine spezielle Ahnung von CV, aber ich denke mal, dass 
ohne entsprechende Kennzeichnung eine Datenadresse gemeint ist, keine 
Codeaddresse. Und da sitzen bei AVRs die Schattenadressen der Register, 
nicht die Vektoren. Was wohl auch beabsichtigt war. Könnte aber sein, 
dass er damit dem Compiler in die Suppe spuckt.
Gast #1400000
Lesenswert?

Interrupt Vector Tabelle??

Warum?

Auszug Help-Funktion Codevision
1
/* disable automatic register allocation */
2
#pragma regalloc-
3
/* allocate the variable ‘alfa’ to a register */
4
register int alfa;
5
/* allocate the variable ‘beta’ to the register pair R10, R11 */
6
register int beta @10;
Gast #1400023
Lesenswert?

Ohhhhhhhhhh Mann, das war ja einfach.

Wer lesen kann ist klar im Vorteil(sag ich sonst zu anderen;-)
1
Program variables can be global (accessible to all the functions in the program) or local (accessible only inside the function they are declared).
2
If not specifically initialized, the global variables are automatically set to 0 at program startup.
3
The local variables are not automatically initialized on function call.
Gast #1400347
Lesenswert?

Ich kenne deine Entwicklungsumgebung nicht darum beschreibe ich es 
allgemein.

Du kannst sicher in den Linker Einstellungen festlegen wo und wie gross 
dein RAM ist. Mache diese Etwas kleiner als dein reelles RAM, somit wird 
der Rest nicht von den C Startup  Routinen auf 0 gesetzt. Jetzt hast du 
einen „freien“ ram bereich, den du allerdings selber verwalten musst.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren