mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik STATIC aber leider kein SRAM Was tun?


Autor: Informatik_Gott (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo liebe Forum Gemeinde,

ich hab ein riiiiiiiiiiiiiiiiiesen Problem!

ich muss, aber vorher gleich mal sagen, dass ich Elektrotechnik studiert 
habe bzw. noch dabei bin, also nicht über meine Informatik Kenntnisse 
klagen :-) Ich will ja was dazu lernen..

Ich will ein Programm schreiben, das brauch ich für meine Diplomarbeit.
Und in einer Funktion brauch ich einen Merker, der net "stack" gelöscht 
wird (stack is sowas wie der garbage collector in java, für die wo es 
nicht wissen).

also hab ich mich schlau gemacht, bin ja nicht dumm :-)

und das schlüsselwort ist STATIC !

aber nun habe ich ein problem, wenn ich eine variable als static 
definiere, wird sie vom compiler in den SRAM gelegt... is ja auch 
logisch... SRAM steht ja für STATIC Ram. Der statische RAM muss nicht 
refreshed werden wie der DRAM...

Nun habe ich aber ein Problem, mein System hat keinen SRAM !!!!

Was soll ich tun?? Ich kann jetzt nicht noch schnell nen anderen 
controller bestellen, solang hab ich auch nicht mehr Zeit für die 
diplomarbeit!!

wie kann ich einen merker in den ram legen oder in ein register??

echt scheisse, dass ich in C programmieren muss ...

Vielen Dank!!!

Bitte schnell um Hilfe :-)

hennes

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher Controller?

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So viel Text und doch so wenig Informationen.

Autor: Teplotaxl X. (t3plot4x1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Static sagt nur dem Compiler, dass die Variable nur 1x initialisiert 
wird.
siehe http://de.wikibooks.org/wiki/C-Programmierung:_sta....

Mit SRAM / DRAM hat das nix zu tun

Autor: Informatik_Gott (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Maik Fox (sabuty) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Informatik_Gott wrote:
> at90can128

Das Datenblatt schonmal gelesen? Oder muss das Göttliche das nicht tun?

Wie kommst du darauf, dass der kein SRAM hat? :p

Autor: Teplotaxl X. (t3plot4x1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der hat SRAM.
Ist aber ziemlich Wayne s. mein vorheriger Post.

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>at90can128

Ja, und? static kann der Compiler bei dem auch im RAM.
Du brauchst kein externes SRAM wie du wohl vermutest.

Autor: Informatik_Gott (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
warum geht dann der Kode nicht??

void Hauptsteuerung_Funktion (void)
{
  static merker = 10;
  CAN_FRAME frame = {0x10,0x00,0x00,0x12, 0x13,0xFb,0x12,0x43};

  if (CAN_Get_Frame() == frame)
  {
     merker = merker - 1;

     if (merker <= 0)
     {
        CAN_Werte_Frame_aus();
     }
     else
     {
        exit();
     }
  }
  else
  {
     sleep(1000); // Warte 1 Sekunde
  }

}

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>warum geht dann der Kode nicht??

>  static merker = 10;

Weil merker keinen Typ hat?
int,char,long,float,blond

Autor: Informatik_Gott (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
static ist doch schon ein Typ!

Warum muss ich das doppeln moppeln ?

damit alokiert der Compiler doch schon Speicher.. vermutlich ein Byte 
oder 2 Byte!

das problem muss irgendwo anders sein ...

Autor: Maik Fox (sabuty) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Informatik_Gott wrote:
> static ist doch schon ein Typ!

Nein.

> Warum muss ich das doppeln moppeln ?

Tust du nicht.

> damit alokiert der Compiler doch schon Speicher.. vermutlich ein Byte
> oder 2 Byte!

Nein.

> das problem muss irgendwo anders sein ...

Nein.

Lösung zB: static char merker = 10;

Autor: niemand (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ne is klar....

Autor: Informatik_Gott (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ha!

habs gerade probiert und mit static unsigned char merker hängt er sich 
auf!

Autor: Informatik_Gott (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn ich gewusst hätte, dass es so schwierig ist einen Static Ram zu 
programmieren hätte ich mir ein thema ohne software gesucht

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>habs gerade probiert und mit static unsigned char merker hängt er sich
>auf!

>        exit();

Mach einfach ein return.

Autor: Maik Fox (sabuty) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Informatik_Gott wrote:
> Ha!
>
> habs gerade probiert und mit static unsigned char merker hängt er sich
> auf!

Solange er nicht anfängt zu brennen (hatten wir heute auch schon)...

Was macht exit(); ?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Maik F. wrote:

>> static ist doch schon ein Typ!
> Nein

Trotzdem ist
  static merker = 10;
identisch mit
  static int merker = 10;
weil das "static" ausreicht, um eine Deklaration zu erkennen, und ein 
fehlender Typ immer als "int" angenommen wird. GCC im C99 Modus ist 
immerhin so nett, eine Warnung zu liefern.

Autor: Informatik_Gott (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
alle anderen Variabln die nicht static sind werden doch in den stack 
speicher gelegt, oder?

ganz unten die globalen und oben drauf werden die lokalen gestappelt.. 
die konstanten kommen in den ROM und der SRAM is leer.. bis auf die eine 
variable. eigentlich ne richtige platzverschwendung ??

oder werden die variablen in die 128 k Flash gelegt ???

jetzt bin ich total verwirrt

Autor: Fralla (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
merker? bist wohl SPS verseucht?

Autor: Maik Fox (sabuty) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Informatik_Gott wrote:
> alle anderen Variabln die nicht static sind werden doch in den stack
> speicher gelegt, oder?
>
> ganz unten die globalen und oben drauf werden die lokalen gestappelt..
> die konstanten kommen in den ROM und der SRAM is leer..

Jetzt überleg mal, wo der Stack gespeichert wird...

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Unterschied zwischen globalen Variablen und "static" ist nur die 
Sichtbarkeit der Namen. Für die Speicherverwaltung sind sie gleich.

Autor: Informatik_Gott (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ha, hast dass das ich meinen merker auch global machen kann? also 
einfach unter das include

int merker = 10;

???

dann brauch ich die ganzen lokalen ja gar nicht... mhm, müsste ja auch 
von der zugriffszeit her schneller sein, muss ja nix auf den stack 
geladen werden!

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oje. Für eine Diplomarbeit bei Adam und Eva anzufangen wird hart.

Autor: Teplotaxl X. (t3plot4x1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal: static in c hat überhaupt nichts mit SRAM zu tun!

Autor: Informatik_Gott (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
programmierung war nie meine stärke.. bin eher der Analog Typ :)

aber ich brauch den at90Can128 zur Auswertung von CAN Daten.. wenn 10 
mal der gleiche Frame eintrifft, setze ich einen bestimmten pin low und 
das ist das trigger signal für meine schaltung.

Die schaltung ist eine selbst regulierender Spannungsregler. Wenn die 
Spannung für mehr als 5 sekunden konstant bleibt, resette ich den 
controller und die schaltung ist wieder bereit!

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>aber ich brauch den at90Can128 zur Auswertung von CAN Daten.. wenn 10
>mal der gleiche Frame eintrifft, setze ich einen bestimmten pin low und
>das ist das trigger signal für meine schaltung.

>     merker = merker - 1;
>
>     if (merker <= 0)
>     {
>        CAN_Werte_Frame_aus();

        merker=10;

>     }
>     else........

Autor: Informatik_Gott (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was willst du mir damit sagen???

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>was willst du mir damit sagen???

Das merker sich nicht von alleine wieder auf 10 setzt?

Autor: Informatik_Gott (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Holger..

sau cool! jetzt funktioniert die schaltung ohne timer getriggerten 
Reset!! Hättest du mir das vorher mal gesagt, dann hätte ich mir diese 
scheiss timer schaltung sparen können... :-)

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Informatik_Gott wrote:
> ganz unten die globalen und oben drauf werden die lokalen gestappelt..
> die konstanten kommen in den ROM und der SRAM is leer.. bis auf die eine
> variable. eigentlich ne richtige platzverschwendung ??

Nö, Du bist selber der Platzverschwender, wenn Du auf nem 8-Bitter ohne 
Grund int (16Bit) benutzt.


Peter

Autor: Informatik_Gott (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
langsam erkenne ich wie nützlich software sein kann...

ich muss gestehen, dass ich die CAN inlude datei nicht geschrieben 
habe... nur den hauptsteuerungsteil.

Autor: Informatik_Gott (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter

warum platzverschwendung?

ich hab doch nur 5 globale variablen ?

Autor: Informatik_Gott (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
or:  Teplotaxl X

ok akzeptiert, STATIC hat nix mit SRAM zu tun!
dachte einfach, dass es ja sinn macht eine static variable in den sram 
zu legen, weil sie ja dann refresehed werden muss... und die variablen 
auch im sleep mode erhalten bleiben

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.