Forum: Mikrocontroller und Digitale Elektronik RAM-Wert nach SW-Reset


von Daniel (Gast)


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
}

von Frank E. (erdi-soft)


Lesenswert?

Hübsch. Du legst dir die Variablen direkt in die Interrupt Vector 
Tabelle.
EEPROM wäre hier besser geeignet.

von (prx) A. K. (prx)


Lesenswert?

Reset hat zwar keine Auswirkung auf das RAM, aber auf den 
Programmablauf. Und die C Runtime initialisiert die Daten neu. Ob bzw. 
wie sich das verhindern lässt hängt vom Compiler ab - beim GCC ist es 
einfach.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von (prx) A. K. (prx)


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.

von Frank E. (erdi-soft)


Lesenswert?

Jörg Wunsch schrieb:
>
> Du weißt aber, was eine Harvard-Architektur ist? ;-)

So weit denke ich morgens noch nicht. ;)

von Daniel (Gast)


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;

von Daniel (Gast)


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.

von Daniel (Gast)


Lesenswert?

Funktioniert zwar, ist aber doch nicht ganz zufriedendstellend.

Lieber wäre es mir wenn ich die Variablen Global habe und diese auch 
fest an einer bestimmten Adresse im RAM liegen.

von manateemoo (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.