ByteToStr - seltsames Verhalten?

rbr50
 
Avatar
 
Subject:

ByteToStr - seltsames Verhalten?

 · 
Posted: 16.03.2011 - 19:47  ·  #1
Hallo,

ich habe hier einen Effekt, den ich nicht verstehe. Wahrscheinlich mache ich, wie immer, etwas falsch. Aber ich finde nichts, darum frage ich hier.

Ich habe eine serielle Empfangsroutine, die in einen global dekalrierten Puffer schreibt, mit einer ebenfalls global deklarierten Zählvariable CommPointer.

Code

  if CommFlag = StartChar then   //Vorher schon gültiges Startzeichen empfangen?
    inc(CommPointer);            // dann im Buffer ablegen
    b:= SerInp;
    RecvBuffer[CommPointer]:= b;
    write(serout4, bytetostr(b));
    ...


Es ist keine Interruptroutine, es gibt auch keine von mir deklarierten Interrupts, kein Multitasking.

Jetzt das Verhalten, was ich nicht verstehe:

Ist die Variable CommPointer (Byte) im $DATA Bereich deklariert, funktioniert das write(serout..) einwandfrei. Habe ich die Variable CommPointer jedoch im $IDATA Bereich, bekome ich keine Ausgabe von ByteToStr.

Schreibe ich jedoch
Code

write(serout4, IntToStr(word(b)));

funktioniert die Ausgabe auch mit CommPointer im $IDATA Bereich.

Im Simulator tritt dieser Effekt nicht auf, dort sehe ich auf dem Terminal immer korrekte Daten, egal, ob $DATA oder $IDATA.

Ich habe nun ziemlich lange "gefummelt", bis ich das Verhalten soweit eingegrenzt habe.
Der Effekt muss mit ByteToStr zu tun haben. Denn die Variable b hat den richtigen Wert, dieser wird auch mit serout(b) korrekt übertragen.

Hat jemand eine Idee, was ich falsch mache?

Viele Grüße, Rolf
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: ByteToStr - seltsames Verhalten?

 · 
Posted: 16.03.2011 - 21:37  ·  #2
Hallo Rolf,

  • 1. der Data Bereich (Register) ist extrem klein und sollte nur in Ausnahmefällen benutzt werden.
  • 2. das Verhalten sieht sehr nach zu kleinem Frame Bereich aus.

rolf
rbr50
 
Avatar
 
Subject:

Re: ByteToStr - seltsames Verhalten?

 · 
Posted: 17.03.2011 - 08:08  ·  #3
Hallo,

Quote

1. der Data Bereich (Register) ist extrem klein und sollte nur in Ausnahmefällen benutzt werden.


danke für den Hinweis. Das war mitr jedoch ekannt, ich hatte vor der Deklaration der Variablen "CommPointer" unter Projekt Informationen nachgesehen, ob noch Register frei sind. Ich hatte bewußt im IDATA Bereich deklariert, weil ich im ASM gesehen hatte, dass in meiner Routine eine ganze Menge LDS und PUSH'S erzeugt wurden. Und hatte gedacht, für den Indexzeiger ein Register zu nehem, könnte das etwas verringern, damit das Verhalten ändern. Hat ja auch geklappt.


Quote

2. das Verhalten sieht sehr nach zu kleinem Frame Bereich aus.


Hatte ich auch vermutet und schrittweise bis auf 512 Byte erhöht. Hat sich aber leider nichts geändert.


Die Ausgabe von ByteToStr war nur zum Debuggen, ich brauche sie jetzt nicht mehr. Von daher kann ich das Problem erstmal als erledigt betrachten. Allerdings hätte ich doch gern gewusst, was ich besser machen könnte.


Vielen Dank für Ihre zeit und freundliche Grüße!

Rolf
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: 15 · Cache Hits: 14   64   78 · Page-Gen-Time: 0.025866s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI