mikrocontroller.net

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


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
.......
#pragma regalloc-        /* Deaktivierung der automatischen Vergabe von Adressen an Variablen*/
register unsigned char   led_status      @0x0002;
register unsigned char   led_wert        @0x0003;
#pragma regalloc+        /* Aktivierung der automatischen Vergabe von Adressen an Variablen*/
.......

void main(void)
{
//Initialisierung
.......
     putchar(0xAA);                               //Neustart
     putchar(led_status);
     putchar(led_wert);
     i=0;
     while (1)
     {
          #asm("wdr");
          if(rx_counter>0)
          {
               if(i==0)led_status = getchar();
               if(i==1)led_wert   = getchar();
               if(i==2)
               {
                    putchar(led_status);
                    putchar(led_wert);
                    while(1);                     //Watchdogreset
               }
               i++;
               
          }
          
     };
}

Autor: Frank Erdrich (erdi-soft)
Datum:

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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Frank Erdrich (erdi-soft)
Datum:

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

So weit denke ich morgens noch nicht. ;)

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Interrupt Vector Tabelle??

Warum?

Auszug Help-Funktion Codevision
/* disable automatic register allocation */
#pragma regalloc-
/* allocate the variable ‘alfa’ to a register */
register int alfa;
/* allocate the variable ‘beta’ to the register pair R10, R11 */
register int beta @10;

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ohhhhhhhhhh Mann, das war ja einfach.

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

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: manateemoo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.