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.
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
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.
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.
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.
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.
>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.
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.
> 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.
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.
>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.
Und wie kann ich von I/O-Ports einlesen, also beispielsweise vom Parallelport einlesen? Das ASM-Beispiel zum schreiben hilft mir da nicht weiter.
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.
m_dwValue = DlPortReadPortUchar(m_dwAddr) vs b = inb(addr) ganz schoen geschwaetzig, das teil! g
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.