Entwickler-Ecke
Sonstiges (Delphi) - Direkter Speicherzugriff unter Linux/Lazaraus
cbob - Sa 03.10.09 14:15
Titel: Direkter Speicherzugriff unter Linux/Lazaraus
Allo!
Habe folgendes Problem:
Mein System hat 16 digtiale IO's (GPIO). Diese sind entweder abzufragen oder zu setzen, indem man eine bestimmte Adresse ausliest/beschreibt. Als Beispiel wurde einfacherweise ein kurzes C-Programm beigelegt:
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| #include <stdio.h> #include <sys/io.h> #define outportb(a,b) outb(b,a) #define inportb(a) inb(a) void main(void) { iopl(3); /* set GPIO port0[7-0] as input mode */ outportb(0x98, 0x00); /* read data from GPIO port0 */ inportb(0x78); /* set GPIO port1[7-0] as output mode */ outportb(0x99, 0xff); /* write data to GPIO port1 */ outportb(0x79, 0x55); } |
Nachteil eins: es muß mit root Rechten ausgeführt werden, Nachteil zwei: Kein Lazarus/Pascal/Delphi!
Wie kann ich das nun mit Lazarus (unter Linux) realisieren? Habe da absolut keinen Anhaltspunkt, wie ich direkt auf den Speicher zugreifen kann. Hat hier unter Umständen jemand eine Idee dazu?
Danke und erstmal einen schönen Samstag!
cbob - Sa 03.10.09 22:05
Kenne mich leider mit der stdlib nicht aus, daher kann ich dazu leider nix sagen.
Die Frage steht halt immernoch: wie bekomme ich Zugriff auf das GPIO-Interace?
Im gewissen Sinne könnte man dort auch von einem seriellen Port ausgehen, aber ich muss halt ran kommen.
Wobei, wenn wir aber gerade von seriellen Ports sprechen: eine zweite Frage: welches Lazarus Package könnte man dazu empfehlen? Wohl gemerkt: unter Linux! Darüber aber bitte nicht die erste Frage vergessen :-)
Grüß
-C-
jaenicke - Sa 03.10.09 22:13
cbob hat folgendes geschrieben : |
| Wobei, wenn wir aber gerade von seriellen Ports sprechen: eine zweite Frage: welches Lazarus Package könnte man dazu empfehlen? Wohl gemerkt: unter Linux! |
Den Link hast du aber gesehen? :gruebel:
cbob - Sa 03.10.09 22:19
Janein - doch hab ich! Habe dummerweise auf der synaser Seite bei den unterstützten Systemen bei Windows aufgehört zu lesen und dachte mir somit, dass das ja nun nix für Linux ist :-(
Nun weiss ich's aber besser.
Allerdings hab ich da keinen Ansatz für mein erstes Problem finden können. Dachte da an sowas wie "Lege Speicheradresse für x-te Schnittstelle fest..." o.ä. .
Das geht da ja nun leider nicht.
-C-
cbob - Mo 05.10.09 09:33
Habe nun einen ersten ANsatz gefunden:
Mittels der Unit x86 kann man per fpIOperm auf Ports zugreifen. Das funktioniert schonmal ein wenig - muss für das Programm dann allerdings root-rechte haben.
Andere Lösungsvorschläge? Habe auch von einem GPIO-treiber gelesen, aber leider noch zu wenig, um das bei meinem Board einzusetzen.
BenBE - Mo 05.10.09 18:18
Unter Unix kannst du dir (wenn's nicht zeitkritisch ist) mit Domain-Sockets einen kleinen "IO-Treiber-Daemon" bauen, der auf die Schnittstelle zugreift bzw. von dieser Daten liest. Der Rest der Anwendung kann dann ohne Root-Rechte laufen.
Wo ich mir grad nicht ganz sicher bin, ist die Sache, ob man für die IO-Port-Zugriffe zum Zeitpunkt der Zugriffe die Rootrechte haben muss, oder ob ob man da ggf. sich die nötigen Resourcen vorab holen kann und dann diese mit gedroppten Rechten später einfach weiterverwendet (so macht das z.B. Postfix für die Mail-Sockets, die auf Port 25 eigentlich auch Root-Rechte brauchen).
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!