ich habe hier einen ganz seltsamen Effekt mit Arduino (ich weiß, den
ganzen Sketch zeigen), aber das ist so strange vielleicht kennt das
jemand
der Codeausschnitt:
Serial.print( menue[midx].text );
if ( entry.isDirectory() )
{
Serial.println("+");
Serial.println("/");
Serial.println("-");
im Serial-Monitor erfolgt dann bei 3 Aufrufen als Ausgabe:
das erste Mal richtig:
DCIM+
/
-
Dann fehlt der /
100MEDIA/
listDir 1
100MEDIA+
-
und bei 3.Mal + anstatt /
DCIM+
+
-
und wenn ich anstatt / z.B. ? ausgebe, funktioniert alles wie gewünscht.
Warum geht das mit / nicht?
Hä? Wie 3 Mal aufrufen? 3 x Reset? Im loop() 3 x aufrufen? Kannst mal ganz genau schreiben, was zurückkommt, am Besten mit [code]! Danke und Gruss Chregu
das Ganze ist in einem Programm um in einem Verzeichnis einer SD-Card
rum zu navigieren. Wenn ich das mache wird der gezeigte Programmteil
aufgerufen und macht eben diese Ausgaben.
Ich habe jetzt mal statt des Serialmonitors von Arduino ein
Terminalprogramm verwendet, es kommt die gleiche Ausgabe.
Hier die 2. Ausgabe bei der das / fehlt als Hexcode:
0D 0A 31 30 30 4D 45 44 49 41 2B 0D 0A 0D 0A 2D 0D 0A
oder noch Mal als ASCII
100MEDIA+
-
Dann habe ich die 3x println zusammengezogen, slso
Serial.println("+/-");
Funktioniert!
Ich schiebe es jetzt Mal auf einen Fehler in der Lib,
dann wird halt kein / verwendet!
es muss was mit Strings zu tun haben:
strcat( menue[midx].text, "/");
Funktioniert auch oft nicht (es wird nichts angehängt)
strcat( menue[midx].text, "/ ");
oder
strcat( menue[midx].text, "+");
funktioniert
Und Du bist Dir ganz, ganz sicher, daß das auch der Quelltext ist, den Du verwendest, und nicht etwas, an das Du Dich erinnerst und hier wieder neu eintippst? Lad' mal Dein .ino-File hier hoch. Irgendwie kommt mir das merkwürdig vor.
nee, wirklich kopiert. Den Quelltext im jetzigen Bau-Zustand traue ich mich nicht der Meute vorzuwerfen. Ich versuche es noch etwas einzugrenzen, wird aber heute nichts mehr und morgen nicht gleich :-(
wenn ich darüber nachdenke kann doch nur sein dass irgendwo der String "/" zerschossen wird, und das wäre übel in der Arduino-IDE ohne Debugger da das Programm inzwischen ein bißchen mehr als "Hello world" macht. Werden eigentlich zwei gleiche konstante Strings vom Compiler übereinander gelegt, das Verhalten deutet darauf hin.
Ich bin mir recht sicher, dass du an der falschen Stelle suchst..... Meine Glaskugel sagt: 1. Heap - Stack Kollision 2. Zeiger, welche in die Wiese zeigen 3. Arrayüberschreitung Also: Unbeabsichtigtes Überschreiben von unschuldigen Speicherbereichen.
scheinbar liegt es an der Programmgröße dass es nicht geht
mit
void loop()
{
doInput();
//doMenu();
}
ist die Programmgröße
Binary sketch size 19,270 bytes (of a 30,720 byte maximum)
und die Ausgabe im setup ist alles ok
mit
void loop()
{
doInput();
if ( lastmillis<0 ) // Bedingung ist nie erfuellt
doMenu();
}
ist die Programmgröße
Binary sketch size 21,754 bytes (of a 30,720 byte maximum)
und bei der Ausgabe im setup kommt schon Käse.
Ist das Programm schon zu groß? Es ist ein pro Mini mit mega328
Werner schrieb: > Ist das Programm schon zu groß? Nein! Steht doch in der Meldung! Zeige doch mal den RAM Verbrauch, der ist viel interessanter. Werner schrieb: > scheinbar liegt es an der Programmgröße dass es nicht geht Es gilt weiterhin: > Ich bin mir recht sicher, dass du an der falschen Stelle suchst...
funktioniert:
text data bss dec hex filename
18764 536 924 20224 4f00 CNC.cpp.elf
funktioniert nicht
text data bss dec hex filename
21208 536 958 22702 58ae CNC.cpp.elf
da ist ja auch noch 1k für Stack frei.
Ich selbst brauche bis zum Auftauchen des Fehlers gar keinen Stack.
Aufgerufen werden nur Librarys (TFT und SD), siehe setup an dessen Ende
printdirectory aus dem arduino Beispiel aufgerufen wird. Das ist zwar
recursiv, aber es gibt auf der SD Card nur einen Ordner der einen Ordner
enthält und eine Datei, Rekursionstiefe also 3.
Und das funktioniert ja auch wenn das Programm nicht zu groß wird.
Mein Programm verbraucht relativ wenig Flash und RAM, viel braucht die
SD-Library, gibt es da was kleineres?
void setup(void)
{
Serial.begin(9600);
lastmillis = millis();
Serial.println("mini is running ...");
tft.initR(INITR_BLACKTAB); // ST7735-Chip initialisieren
tft.setFont(font5x7);
tft.fillScreen(ST7735_BLACK);
tft.setTextSize(2);
tft.setTextWrap(false);
tft.setTextColor(ST7735_WHITE, ST7735_BLACK);
tft.setCursor(0, 4);
tft.println("Hallo Welt");
pinMode(blLCD, OUTPUT);
digitalWrite(blLCD, HIGH);
tft.println("Init. SDC");
Serial.print("Initializing SD card...");
pinMode(csSD, OUTPUT);
if ( !SD.begin(csSD) )
{
tft.println("failed!");
Serial.println("initialization failed!");
}
else
{
tft.println("done.");
Serial.println("initialization done.");
dirs[0] = SD.open("/");
printDirectory(dirs[0], 0);
}
}
ich habe mir noch Mal den größmöglichen Block mit malloc geben lassen, das sind 417 bzw. 383 Byte Wie ist das denn alles angeordnet oder wie finde ich raus wo Variablen und der Stack und Heap liegen
Werner schrieb: > Wie ist das denn alles angeordnet oder wie finde ich raus wo Variablen > und der Stack und Heap liegen Das Stichwort dürfte "map file" lauten. Das sollte auch Dein Compiler ausgeben können.
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.