Sehr seltsame Fehler bei if/then

  • 1
  • 2
  • Page 1 of 2
Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

Sehr seltsame Fehler bei if/then

 · 
Posted: 08.11.2018 - 14:41  ·  #1
Ich habe in einem Programm sehr seltsame Fehler, u. a. habe ich eine Abfrage

Code

function NoKeyPressed: boolean; 
begin
  if (PORT_STABLE1 = 0) then
    return(true);
  else 
    return(false); 
  endif; 
end; 


Diese gibt IMMER false zurück, egal was in PORT_STABLE1 steht!

Ich habe es im Emulator durchgeklickt, der zeigt auch an, dass es 0 ist, springt dennoch auf return(false);
(Siehe Bild)

Das ganze Programm macht Dummfug, das ist nicht die einzige Stelle wo das auftritt. Ich habe auch einige Repeat .. until Schleifen die abbrechen obwohl die Bedingung nicht erfüllt ist!

Was könnte das sein?

Das ist so seit ich die FT800 Unit eingebunden habe.. Ohne die Unit passiert das nicht.
Stack/Frame sind laut Emu nur zu 20% genutzt.
Attachments
Sehr seltsame Fehler bei if/then
Filename: false.jpg
Filesize: 26.47 KB
Title:
Download counter: 144
Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

Re: Sehr seltsame Fehler bei if/then

 · 
Posted: 08.11.2018 - 14:52  ·  #2
Ist übrigens egal ob mit oder ohne Optimizer.

Edit: Ich habe es jetzt noch mal ganz von vorn gemacht, ein bestehendes fehlerfrei laufendes Programm um die FT800 Unit erweitert und das Display initialisiert. Danach spinnt das Programm und besagte Schleifen brechen ab obwohl die Bedingungen nicht erfüllt sind.
Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

Re: Sehr seltsame Fehler bei if/then

 · 
Posted: 08.11.2018 - 16:22  ·  #3
Ich habe es gefunden...das hier hat es ausgelöst:

{$IDATA}
VAR
TimeByte : byte;
UpdateTFT : boolean;


procedure onsystick;
begin
if IncToLimWrap(TimeByte, 5, 0) then
UpdateTFT:= true;
endif;
end;

Systick steht auf 10ms.
Damit brechen fast alle Repeat-Until-Schleifen vorzeitig ab.

Was könnte das sein? Wird da irgendwo ein Bereich überschritten?
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: Sehr seltsame Fehler bei if/then

 · 
Posted: 08.11.2018 - 16:30  ·  #4
Hallo Louis,

das sieht verdächtig nach nicht geretteten/überschriebenen Regsistern aus!
Schau dir mal im ASM an, was IncToLimWrap da so benutzt !

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

Re: Sehr seltsame Fehler bei if/then

 · 
Posted: 08.11.2018 - 16:34  ·  #5
Hallo Louis,

schlechte Idee im SysTick solche mächtigen Funktionen ausführen zu lassen.
Aber wenn schon, dann muss der User selbst bei Eintritt und Exit für die
notwendige Register Rettung sorgen. Hier werden standardmässig nur
ACCA, ACCB, ACCCLO und ACCChi gerettet!!!!

Gunters Tip ist hier lebenswichtig....

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

Re: Sehr seltsame Fehler bei if/then

 · 
Posted: 08.11.2018 - 17:11  ·  #6
Compiler Manual:
Die Register SREG, _ACCA/R17, _ACCB/R16, _ACCCLO/R30 und _ACCCHI/R31 werden automatisch gesichert. Wenn Pascal Statements oder andere Register benutzt werden, müssen diese Register vorher gerettet werden.
Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

Re: Sehr seltsame Fehler bei if/then

 · 
Posted: 08.11.2018 - 17:23  ·  #7
Ah, wieder etwas schlauer. Ich nahm an, dass onSystick keine Interruptroutine ist, lesen bildet :banghead: ..

Davon abgesehen: Der Optimizer baut ja normalerweise Push/Pop da ein wo es nötig ist, bei OnSystick tut er das nicht. Wäre vielleicht noch eine Verbesserungsmöglichkeit.
Gunter
Administrator
Avatar
Gender:
Location: Frankfurt Main / Germany
Posts: 1697
Registered: 02 / 2003
Subject:

Re: Sehr seltsame Fehler bei if/then

 · 
Posted: 09.11.2018 - 17:25  ·  #8
Quote by Lschreyer
Ich nahm an, dass onSystick keine Interruptroutine ist


Hi,
das ist zunächst auch nur eine "stinknormale Prozedure" und keine Interrupt_Service _Routine. Allerdings mit einem fest vorgebenem Namen.
Der Systick ist die ISR eines Timers und ruft diese Prozedur dann auf (sofern eine Prozedur mit diesem speziellen Namen existiert). Damit wird diese Routine natürlich auch Teil der "Interruptroutine" des Systick Timer-Interrupts.

Gunter
  • 1
  • 2
  • Page 1 of 2
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   142   157 · Page-Gen-Time: 0.028743s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI