Forum: Mikrocontroller und Digitale Elektronik zu wenig RAM ?


von gast666 (Gast)


Lesenswert?

Hallo,

Was bedeutet es wenn ich die selbe Meldung in äuserst kurzen Abständen 
immer wieder auf dem Terminal Programm zu lesen bekomme? Es scheint, 
dass das Programm stecken bleibt! (Schleife ist sicher nicht schuld)

das Programm hat schon funktioniert. Als ich noch eine Erweiterung 
schreiben wollte, trat plötzlich das Problem auf! Jezt hab ich diese 
wierder rückgängig gemacht, fehler ist immer noch, da hab ich vllt. was 
übersehen.

kann es sein, dass der RAM voll ist? könnte sein. Wie kann ich das 
kontrollieren?

mfg
J.K

von Christian R. (supachris)


Lesenswert?

Springt eventuell der Watchdog-Timer an? Zu wenig RAM müsste ja dein 
Kompiler anmeckern.

von gast666 (Gast)


Lesenswert?

Kompiler hab ich AVR Studio mit GCC Plug in.

mir ist nichts aufgefallen, dass dieser meckert, wo würde das stehen?

Watchdog ist nicht aktiviert!

von Christian R. (supachris)


Lesenswert?

Keine Ahnung, wo das steht, ich arbeite nicht mit AVRs, beim MSP430 GCC 
kann man das ausgeben lassen mit msp430-ram-usage oder msp430-size. ich 
denke mal die Befehle wirds beim AVR-GCC auch geben?

von gast666 (Gast)


Lesenswert?

vllt.

nur hab ich keine konsole wo ich das eingeben kann?!

von Ja mann (Gast)


Lesenswert?

>Was bedeutet es wenn ich die selbe Meldung in äuserst kurzen Abständen
>immer wieder auf dem Terminal Programm zu lesen bekomme? Es scheint,
>dass das Programm stecken bleibt!

Langsam, da blickt ja kein Mensch durch:
Was für ein "Terminalprogramm", wo läuft es ? Was genau ist "Dein 
Programm" ? läuft es auf einem µC (welcher ?)
Wenn du eine "Meldung" "auf" dem Terminalprogramm siehst wird es ja von 
irgendetwas anderem gesendet ?

Fast genauso gut hättest du schreiben können "Mein Auto springt nicht 
mehr an, woran liegt das ?", das hätte ähnlich viele Antworten 
zugelassen...

von gast666 (Gast)


Lesenswert?

sry,

Programm läuft auf nem mega16. Diese sendet über USART Meldungen.

Terminalprogramm läuft auf PC (selbstgeschrieben).

an Terminalprogramm liegt es nicht

Schleife ist wie gesagt auch keine vorhanden.


Dh. der µC sendet in kurzen Abständen (quasi dauernd) die selbe Meldung 
und bleibt stecken.

von lkmiller (Gast)


Lesenswert?

>Was bedeutet es wenn ich die selbe Meldung in äuserst kurzen Abständen
>immer wieder auf dem Terminal Programm zu lesen bekomme?
Das bedeutet erst mal, dass irgendetwas die selbe Meldung in kurzen 
zeitlichen Abständen über die serielle Schnittstelle schickt.

Mehr kann man auf deine Fehlerbeschreibung nicht gesichert sagen.

Meine Vermutung: amoklaufender Pointer, der dir den Stack zerschiesst.

von gast666 (Gast)


Lesenswert?

Die Meldung soll auch 1x gesendet werden, aber nur 1x.

Kann das passieren wenn der Stack voll ist?
Kann man das irgendwie testen.

Vllt. interessant:

Programm beschreibt ne SD-Karte.

Wenn ich File erstellen möchte hängt er.

ich weiß, das das mit nem mega16 Speichermäsig sehr knapp ist. Jedoch 
hat es schon funktioniert. Ich habe schon Messwerte aufgenommen und in 
File gespeichert.

Jetzt hängt er schon bei Fileerstellung. (fopen_)

SD-Funktionen sind von mikro-control.de
und low-level von Ulrich Radig

von Matthias L. (Gast)


Lesenswert?

Ganz einfach:

Aufgrund der exakten Fehlermeldung, die genau dieses eine 
Terminalprogramm anzeigt, und nachdem ich mir dein gepostetes Programm 
angesehen habe, kann der Fehler nur in Zeile 42 liegen.

Man Man Man...

von Ja mann (Gast)


Lesenswert?

Klingt so als ob Dein µC dauernd einen Reset macht sobald er in die 
Funktion läuft. Bau Dir UART-Debugmeldungen an geeigneter Stelle ein 
damit du exakt weißt wo es genau scheppert.

von Ja mann (Gast)


Lesenswert?

P.S.: Die Meldung "zu wenig RAM" fällt ja auch nicht vom Himmel, sondern 
steckt irgendwo in Deinem Programm, also ist mit den von Dir gegebenen 
Informationen für uns hier wieder nur Rätselraten möglich. Schau in Dein 
Programm wo die Meldung erzeugt wird und welche Bedingungen erfüllt sei 
müssen dass selbige ausgegeben wird.

von gast666 (Gast)


Angehängte Dateien:

Lesenswert?

Am Terminalprogramm steht keine Fehlermeldung.

Es steht (stand) nur
FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT 
OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT 
OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT 
OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT OK!FAT 
OK! ...

jetzt schreibt er nur mehr FAT OK!

und bleibt in

myfile = fopen_("abcdef.txt",'a');

stecken.
1
File * fopen_(s8 *fname, s8 mode)
2
{
3
  File *file;
4
  
5
  file = ReserveFilePointer();                          // reserve a filepointer.  
6
  
7
  if(file != NULL)                                // A free filepointer was found.
8
  {
9
    file->mode   = mode;                              // mode of fileoperation (read,write)
10
11
    if(SeekFileInDirectory(fname, file))                    // if file was found
12
    {
13
      if(mode == 'a')                              // open existing file for writing (append data at the end of the file)
14
      {  
15
        fseek_(file, 0, SEEK_END);                      // fseek points to the end of the file
16
      }
17
    }    
18
    else
19
    {
20
      if((mode == 'a') || (mode == 'w'))                    // specified file doesn't exist so create new file for writing data.
21
      {  
22
        if(CreateFileInDirectory(fname,file))                // Could an entry for the new file in the rootdirectory be created?
23
        {
24
          return(file);
25
        }  
26
        else
27
        {
28
          FreeFilePointer(file);                        // free the filepointer.
29
          file = NULL;
30
        }
31
      }
32
            else                                                                    // file with mode 'r' not found
33
            {
34
              FreeFilePointer(file);                        // free the filepointer.
35
                file = NULL;                                                        // file not found
36
            }
37
    }
38
  }
39
  return(file);
40
}

von gast666 (Gast)


Lesenswert?

jetzt hab ich das file vorher mit cardreader auf karte erstellt

jetzt schluckt er es!

komisch, vorher musst das nicht sein.

CreateFileInDirectory(...)

muss also fehlerhaft sein!

danke für eure geduld!

Gibt es jetzt eine Möglichkeit den Ramverbrauch zu ermitteln?

von holger (Gast)


Lesenswert?

> uart_puts("** Keine MMC/SD Karte gefunden!! **\n");

Solche Meldungen sind wunderbar geeignet RAM zu verschwenden.
37 Bytes gehen nur für diese eine Zeile drauf. Bau dir mal
ne uart_puts_P() die Text aus dem Flash ausgibt.

von gast666 (Gast)


Lesenswert?

OK, es liegt wohl an SD-Card

momentan lässt sich nicht mal mehr per PC ein File drauf erstellen...

von gast666 (Gast)


Lesenswert?

die Karte lässt sich nicht mal mehr formatieren!

hab ich die Karte geschossen?

das file, das sich drauf befindet lässt sich noch bearbeiten und 
speichern, der rest geht nicht mehr!

kann ich die Karte noch retten?

von holger (Gast)


Lesenswert?

Data:        943 bytes (92.1% Full)
(.data + .bss + .noinit)

Ich glaube nicht das du mit 81 Bytes Stack auskommst ;)

von odic (Gast)


Lesenswert?

> Gibt es jetzt eine Möglichkeit den Ramverbrauch zu ermitteln?

Die Belegung des RAM durch data und bss findest du im MAP-file. Wenn ich 
mal davon ausgehe, daß du keine dynamische Speicherverwaltung hast, 
bleibt noch der Stack.

Da der Stackverbrauch vom Programmablauf und den beteiligten Funktionen 
abhängt, ist eine statische Codeanalyse hierfür ungeeignet. Eine 
statische Analyse ist zwar sinnvoll um den Bedarf einer einzigen 
Funktion zu ermitteln, sagt aber nichts über die Summe der Belegung 
durch alle Instanzen im worst-case aus. Das ist aber genau, was dich 
interessiert.
Daher mußt du denjenigen Programmablauf ermitteln, welcher die für den 
Stack ungünstigste Kombination an Instanzen irgendwelcher Funktionen 
hervorbringt. Wenn du diese Kombination herausgefunden (oder in der 
Praxis bei komplexeren Programmen wohl eher abgeschätzt) hast, kannst du 
dir den Gesamtverbrauch ausrechnen. Da mir persönlich diese Rechnerei 
allerdings zu aufwendig bzw. zu fehleranfällig ist würde ich folgendes 
empfehlen:

