www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Rücksprungadresse geht verloren


Autor: michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht 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)?

Autor: michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> m32c84
Welchen?
Wieviel RAM hat der?

Autor: michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);

}

Autor: michael (Gast)
Datum:

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

Autor: Volker Zabe (vza)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.