Hallo Forum.
So, nach Tagen des Suchens geb ich auf, mich alleine durchzubeissen:
Ich hab folgendes Problem: Beim Start eines selbst erstellten C-Programms auf der FB erhalte ich die Fehlermeldung "Segmentation fault". Google spuckt aus, daß das irgendwas mit Berechtigungen zu tun hätte, kann ich mir aber nicht erklären.
Zur Vorgeschichte (habt ihr Zeit? =)
Nachdem ich hier im Forum die Idee eines Impulszählers (zählen von S0 - Impulsen von Tron) über die Fritzbox gelesen habe, wollte ich sowas für meinen Anwendungsfall selbst erstellen. Ich möchte den Sprit-Verbrauch meiner Ölheizung mitloggen. Dazu hab ich ein Koppelrelais parallel zur Öl-Einspritzpumpe geschaltet, weil deren Laufzeit direkt proportional zum Spritverbrauch ist. Eine alte Telefonleitung in den Speicher (Standort meiner Fritzbox) übermittelt jetzt den Impuls an ein über USB an die FB angeschlossenes Parallelport-Interface. Die vorhandene Signalleitung "Paper empty" wird auf ihren Zustand hin überwacht und schreibt bei Änderung einen neuen Zeitstempel und den neuen Zustand der Signalleitung in eine Log-Datei (txt-Format). Anhand der Zeitstempel kann dann sowohl die Laufzeit als auch der Spritverbrauch errechnet werden.
Soweit, sogut. Auf einem eigens eingerichteten Testrechner funktioniert das Ganze auch wunderbar. (Ubuntu-Rechner mit Code:Blocks)
Jetzt soll das Ganze auf der FB laufen. Nach einigen Wochen einlesens in Linux, Freetz, und Crosscompiling (danke übrigens an die vielen hilfreichen Forenbeiträge hier) hab ich es tatsächlich geschafft, mein c-programm umzuwandeln, ohne daß mir der Compiler Fehlermeldungen ausspuckt. Lade ich jetzt aber mein Programm auf den USB-Stick der FB und starte es per telnet-client erhalte ich nur eine Fehlermeldung "Segmentation fault".
Hab das ganze mal testhalber mit einem "HelloWorld"-C-Programm versucht, das funktioniert einwandfrei...
Bin nun mäßig verzweifelt, da ich keinen Ansatzpunkt mehr finde, nach dem ich zumindest googeln könnte. (Ach zur Info: das File ist natürlich im CHMOD 777)
Hier mal das (ich hoffe gut kommentierte) Script in C:
So, die beiden Blöcke, die mit 'Bildschirmausgabe' gekennzeichnet sind, sollen natürlich später raus, ich möchte aber in der telnet-Konsole erst mal sehen, was mein Script so treibt!
Also, dann seid bitte nachsichtig mit mir, ich hab erst nach Weihnachten mit dem Thema Linux und C-Programmierung angefangen, bin also völliger Noob...
Noch ein Wort zu meiner 'Entwicklungsumgebung' hab ein Ubuntu 13.04 mit Code:Blocks 12.11 und compiliere mit einer entpackten Toolchain des freetz-stable-2.0 für eine FB7270 v2
Danke schonmal an jeden, der sich des Problemes annimmt!
So, nach Tagen des Suchens geb ich auf, mich alleine durchzubeissen:
Ich hab folgendes Problem: Beim Start eines selbst erstellten C-Programms auf der FB erhalte ich die Fehlermeldung "Segmentation fault". Google spuckt aus, daß das irgendwas mit Berechtigungen zu tun hätte, kann ich mir aber nicht erklären.
Zur Vorgeschichte (habt ihr Zeit? =)
Nachdem ich hier im Forum die Idee eines Impulszählers (zählen von S0 - Impulsen von Tron) über die Fritzbox gelesen habe, wollte ich sowas für meinen Anwendungsfall selbst erstellen. Ich möchte den Sprit-Verbrauch meiner Ölheizung mitloggen. Dazu hab ich ein Koppelrelais parallel zur Öl-Einspritzpumpe geschaltet, weil deren Laufzeit direkt proportional zum Spritverbrauch ist. Eine alte Telefonleitung in den Speicher (Standort meiner Fritzbox) übermittelt jetzt den Impuls an ein über USB an die FB angeschlossenes Parallelport-Interface. Die vorhandene Signalleitung "Paper empty" wird auf ihren Zustand hin überwacht und schreibt bei Änderung einen neuen Zeitstempel und den neuen Zustand der Signalleitung in eine Log-Datei (txt-Format). Anhand der Zeitstempel kann dann sowohl die Laufzeit als auch der Spritverbrauch errechnet werden.
Soweit, sogut. Auf einem eigens eingerichteten Testrechner funktioniert das Ganze auch wunderbar. (Ubuntu-Rechner mit Code:Blocks)
Jetzt soll das Ganze auf der FB laufen. Nach einigen Wochen einlesens in Linux, Freetz, und Crosscompiling (danke übrigens an die vielen hilfreichen Forenbeiträge hier) hab ich es tatsächlich geschafft, mein c-programm umzuwandeln, ohne daß mir der Compiler Fehlermeldungen ausspuckt. Lade ich jetzt aber mein Programm auf den USB-Stick der FB und starte es per telnet-client erhalte ich nur eine Fehlermeldung "Segmentation fault".
Hab das ganze mal testhalber mit einem "HelloWorld"-C-Programm versucht, das funktioniert einwandfrei...
Bin nun mäßig verzweifelt, da ich keinen Ansatzpunkt mehr finde, nach dem ich zumindest googeln könnte. (Ach zur Info: das File ist natürlich im CHMOD 777)
Hier mal das (ich hoffe gut kommentierte) Script in C:
Code:
#include <stdio.h>
#include <unistd.h>
#include <time.h>
#include </home/freetz/Documents/ppdev.h>
#include <sys/ioctl.h>
#include <fcntl.h>
int main(void)
{
//Variablendeklaration
FILE* datei;
int aktSek=0, CH=0, lastCH=-1, port=-1, signal=0;
char dateiname[256]="";
unsigned char rm;
struct tm *LokalZeit;
time_t Zeit;
time(&Zeit);
LokalZeit = localtime(&Zeit);
//Starte Endlosschleife
while (1)
{
//Zeit neu einlesen
time(&Zeit);
LokalZeit = localtime(&Zeit);
//Neustart der Schleife, wenn aktSek bereits die aktuelle Sekunde ist
if (aktSek == LokalZeit->tm_sec)
{continue;}
//Bildschirmausgabe, später löschen
printf("%02d:%02d:%02d;CH:%1d;lastCH:%1d;signal:%1d;port:%1d\n",
LokalZeit->tm_hour,
LokalZeit->tm_min,
LokalZeit->tm_sec,
CH,
lastCH,
signal,
port
);
//Schreibe die aktuelle Sekunde in aktSek
aktSek = LokalZeit->tm_sec;
//Parallelport öffnen
port = open ( "/dev/usblp0", O_RDWR );
ioctl( port, PPCLAIM, NULL );
//Register lesen
ioctl (port, PPRSTATUS, &rm);
//Bit 5 (Paper empty) auswerten (ist aktiv 0)
signal = rm & 32;
//Wenn Bit gesetzt, also 0, die Variable "signal" auf 1 setzen
if (port == -1)
{CH = -1;}
else
if (signal == 0)
{CH = 1;} else {CH = 0;}
//Parallelport schließen
ioctl (port, PPRELEASE, NULL);
close (port);
//Schleife wiederholen wenn der Zustand von CH gleich geblieben ist, ansonsten neuen Wert merken
if (lastCH == CH)
{continue;}
else
{lastCH = CH;}
//Generiere Variable "dateiname" aus JJJJ-MM-TT + .txt
sprintf (
dateiname, "Daten %04d-%02d-%02d.txt",
LokalZeit->tm_year+1900,
LokalZeit->tm_mon+1,
LokalZeit->tm_mday
);
//Öffne (oder erstelle) die Datei
datei=fopen(dateiname,"a");
//Schreibe Zeitstempel und Signalzustand
fprintf(datei, "%02d:%02d:%02d;%1d\n",
LokalZeit->tm_hour,
LokalZeit->tm_min,
LokalZeit->tm_sec,
CH
);
//Schließe die Datei
fclose(datei);
//Bildschirmausgabe, später löschen
printf("schreibe Zeitstempel\n");
}
//Programmende
return 0;
}
Also, dann seid bitte nachsichtig mit mir, ich hab erst nach Weihnachten mit dem Thema Linux und C-Programmierung angefangen, bin also völliger Noob...
Noch ein Wort zu meiner 'Entwicklungsumgebung' hab ein Ubuntu 13.04 mit Code:Blocks 12.11 und compiliere mit einer entpackten Toolchain des freetz-stable-2.0 für eine FB7270 v2
Danke schonmal an jeden, der sich des Problemes annimmt!