Forum: PC-Programmierung Port-Befehle unter Borland C++Builder 6 ?


von Rolf F. (Gast)


Lesenswert?

Ich habe mal versucht ein Code-Beispiel aus diesem Forum, was unter
Borland C++ 3.1 gemacht wurde, unter der neueren Version 6 zu
compilieren, aber das scheitert an Port-Befehlen wie

outp (0x378, 0xff);

um 0xff über den ersten Parallelport auszugeben.
Wo hat Borland die Port-Befehle denn versteckt?
Über die Hilfe des Programms war nichts zu finden und die Fehlermeldung
sagt auch nichts dazu.

von Andreas S. (andreash)


Lesenswert?

Hallo,

dazu musst Du die Windows-Befehle ReadFile, WriteFile usw. benutzen.
Such mal im Code-Forum. Da gibt es einige Beispiele dazu.

Grüße
andreas

von Rolf F. (Gast)


Lesenswert?

Das was zu ReadFile und WriteFile zu finden war, ist Zugriff auf
Block-Devices; ich brauche aber aber Zugriff auf I/O-Ports, die etwas
ganz anderes sind.

Mir ist eigentlich der Compiler egal; ich will nur unter MS-Win auf
I/O-Ports zugreifen.
Das kann doch nicht so schwer sein, auch wenn die Compiler-Hersteller
die Befehle dafür alle paar Jahre umbenennen.

von Thomas (Gast)


Lesenswert?

Hi,

es sind hier nicht die Compilerhersteller, die Dinge umbenennen,
sondern Betriebssysteme die zusätzliche Abstraktionsebenen enthalten...
Windows will einfach nicht, dass du direkt auf Hardwareebene
rumfummelst, dazu hat es Treiber zu geben, das ist der ganze Punkt.
Such' mal nach "giveio", vielleicht hilft dir das was.

von Rolf F. (Gast)


Lesenswert?

Es geht ja gerade um einen Treiber; der muss direkt auf die Hardware
zugreifen; der ist die Abstraktionsebene.
Das Problem beim PC ist nur, dass es keinen separten I/O-Space gibt,
auf dem man ANSI-C zugreifen kann, sondern nur über I/O-Befehle;
ansonsten wären Port-Zugriffe einfach auf feste absolute Adressen, so
wie beispielsweise auf ARM.

von Karl H. (kbuchegg)


Lesenswert?

Hol Dir von
http://www.driverlinx.com/DownLoad/DlPortIO.htm

den DLPortIO.
Das ist ein Treiber, der Dir den Zugriff auf die Ports
unter Win2K, WinXP ermoeglicht. Die DLL stellt Dir
entsprechende Aufrufe zur Verfuegung. Sie kommt mit
Beispielen in C und VB.

von Wolfram (Gast)


Lesenswert?

>Es geht ja gerade um einen Treiber; der muss direkt auf die Hardware
>zugreifen; der ist die Abstraktionsebene.
>Das Problem beim PC ist nur, dass es keinen separten I/O-Space gibt,
>auf dem man ANSI-C zugreifen kann, sondern nur über I/O-Befehle;
>ansonsten wären Port-Zugriffe einfach auf feste absolute Adressen, so
>wie beispielsweise auf ARM.

über in und out greifst du auf einen separaten IO Space zu!

niemand hindert dich in Borland C zu schreiben
asm
mov dx,378
mov al,0xff
out dx,al
end;
sollte eigentlich noch funktionieren
Die Sache ist nur ,dein Programm muss auch berechtigt sein dies zu tun,
sonst wird es mit einer exception wegen unerlaubten Hardwarezugriffs
rausgeschmissen! Du kannst davon ausgehen das ein Programm das einen
solchen Zugriff mach mit sicherheit kein .exe Programm ist sondern nur
ein Treiber.
Solltest du "nur auf der parallelen Schnittstelle etwas ausgeben
wollen nimm wie oben empfohlen ReadFile/Writefile und suche in der MSDN
nach DCB und CreateFile.
Wenn du mit allen Leitungen spielen willst nimm obengenannte Links.
Solltest du für eine unbekannte Parallele Karte einen Treiber schreiben
wollen dann, such nach DDK (driver development Kit).
Also vorausgesetzt du willst unter Windows Programmieren.

von Rolf F. (Gast)


Lesenswert?

Ok, dann nehme ich Assembler.
Dass man für ein bischen Pin-Wackeln so einen Aufwand treiben muss,
gibt's wohl nur unter MS-Win. Meine 10 Jahre jungen User-Space-Treiber
unter Linux funktionieren immer noch ohne Änderung am Sourcecode.

von Karl H. (kbuchegg)


Lesenswert?

> Dass man für ein bischen Pin-Wackeln so einen Aufwand treiben muss,
> gibt's wohl nur unter MS-Win.

Du ueberschaetzt den Aufwand gewaltig.
Hol dir den Treiber, installier ihn und schon gehts los in
C oder C++. Header inkludieren und ein paar Funktionen, ala
ReadByte(), WriteByte() aufrufen sind wahrlich kein Aufwand.

von Olaf Stieleke (Gast)


Lesenswert?

Auch die Assembler-Arie wird unter Windows NT,2K,XP und höher knallhart
mit einer Exception bestraft. Kein Programm darf direkt auf
Hardware-Ports zugreifen - dies wird bereits im Prozessor verhindert.

Unter den genannten Betriebssystemen kommst du um eine Brücke wie
DLPortIO (die ich selbst schon sehr oft benutzt habe) nicht herum.

von Wolfram (Gast)


Lesenswert?

>Meine 10 Jahre jungen User-Space-Treiber
>unter Linux funktionieren immer noch ohne Änderung am Sourcecode.

Aber auch nur solange du Zugriffsberechtigt bist als Nutzer und kein
anderer Prozeß den Port geöffnet hat. Das sollte dir eigentlich schon
vor 10 Jahren aufgefallen sein. Linux hat nämlich den beschränkten
Portzugriff schon viel früher eingeführt.
Der Assemblerzugriff auf die Ports wird auch nur bei
Zugriffsberechtigung gehen und die hat nur ein Treiber dem dieser
Portbereich gehört.
Dein bißchen "Pin-Wackeln" kannst du mit ReadFile und WriteFile
machen.
Solange es nur die Datenpins betrifft. Das entspricht read und write.

von Rolf F. (Gast)


Lesenswert?

Und wie kann ich von I/O-Ports einlesen, also beispielsweise vom
Parallelport einlesen?
Das ASM-Beispiel zum schreiben hilft mir da nicht weiter.

von Karl H. (kbuchegg)


Lesenswert?

Hast Du Dir schon einen Treiber geholt?
zb. http://www.driverlinx.com/DownLoad/DlPortIO.htm

Dort lautet der Zugriff zb so:

m_dwValue = DlPortReadPortUchar(m_dwAddr);

Mitgeliefert wird auch

  DLportbc.lib  -- Import library - Borland C\C++

einfacher gehts wohl wirklich nimmer.

von Rolf F. (Gast)


Lesenswert?

Ok; wird gemacht.

von herp (Gast)


Lesenswert?

m_dwValue = DlPortReadPortUchar(m_dwAddr)

vs

        b = inb(addr)

ganz schoen geschwaetzig, das teil!

g

von Karl H. (kbuchegg)


Lesenswert?

Verpass ihm halt einen Maulkorb

#define inb DlPortReadPortUchar

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.