Rücksprungadresse geht verloren

Gast #1512792
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.
#1512812
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)?
Gast #1512883
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.
Gast #1512965
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.
Gast #1513043
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)
Gast #1513140
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);

}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren