Quantcast
Channel: IP-Phone-Forum
Viewing all articles
Browse latest Browse all 15636

[Problem] Probleme mit Crosscompiling: Fehler "Segmentation fault"

$
0
0
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:

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;
}

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!

Viewing all articles
Browse latest Browse all 15636


<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>