Forum: Mikrocontroller und Digitale Elektronik Rücksprungadresse geht verloren


von michael (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> und dann bleibt die SW stehen.
Wie erkennst du das?
Welchen Datentyp hat counter?
Schraubt sonst noch jemand am counter rum?
Was ist MAXINDEX?

von Volker Z. (vza)


Lesenswert?

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)?

von michael (Gast)


Lesenswert?

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.

von michael (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> m32c84
Welchen?
Wieviel RAM hat der?

von michael (Gast)


Lesenswert?

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)

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

>  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?

von michael (Gast)


Lesenswert?

: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);

}

von michael (Gast)


Lesenswert?

im .map file ist counter nicht zu finden. In dieser Datei sind nur die 
globalen Variablen und Funktionen usw. abgelegt.

von Volker Z. (vza)


Lesenswert?

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
Noch kein Account? Hier anmelden.