1.) Programm ganz zu Beginn der Ausführung anhalten
2.) den gesamten Stack (soweit er noch nicht verwendet wurde) mittels 
Debugger mit einem Füllpattern initialisieren (Vorsicht: wirklich nur 
den Stack und nicht irgendwelche globale Variable überschreiben, ein 
Blick ins MAP-file sollte hier helfen)
3.) Programm im worst-case ausführen und am Ende anhalten
4.) Speicher auslesen und interpretieren (Vorsicht bei irgendwelchen 
größeren Arrays auf dem Stack. Manchmal hat man das Gefühl das Ende 
gefunden zu haben, dabei ist es nur eine "Lücke" die nicht verändert 
wurde. Aus diesem Grund sollte man sich auch nie auf's Byte genau auf 
das Ergebnis verlassen.)

Das ganze funktioniert natürlich nur bei einem korrekten Programmablauf 
und nicht, wenn der Stack bereits irgendwo überläuft. Auch sollte das 
Ergebnis nur ein grober Anhaltspunkt sein der so gut ist, wie die 
vorherige Abschätzung des Programmablaufs. Dynamische Codeanalyse ist 
nunmal ein schwammiges Gebiet und zudem sollte der RAM auch nie in dem 
Maße verplant werden, wie man das beim Flash tut. Wenn mein Programm zu 
99% den Flash füllt.... schön, es hat noch rein gepaßt. Wenn ich vermute 
daß mein Programm 90% des RAM benötigt würde ich persönlich mich (je 
nach Komplexität der Anwendung) nicht mehr wirklich wohl fühlen.

Viel Erfolg beim Messen,

odic

von gast666 (Gast)


Lesenswert?

Hallo,

ich hab jetzt die sinnlosen uart ausgaben minimiert, bin jetzt auf ca 85 
% RAM (ok, 15%frei ist nicht die Welt).

Das Programm funktioniert auch soweit auch wieder, ich bemerke nichts 
das Stack überläuft

Hab mir auch ne neue SD-Karte besorgt.

Komisch ist, dass ich auch auf dieser dieser keine Dateien mit dem µC 
erstellen kann. Mit dem PC gehts aber.

Ich kann aber Dateinen öffnen (auch zum hinzuschreiben). Das neu 
hinzugeschriebenen wird aber nicht gespeichert, wenn ich das File wieder 
schließe. An was könnte das liegen?

von holger (Gast)


Lesenswert?

>ich hab jetzt die sinnlosen uart ausgaben minimiert, bin jetzt auf ca 85
>% RAM (ok, 15%frei ist nicht die Welt).

Du kannst noch mehr RAM freimachen!
Füg mal dieses #include ein:

#include <avr/pgmspace.h>

Statt sprintf() nimmst du dann sprintf_P()

  sprintf_P(zeit,PSTR("%2i.%2i.%2i %2i:%2i:%2i\t"),y,m,d,h,min,sek);

Texte dann mit PSTR("text") umgeben.

von gast666 (Gast)


Lesenswert?

thx

mit sprintf_P und uart_P bin ich jetzt auf 77% RAM auslastung.

ich glaub jetzt kann ich wieder beruhigt schlafen ^^

mein Probem ist, wie gesagt, dass das Schreiben mit der Karte nicht mehr 
geht.

Kann es sein, das die Liberys nicht mehr als 128MB verwalten können?

Auf Ulrich Radigs HomePage steht, dass er es mit 3 verschiedenen Karten 
mit 128MB getestet hat. Meine "neue" hat 256MB. Platz brauch ich <1MB 
schätz ich.

von gast666 (Gast)


Lesenswert?

So jetzt hab ich das Problem wieder O.o

Ich hab jetzt das SD Programm von Ulrich Radig in seiner Grundform 
nochmal gestartet.
http://www.ulrichradig.de/home/index.php/avr/mmc-sd

über RS232 wird gesendet:
Karte gefunden!! System Ready!
Karte gefunden!! System Ready!
Karte gefunden!! System Ready!
Karte gefunden!! System Ready!
Karte gefunden!! System Ready!
...

das deutet wahrscheinlich darauf hin, dass stack zerschosse wurde?!

Im AVR Studio hab ich nur geringe ram auslastung:
(45 bytes, 4,4%) was eigentlich aber nicht sein kann, wenn schon 
folgende zeile vorkommt:

unsigned char Buffer[512];

??

mfg
J.K

von gast666 (Gast)


Lesenswert?

ich hab jetzt den Buffer reduziert (212) und noch mal gestartet.

Hat soweit funktioniert. Ausgegeben wurde:

System Ready!

Karte gefunden!!


MBR Signatur found!



VBR Signatur found!

0 36 0 32 17 59 81 e3 36 db 7f 81 96 40 0 5

Directory

Cluster = 2036 DirA = 4e FileName = ›Œ



Directory Ende

FERTIG!!


sieht meiner Meinung nach ganz gut aus oder?

Außer: was bedeutet das Directory?
>Cluster = 2036 DirA = 4e FileName = ›Œ

sollte da die Ordnerstrucktur angezeigt werden?

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.