Page 1 of 2

C

Posted: 15 Jun 2017, 10:01
by Tim
Hallo,
ich möchte gern ein Programm mit der Programmiersprache C schreiben, welches auch die Ein- und Ausgänge des Revolution Pi verwendet.
Durch das Video " PiTest Sourcecode" habe ich bereits einen Einblick in die Thematik erhalten.
Nun zu meiner Frage: gibt es noch einen anderen einfacheren Weg als über das "Makefile"? Oder muss ich jedes mal die Datei "piTest.c" überschreiben?
Für die verwendung von I/O´s werden ja die Bibliotheken " piControl.h" und "piControlIf.h" benötigt. Nur leider lassen sich diese über den befehl "gcc" nicht einbinden.
Irgendwelche ideen?

Re: C

Posted: 15 Jun 2017, 13:12
by Tim
Ich konnte mein Problem soeben selber lösen durch die verwendung von "gcc -I/home/pi/testordner testlampe.c piControlIf.c", dazu müssen sich die Dateien "piControl.h“, „piControlIf.h“ und „piControlIf.c" im selben Ordner, wie die c-Datei, befinden.
Viel Spaß=)

Re: C

Posted: 15 Jun 2017, 16:17
by volker
Hallo Tim,
Du brauchst eigentlich nicht wirklich diese ganzen Definitionen in den .h Dateien des Beispiels. Die eigentlichen Aufrufe, welche Du in Dein C-Programm übernehmen kannst, befinden sich in piControlIf.c udn bracuhen lediglich die Biliotheken
#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>
Du machst ein Open auf einen Fildhandle (miit dem Devicenamen "/dev/piControl0"), dann einen seek mit diesem handle auf den Offset im Prozessabbild und dann einfach ein write oder read. Das ist schon alles. Derganze Rest geht dann nur um Sonderfunktionen von PiControl, wie z.B. der Zugriff über symbolische Namen, das Setzen oder Löschen einzelener Bits oder ein Reset vom Treiber, etc. Dafür brauchst Du IOCTL Zugriffe, die deutlich komplexer sind und für die im Wesentlichen auch die meisten Definition in den .h-Dateien stehen. Sie brauchen zum Beispiel bestimmte Strukturen als Parameter und auch bestimmte Funktionsnummern als Parameter.
Aber fang einfach mal mit den ganz einfachen Aufrufen von oben an und hol Dir so IOs. Übrigens lohnt sich vielleicht auch mal ein Blick auf unseren Python-Quellcode für den Zugriff auf das Prozessabbild. Der ist deutlich weniger komplex als PiTest (wenn Du einfach mal die etwas komplizierten Konvertierungsfunktionen by Python außer Acht lässt, mit denen man dort Byte-Arrays erzeugen oder auslesen musst).

Re: C

Posted: 16 Jun 2017, 09:47
by Tim
Hallo Volker,
danke für deine Antwort.
Ich habe probiert, einen eingang Einzulesen und diesen mir ausgeben zu lassen, leider bekomme ich nur den Wert "0", egal welcher Eingang betätigt wird. Kann mir wer sagen wo mein fehler ist?
Ich habe folgendes probiert:

//-------------------------------------------------------------------

#include <sys/ioctl.h>
#include <fcntl.h>
#include <stdio.h>

int main()
{

int daten[2];
const int offset=2;

while(1)
{
FILE *control;
control= fopen("/dev/piControl0", "rb");
fseek(control, SEEK_SET, offset);
fread(daten, 2, 1, control); //schreibt die werte in den bereich daten, die größe eines Blocks, anzahl der Blöcke, Stream aus dem gelsen wird
printf("\n%d",daten[0]);
fclose (control);
}
}

//--------------------------------------------------------------------------

Re: C

Posted: 16 Jun 2017, 13:40
by volker
Wie ist Deine Systemkonfiguration unter PiCtory? Was sagt der Export der Offsetliste? Was steht dort auf Offset 2?

Re: C

Posted: 16 Jun 2017, 13:43
by volker
Funktioniert denn PiTest wenn Du es aufrufts mit diesem Offset? Am besten probierst Du immer erst mal mit PiTest. Das Programm ist ja auf allen RevPis vorhanden. PiTest -r liest Daten aus dem PA. Wenn Du Deinen geplanten Offste damit korrekt auslesen kannst, dann sollte es auch mit Deinem C-Programm gehen (außer Du bekommst dort vom System Fehlermeldungen).

Re: C

Posted: 19 Jun 2017, 07:19
by Tim
Hallo Volker,
danke für dein Antwort.
Ja, unter piTest wird mir auch der Offset 2 ausgegeben.
Ich bekomme "leider" keine Fehlermeldung, aber es funktioniert trotzdem nicht.

Re: C

Posted: 19 Jun 2017, 07:24
by Tim
Hier nochmal die Exportliste.
Der Offset 2 ist hier vorgegeben.

Re: C

Posted: 19 Jun 2017, 10:07
by Timo
1.) Du hast was von Eingang 2 geschrieben, aber in deinem Beispiel gibst du nur Eingang 1 aus:
Ist: printf("\n%d",daten[0]);
Soll: printf("\n%d %d",daten[0], daten[1]);

2.) Was sagen die Rückgabewerte der Funktionen bei dir?

3.) In meinem Code verwende ich die Funktionen "open()", "lseek()" und "read()". Vielleicht klappt es damit?

Re: C

Posted: 19 Jun 2017, 10:51
by Tim
Hallo Timo,
danke für deine Antwort.
Kannst du mir ein einfaches Beispielcode dafür geben. Mit dem ich z.B. den Eingang 1 einlesen und ausgeben kann?