Rücksprungadresse geht verloren

Gast #1512792
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.
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
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
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
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
: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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.