Device Treiber

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

Device Treiber

 · 
Gepostet: 23.10.2019 - 20:42 Uhr  ·  #1
Hallo Forumgemeinde, hallo Rolf,

ich möchte einen Device Treiber für Write schreiben. Im Handbuch steht dazu

Zitat

Wie schon o.a. kann Write auch selbstdefinierte Gerätetreiber ansprechen. Hierbei sind jedoch einige Besonderheiten zu beachten:

Diese Prozedur muss einen Übergabe-Parameter vom Typ Byte oder Char besitzen, sie darf keine lokalen Variablen besitzen und damit auch keinen Frame. Weiterhin dürfen innerhalb der Prozedur nur die PseudoAccus “_ACCA, _ACCB, _ACCCHI und _ACCCLO = Z” benutzt werden was einen Aufruf von anderen Prozeduren und Funktionen sowie von Systemfunktionen ausschliesst.

Sollten trotzdem zusätzliche ACCUs für Zwischenspeicher gebraucht werden, sind diese vorher mittels Push/Pop zu retten. Diese Einschränkungen erzwingen in der Praxis, dass diese Prozedur komplett in Assembler zu schreiben ist. Der Übergabe Parameter befindet sich in _ACCA. Wichtig ist der CompilerSchalter {$NOFRAME} oder {$DEVICE}.


Mich irritiert, dass eine Funktion mit vorangestelltem Compilerschalter {$DEVICE} oder {$NOFRAME} den Funktionsparameter aus dem _ACCA Register auf den den Frame legt (siehe Code), obwohl das Handbuch die Verwendung des Frames verbietet.

Fragen:
Darf ich Pascal-Code für einen Device Treiber für Write verwenden?
Wieso legt die mit {$DEVICE} kompilierte Funktion, den Parameter aus _ACCA auf den Frame?

Ich hoffe, meine Frage ist verständlich und danke sehr für eine Antwort.

------------------------------

Code:

Pascal
Code

program TutorDemo;

Device = mega8, VCC = 5;

Import Serport;
From System Import;

Define
  procClock  = 8000000;
  StackSize  = 64, iData;
  FrameSize  = 64, iData;
  Serport    = 19200;

Implementation


{$IDATA}

{$DEVICE}
procedure myDevice(c : byte);
begin
  Serout(c);
end;

begin
  Writeln(myDevice, 'Hallo');
  loop
  endloop;
end.


Assembler
Code

                        .FUNC     myDevice, 00014h, 00020h
TutorDemo.myDevice:
                        .RETURNS   0
                        SBIW      _FRAMEPTR, 1
                        STD       Y+000h, _ACCA
                        .BLOCK    21
                        .LINE     22
                        LDD       _ACCA, Y+000h
                        .FRAME  0
                        RCALL     SYSTEM.SEROUT

                        .ENDBLOCK 23
TutorDemo.myDevice_X:
                        .LINE     23
                        ADIW      _FRAMEPTR, 1
                        .BRANCH   19
                        RET
                        .ENDFUNC  23


Im Assemblercode Verwendung vom Framepointer
rh
Administrator
Avatar
Geschlecht:
Herkunft: Germany
Alter: 25
Homepage: e-lab.de
Beiträge: 5558
Dabei seit: 03 / 2002
Betreff:

Re: Device Treiber

 · 
Gepostet: 23.10.2019 - 20:55 Uhr  ·  #2
Hallo Thomas,

was die ursprüngliche Angabe "kein Frame" bedeutet weiss ich nicht mehr genau.
Aber auf jeden Fall keine lokalen vars. Dass dann intern doch mit dem Frame
gearbeitet wird ist was anderes.
Aber solange alles tut.........

rolf
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: 15 · Cache Hits: 14   51   65 · Page-Gen-Time: 0.030557s · Speichernutzung: 2 MB · GZIP: ein · Viewport: SMXL-HiDPI