[BUG REPORT] Append stört Serport

  • 1
  • 2
  • 3
  • Page 1 of 3
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

[BUG REPORT] Append stört Serport

 · 
Posted: 09.12.2015 - 09:53  ·  #1
Hallo AVRCO

Fehlerbeschreibung:
Es treten Empfangsfehler bei UART auf, wenn die Funktion Append verwendet wird.
Der Fehler tritt nur auf, wenn der erste Parameter von Append vom Typ char ist.
Wenn der Fehler auftritt, dann wurde ein falsches Zeichen empfangen.
Das falsch empfangene Zeichen ist nicht zufällig. Es hat den Wert vom Vorgängerzeichen.
Diese Erkenntnis nutzt das Demoprogramm aus, um fehlerhafte Zeichen zu erkennen.

Workaround:
Existiert. Append nicht verwenden oder den ersten Parameter nicht als char übergeben.

Hardware:
Atmega32 mit 8 MHz Crystal, 5V, Fuses: SPIEN + CKOPT + BODLEVEL + BODEN
PC mit Terminal Programm Hterm, ST232 an RX0 und TX0

Vorgang:
Hterm sendet alle 100ms '{123456789abcdefghijklmnopqrstuvwxyz}' zum atmega
Wenn ein fehlerhaftes Zeichen empfangen wurde, sendet atmega 'Error' zurück.

Hinweis:
Wir haben im Interrupt RXRDY den Registerinhalt von UDR über SPI ausgegeben.
Im Fehlerfall war schon der Registerinhalt falsch.

Code

program dlw04;

Device = mega32, VCC = 5;

Import SerPort;

Define
  ProcClock      = 8000000;        {Hertz}
  StackSize      = $200, iData;
  FrameSize      = $200, iData;
  SerPort        = 19200, Stop1;    {Baud, StopBits|Parity}
  RxBuffer       = 128, iData;
  TxBuffer       = 128, iData;

Implementation

{$IDATA}

var
  previousByte     : char;
  PCstr            : string[100];
  charIn           : Char;
  charX            : char;

begin
  EnableInts;
  Writeln(Serout, 'Reset');

  loop
  
      // store received bytes
      if Serstat then
        charIn := Serinp;  // Daten auf puffer lesen
        if ( charIn = previousByte ) then
          Write(Serout, 'Error');
        endif;
        previousByte := charIn;
      endif;

      PCstr := '';
      Append(charX, PCstr);
    
  endloop;

end dlw04.
Attachments
htermAppend
Filename: htermAppend.png
Filesize: 37.67 KB
Title: htermAppend
Download counter: 153
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: [BUG REPORT] Append stört Serport

 · 
Posted: 09.12.2015 - 13:50  ·  #2
Hallo Thomas,

append erwartet 2 Strings!
Warum nicht so:
Code
st:= st+char;


rolf
Attachments
[BUG REPORT] Append stört Serport
Filename: Append.jpg
Filesize: 27.08 KB
Title:
Download counter: 135
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: [BUG REPORT] Append stört Serport

 · 
Posted: 09.12.2015 - 15:02  ·  #3
Hallo Rolf,

können die Empfangsfehler damit erklärt werden?

Bei Append(charX, PCstr) wird vor dem Unterprogrammaufruf der Inhalt von charX in das Register R23 und der Wert 1 in das Register R22 geschrieben.
R22/R23 stellen somit einen string der Länge 1 dar.
Der Funktion Append scheint das nicht zu stören, das Ergebnis ist korrekt.
Das und topic.php?t=3087&page=fst_unread&highlight=append wagen einem zu glauben, dass der Parametertyp char erlaubt ist.

Vielleicht entsteht der Fehler beim UART-Empfang durch ganz andere Phänomene.
Das möchte ich unbedingt, auch in Eurem Interesse, ausschließen.

Gruß
Thomas
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: [BUG REPORT] Append stört Serport

 · 
Posted: 09.12.2015 - 16:12  ·  #4
Hallo Thomas,

ich habe das Programm im SIM laufen lassen und keine Probleme.
Allerdings ist mir diese Zeile unklar:

Append(charX, PCstr);

charX wird ja niemals geändert und ist immer #0 !!!???
Dass die Funktion auch mit char als Append geht, ist mir wohl entfallen.

rolf
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: [BUG REPORT] Append stört Serport

 · 
Posted: 09.12.2015 - 17:17  ·  #5
ich habe das Programm sehr vereinfacht, so dass die Variable charX ihre Bedeutung verloren hat.
Das Ursprungsprogramm empfängt und sendet Daten zum PC.
charX bekommt in diesem Programm den Wert von Seinp zugewiesen.
und empfangene Zeichen werden in einen String Puffer geschrieben.

Code

  if (Serstat) then
    charX := Seinp; 
    [...]
    Append(charX, PCstr); // schreibe Zeichen in den String-Puffer
    [...]
  endif;



Alle Test im Simulator waren erfolgreich und fehlerfrei.
Erst in der realen Welt traten sehr sporadisch Fehler auf.

Um den Fehler zu erzeugen, sende ich mit einem Terminalprogramm (HTerm) alle 100ms Daten zum uC. Bei ca. 10000 gesendeten Zeichen tritt der Fehler 10 Mal auf (siehe Bild). Also selten. Die Daten müssen offensichtlich zu einem bestimmten Zeitpunkt eintreffen, damit der Fehler auftritt.

Zuerst hatte ich nicht atomare read-modify Zugriffe in Verdacht, konnte allerdings keine finden.
Der Serport Treiber z.B. sperrt schön den globalen Interrupt während er auf _rxcount zugreift.

Dann habe ich irgendwann festgestellt, dass der Fehler nur bei Verwendung von append auftritt, wenn der erste Parameter vom Typ char ist.

Ich weiß, dass in der Doku char als typ nicht angegeben ist.
Trotzdem könnte die Funktion mit einem character für den erster Parameter fehlerfrei sein.

Messungen haben gezeigt, dass auch im Fehlerfall die Empfangs-Interrupt-Routine unmittelbar nach jedem Zeichen auf der RX Leitung angesprungen wird. Aber aus irgendeinem, mir nicht zu erklärbaren Grund, ist das Byte im UDR Register falsch. Es stellt sich so dar, als ob die Daten nicht vom UART Shift Register in den Daten Puffer UDR geschrieben wurden, der Interrupt aber auftritt. Ich kann mir das nicht erklären und träum davon schon Nachts. :-)

Gruß
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: [BUG REPORT] Append stört Serport

 · 
Posted: 10.12.2015 - 14:30  ·  #6
Hallo Thomas,

das ganze passiert nur wenn ein char als Quelle benutzt wird?
Schon mal testhalber einen string mit Länge 1 dafür eingesetzt?
Es gibt nämlich keinen Unterschied zwischen char und string an
dieser Stelle.

Ich habe auch nichts gefunden wo StringAppend und das dabei
beteiligte StringInsert irgendwo in den IO-Bereich greift.

rolf
Thomas.AC
Benutzer
Avatar
Gender: n/a
Age: 43
Posts: 308
Registered: 07 / 2013
Subject:

Re: [BUG REPORT] Append stört Serport

 · 
Posted: 10.12.2015 - 15:19  ·  #7
Hallo Rolf,

Der Fehler ist bisher nicht aufgetreten, wenn der erste Parameter von Append vom Typ String[1] ist.

Code

var HelpString : string[1];

HelpString := charX;
Append(HelpString , pcStr);


Aber es gibt doch einen Unterschied:
String[1] bleibt in RAM und char wird vorher in die Register ACCELO und ACCEHI geschrieben.

In beiden Fällen bekommt Append die Adresse als Parameter.
Der Zugriff erfolgt dann später über das Z-Register.
StrInsert könnte ACCELO und ACCEHI überschreiben, da die Funktion davon ausgeht, dass der Parameter im RAM liegt. StrInsert schreibt tatsächlich in das ACCELO Register, aber erst nachdem es ausgelesen wurde.
Konnte nicht erkennen, dass ACCELO oder HI korrupt werden.

Ich habe allerdings noch nicht den kompletten ASM Code von StrIns durchgekaut, weil es mühselig ist.

Habe auch schon die Hardware gewechselt und mit ATMEGA16 ausprobiert. Keine Änderung.
Compilerversion ist bei mir übrigens 5.5.23

Gruß
Thomas
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: [BUG REPORT] Append stört Serport

 · 
Posted: 10.12.2015 - 15:37  ·  #8
Hallo Thomas,

eine evtl. Zerstörung von ACCELO/HI erklärt aber nicht das scheinbare
Problem vom illegalen UDR Inhalt.

Das Problem dass ACCELO/HI hier benutzt wird um die Länge des Pseudo
Strings (char) festzuhalten ist, dass das nachfolgende StringInsert die
Länge des Source Strings braucht. Und diese "1' wird im ACCELO/HI
übergeben. Der Z-Pointer zeigt nun auf ACCELO/HI was die Stringlänge
"1" enthält. Ein Trick um auch chars zu unterstützen.

Beim XMega funktioniert das nicht, da Pointer nie auf ein Register zeigen
können. Deshalb wird dafür dort nicht ein Register benutzt sondern ein
Pseudo Register/IO "Scratch...".
Hilft hier aber auch nicht viel weiter :aerger:

rolf
  • 1
  • 2
  • 3
  • Page 1 of 3
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 16 · Cache Hits: 15   144   159 · Page-Gen-Time: 0.026753s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI