closed

Loginbox

Please enter your username and password into the following fields to log in.


  • Username:
  • Password:
  •  
  • Auto log in on every visit.


  •  

Device Treiber



Thomas.AC offline
Benutzer
Avatar
Gender: n/a
Location: n/a 
Age: 38
Posts: 240
Registered: 07 / 2013
Private message
Subject: Device Treiber  -  Posted: 23.10.2019 - 20:42   -  
Hallo Forumgemeinde, hallo Rolf,

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

Quote

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
This post has been edited 1-times. Last edit: 23.10.2019 - 20:43 by Thomas.AC.
go down go up
rh offline
Administrator
Avatar
Gender: male
Location: GERMANY  Germany
Age:
Posts: 5483
Registered: 03 / 2002
Homepage Private message
Subject: Re: Device Treiber  -  Posted: 23.10.2019 - 20:55   -  
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
Cars don't buy cars -- Autos kaufen keine Autos.
Henry Ford
go down go up
 


Registered users in this topic
Currently no registered users in this section

Delete cookies of this forum  •  FAQ / Help  •  Team page  •  Imprint   |  Local time: 12.12.2019 - 05:15