Bug Registersicherung wenn noshadow gesetzt

Thomas.AC
Benutzer
Avatar
Geschlecht: keine Angabe
Alter: 45
Beiträge: 308
Dabei seit: 07 / 2013
Betreff:

Bug Registersicherung wenn noshadow gesetzt

 · 
Gepostet: 28.03.2014 - 15:28 Uhr  ·  #1
Hallo,

bei mir tritt der Fehler auf, dass bei {$NOSHADOW} _ACCBLO und _ACCBHI nicht gesichert werden.

Gruß

Thomas.AC

Code

Interrupt PORTD_INT0;
begin
ASM;
// hallodu
ENDASM;
  if Bit(PIND,1) then // no card
    USARTE0DATA := byte('a');
  else
    USARTE0DATA := byte('b');
  endif;
  INTFLAGSD := BIT0_bm; //clear flag
end;


Code

SYSTEM.$INTERRUPT_PORTD_INT0:
                        CLI
                        PUSH      _ACCCLO
                        PUSH      _ACCCHI
                        PUSH      _ACCB
                        PUSH      _ACCA
                        IN        _ACCA, SREG
                        PUSH      _ACCA
                        IN        _ACCA, EIND
                        PUSH      _ACCA
                        CALL      dactest.INTERRUPT_PORTD_INT0
                        POP       _ACCA
                        OUT       EIND, _ACCA
                        POP       _ACCA
                        OUT       SREG, _ACCA
                        POP       _ACCA
                        POP       _ACCB
                        POP       _ACCCHI
                        POP       _ACCCLO
                        SEI
                        RETI


Code

                        .FUNC     INTERRUPT_PORTD_INT0, 0024Ah, 00020h
dactest.INTERRUPT_PORTD_INT0:
                        .RETURNS   -1
                        .BLOCK    587
                        .ASM
                        // hallodu
                        .endasm
                        .LINE     591
                        LDI       _ACCBLO, PIND AND 0FFh
                        LDI       _ACCBHI, PIND SHRB 8
                        LDI       _ACCA, 001h
                        CALL      SYSTEM.TestBit8
                        TST       _ACCA
                        .BRANCH   4,dactest._L1807
                        BRNE      dactest._L1807
                        .BRANCH   20,dactest._L1805
                        JMP       dactest._L1805
dactest._L1807:
                        .BLOCK    593
                        .LINE     593
                        LDI       _ACCA, 061h
                        STS       USARTE0DATA, _ACCA
                        .ENDBLOCK 597
                        .BRANCH   20,dactest._L1806
                        JMP       dactest._L1806
dactest._L1805:
                        .BLOCK    597
                        .LINE     597
                        LDI       _ACCA, 062h
                        STS       USARTE0DATA, _ACCA
                        .ENDBLOCK 598
dactest._L1806:
                        .LINE     599
                        LDI       _ACCA, 001h
                        STS       INTFLAGSD, _ACCA
                        .ENDBLOCK 600
dactest.INTERRUPT_PORTD_INT0_X:
                        .LINE     600
                        .BRANCH   19
                        RET
                        .ENDFUNC  600
rh
Administrator
Avatar
Geschlecht:
Herkunft: Germany
Alter: 26
Homepage: e-lab.de
Beiträge: 5558
Dabei seit: 03 / 2002
Betreff:

Re: Bug Registersicherung wenn noshadow gesetzt

 · 
Gepostet: 28.03.2014 - 18:05 Uhr  ·  #2
Hallo Thomas,
ACCBLO/HI und viele andere werden nicht gesichert wenn $NOSHADOW aktiv ist.
Das ist der Sinn von $NOSHADOW dass nur SREG, R16,R17,R30,R31 gesichert werden.
Diese werden fast immer in Interrupts gebraucht. Werden dort weitere Register
benutzt, dann muss der User dies im Interrupt selbst tun.

rolf
Thomas.AC
Benutzer
Avatar
Geschlecht: keine Angabe
Alter: 45
Beiträge: 308
Dabei seit: 07 / 2013
Betreff:

Re: Bug Registersicherung wenn noshadow gesetzt

 · 
Gepostet: 28.03.2014 - 19:05 Uhr  ·  #3
Hallo Rolf,
die Erklärung trifft auf $NOSAVE zu, was ich nicht verwende.

Anbei die Beschreibung aus docucompiler.pdf für $NOSHADOW.

{$NOSHADOW}
Die Definition muss, falls benötigt, noch vor der Device Deklaration erfolg en. Bei non - Multitask Anwendungen werden bei allen Interrupts nur die durch die Interrupts benutzten Register gesichert. Dies spart wesentlich Ram, Rom und Rechenzeit. Dieser Schalter wird durch den Import von Prozesse und Tasks überschrieben

Gruß
Thomas.AC
AVRfan
Benutzer
Avatar
Geschlecht: keine Angabe
Alter: 69
Beiträge: 16
Dabei seit: 11 / 2009
Betreff:

Re: Bug Registersicherung wenn noshadow gesetzt

 · 
Gepostet: 28.03.2014 - 20:50 Uhr  ·  #4
richtig, nur die von den Interrupts selbst benutzten Registern
und das sind nunmal R15, R16, R30, R31 und Flags.
Wenn nun im Interrupt irgendwelche System oder Userfunktionen
aufrufen werden, dann kann das System nicht wissen welche
Register dort benutzt werdenj.
Gunter
Administrator
Avatar
Geschlecht:
Herkunft: Frankfurt Main / Germany
Beiträge: 1697
Dabei seit: 02 / 2003
Betreff:

Re: Bug Registersicherung wenn noshadow gesetzt

 · 
Gepostet: 28.03.2014 - 21:24 Uhr  ·  #5
Hi,
Hintergrund dürfte alleine schon sein, dass der AVRco ein "single pass compiler" ist.
Wenn die ISR codiert wird, weiss der Compiler somit noch gar nicht, was ihn darin erwartet,
also welche Register in der ISR benutzt werden.

Gruß
Gunter
Merlin
Administrator
Avatar
Geschlecht:
Alter: 26
Beiträge: 1485
Dabei seit: 03 / 2005
Betreff:

Re: Bug Registersicherung wenn noshadow gesetzt

 · 
Gepostet: 30.03.2014 - 22:45 Uhr  ·  #6
I don't know if this is any help or of interest, but the optimiser (because the compiler has already done its work) can dig deep provided no indirect calls or jumps are made. This means that looking at it the other way round, if all registers were individually saved and restored, the optimiser should remove all unnecessary PUSH and POP calls.
Gewählte Zitate für Mehrfachzitierung:   0

Registrierte in diesem Topic

Aktuell kein registrierter in diesem Bereich

Die Statistik zeigt, wer in den letzten 5 Minuten online war. Erneuerung alle 90 Sekunden.
MySQL Queries: 8 · Cache Hits: 14   111   125 · Page-Gen-Time: 0.015221s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI