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
Static sagt nur dem Compiler, dass die Variable nur 1x initialisiert wird. siehe http://de.wikibooks.org/wiki/C-Programmierung:_static_&_Co. Mit SRAM / DRAM hat das nix zu tun
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
Der hat SRAM. Ist aber ziemlich Wayne s. mein vorheriger Post.
>at90can128
Ja, und? static kann der Compiler bei dem auch im RAM.
Du brauchst kein externes SRAM wie du wohl vermutest.
warum geht dann der Kode nicht??
1 | void Hauptsteuerung_Funktion (void) |
2 | {
|
3 | static merker = 10; |
4 | CAN_FRAME frame = {0x10,0x00,0x00,0x12, 0x13,0xFb,0x12,0x43}; |
5 | |
6 | if (CAN_Get_Frame() == frame) |
7 | {
|
8 | merker = merker - 1; |
9 | |
10 | if (merker <= 0) |
11 | {
|
12 | CAN_Werte_Frame_aus(); |
13 | }
|
14 | else
|
15 | {
|
16 | exit(); |
17 | }
|
18 | }
|
19 | else
|
20 | {
|
21 | sleep(1000); // Warte 1 Sekunde |
22 | }
|
23 | |
24 | }
|
>warum geht dann der Kode nicht?? > static merker = 10; Weil merker keinen Typ hat? int,char,long,float,blond
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 ...
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;
Ha! habs gerade probiert und mit static unsigned char merker hängt er sich auf!
wenn ich gewusst hätte, dass es so schwierig ist einen Static Ram zu programmieren hätte ich mir ein thema ohne software gesucht
>habs gerade probiert und mit static unsigned char merker hängt er sich >auf! > exit(); Mach einfach ein return.
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(); ?
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.
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
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...
Der Unterschied zwischen globalen Variablen und "static" ist nur die Sichtbarkeit der Namen. Für die Speicherverwaltung sind sie gleich.
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!
Oje. Für eine Diplomarbeit bei Adam und Eva anzufangen wird hart.
Nochmal: static in c hat überhaupt nichts mit SRAM zu tun!
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!
>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........
>was willst du mir damit sagen???
Das merker sich nicht von alleine wieder auf 10 setzt?
@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... :-)
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
langsam erkenne ich wie nützlich software sein kann... ich muss gestehen, dass ich die CAN inlude datei nicht geschrieben habe... nur den hauptsteuerungsteil.
@Peter warum platzverschwendung? ich hab doch nur 5 globale variablen ?
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.