Hallo! Ich verwende den renesas uC mit 16Bit. Es laufen mehrere Timer, DMA, ADCs, DA, welche sich gegenseitig durch Interrupts steuern. Dann starte ich die Signalerfassung, d.h. DMA+ADC+2Timer kommen hinzu und er nimmt das Signal auf und speichert die Werte vom ADC ins Array DataBuffer. Dann werden die Daten invertiert, idealisiert, korrigiert und rufe diesen Codeabschnitt auf. --> while( counter < MAXINDEX ) { // invert data DataBuffer[counter] = 1023 - DataBuffer[counter]; // DC Offset DataBuffer[counter] = DataBuffer[counter] - yDCOffset; // CorrVal DataBuffer[counter] = (((int16_t(DataBuffer[counter])-512)*yCorrVal) + 512; counter++; } Die while schleife wird ein paar mal durchlaufen und dann bleibt die SW stehen. Es kommt aber zu keinen Stackoverflow, da die anderen Timer, DA und DMA voll funktionsfähig weiterarbeiten. Während der uC den oberen Code ausführt kommt es sicherlich zu einigen Interrupts. Kann es sein, dass die Rücksprungaddresse verloren geht.
> und dann bleibt die SW stehen.
Wie erkennst du das?
Welchen Datentyp hat counter?
Schraubt sonst noch jemand am counter rum?
Was ist MAXINDEX?
Software kann nicht "stehenbleiben"! Woher weist du das kein Stackoverflow passiert? Woher weist du das dir Schleife nicht verlassen wird? Die Renesas µC haben nämlich getrennte Stacks für Programm und Interrupts. Wird deine Schleife im Interrupt bearbeitet? Andere Möglichkeiten: - Das Programm wird beendet. -> Die exitfunktion ist eine Endlosschleife. - Du wartest irgentwo auf etwas, das nicht eintritt. - Variablenbereich vom SW-Debugger überschrieben. Bitte mehr Infos ( µC, Compiler, Debugger)?
Datentyp von counter: uint16_t Die Variable counter wird von sonst niemanden angerührt. MAXINDEX: #define MAXINDEX 5000u Wie erkenn ich das?? Ich habe mir auch schon bei jedem Durchlauf counter ausgeben lassen mittels Trace über serielle schnittstelle. Ein paar mal wurde die Schleife durchlaufen und dann ist es aus. SW bleibt stehen. Habe dann in der Tracefunktion ein wait eingearbeitet, dass er solange wartet bis TxReady fertig ist, dh. solange, bis der Trace gesendet wurde. MIT WAIT KOMMT ES ZU KEINEN PROBLEM!!! ist whs ein Zeitproblem oder?? Habe testhalber einen interrupt erstellt, der jede sekunde "Hallo" ausgibt. Dieser Interrupt kommt nach dem Stehenbleiben der SW weiterhin. Daher kein Stackoverflow. Ich kann das board über hyperterminal über serielle steuern. Die Tastaturbefehle werden in der mainloop abgearbeitet. Nach dem Stehenbleiben der SW reagiert er aber NICHT mehr auf meine Tastatureingaben. ->Getrennte Stack für Interrupt und Programm. Hab ich nicht gewusst. Ich kann nur sagen, Interrupt funktionieren weiterhin. Programm bleibt eig. stehen. uC: Renesas m32c84 Compiler: NC308 von Renesas Verwende keinen Debugger. Werde die möglichen Fehlerquellen von Volker Zabe kontrollieren. Hoffe weiterhin auf eure Anteilnahme.
So, habe nun die geposteten möglichen Fehlerquellen gecheckt und habe nichts gefunden. Habe jetzt auch andere Timer verwendet, weil ich gedacht habe, dass sich die Timer untereinander steuern. Leider nicht.
uC: m32c843FJFP laut datasheet: ROM: 512k+4k RAM: 24k Meine Entwicklungsumgebung (HEW von Renesas) berechnete folgenden Speicherverbrauch: DATA 00020141(0004EADH) Byte(s) ROMDATA 00009052(000235CH) Byte(s) CODE 00051552(000C960H) Byte(s)
> Ein paar mal wurde die > Schleife durchlaufen und dann ist es aus. SW bleibt stehen. Sieh mal im Map-File nach, was vor counter platziert ist. Ist davor ein String oder ein Array? Hast du einen amoklaufenden Pointer?
:D :D counter ist eine Variable in einer Unterfunktion. void IdealizeDataBuffer( int16_t yDCOffset , float32_t yCorrVal ) { uint16_t counter = 0; Trace(1u,"Start Idealize DATABUFFER\n"); while( counter < MAXINDEX ) { // invert data DataBuffer[counter] = 1023 - DataBuffer[counter]; // DC Offset DataBuffer[counter] = DataBuffer[counter] - yDCOffset; // CorrVal DataBuffer[counter] = ( ((int16_t)(DataBuffer[counter])-512)*yCorrVal ) + 512; counter++; } Trace(1u,".%d.\n",counter); }
im .map file ist counter nicht zu finden. In dieser Datei sind nur die globalen Variablen und Funktionen usw. abgelegt.
Hast du mit Mapviewer deine Stackgrößen überprüft? Ich glaube es wird Zeit den Debugger anzuwerfen. Alles andere ist ab jetzt Rätzelraten.
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.