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

Ich hab es jetzt auch noch auf eine 7270 gebracht. Funktioniert genauso.

Wenn es wie oben angegeben mit RudiShell nicht geht, zur Not auf "Text" umbauen zur Übertragung und dann nachher zurück:
Code:
# auf dem Linux-System
uuencode zaehler zaehler  > z.uu

# z.uu auf die Box bringen (nach /tmp), dort:
cd /tmp
uudecode z.uu
./zaehler
 
Ich werd porös: Es funktioniert !

Wow, das war gerade eine Aktion:
Also: Versuch, den gcc-Compiler downzugraden endete in der Katastrophe, daß ich kein make menuconfig mehr aufrufen konnte, weil er fehlende Programmteile angemeckert hat. Kompilieren ging auch nicht mehr
Nach einigen erfolglosen Update und Upgrade-Versuchen hat er dann zumindest die Sourcen neu gezogen und installiert. 'make menuconfig' ging immer noch nicht.
Also hab ich schweren Herzens den kompletten Ordner gelöscht und den Freetz-stable-2.0 nochmal komplett neu gezogen, entpackt, 'make menuconfig' durchgeführt (klappte auch), make laufen lassen, die Toolchain mit make Toolchain neu entpackt, die Libs mit make libs neu erstellt und folgende Einstellungen erneuert:
Code:
export PATH=/pfad/zu/freetz/toolchain/target/bin:$PATH
Dann hab ich in das noch bestehende (alte) Verzeichnis vom GC-3.4.6 gewechselt und
Code:
LDFLAGS=-static ./configure
und
Code:
./configure --build=i386-linux-gnu --target=mipsel-linux --host=mipsel-linux CC="mipsel-linux-gcc" CFLAGS="-Os -pipe -march=4kc -Wa,--trap"
(was nicht komplett fehlerfrei durchlief) ausprobiert.
Abschließend ein MAKE und dann direkt im User-Documents -Verzeichnis ein
Code:
mipsel-linux-uclibc-gcc main.c -oDatenlogger
Per FTP im Binary-Modus übertragen, obligatorischer CHMOD 777 und mit ./Datenlogger gestartet. LÄUFT!

Ich weiß jetzt nicht genau, woran es gelegen hat, ich kann jedem, der sich sein System baut nur empfehlen VOR der Installation von Freetz einen 3.4.6er GCC-Compiler in ein separates Verzeichnis zu legen. Dann kommt er auch ans configure-File dran. Das wäre jetzt mein einziger Anhaltspunkt, dass hier einige Zeiger gründlich verbogen waren...

Trotzdem ein dickes Danke an Euch für Eure Geduld und Hilfe. Schreibe in den nächsten Tagen mal, was so läuft. Vielleicht kanns ja noch jemand anders brauchen.
 
Jetzt aber bitte noch (gerne auch morgen) die Fragen beantworten, was du getan hast. Es weiß noch immer niemand, woher das ominöse "configure" kommt, und wofür man das für das im ersten Beitrag genannte Progrämmchen braucht.
Ich hoffe du hast nicht ein "configure" vom GCC gemacht? Oder versucht, den neu zu übersetzen?!?
Und wenn du das wirklich gemacht hast, was hat das mit dem Aufruf des mipsel-compilers zu tun?

Dann wäre auf jeden Fall noch nett, wie du darauf kommst, dass du den 3.4-er Compiler brauchst?
Wie kommt es, dass du Programme, die problemlos funktionieren, auf deiner Box nicht ausführen konntest?

Ich habe spaßeshalber mal dein Programm auf der Box ausgeführt: Die zwingst du damit vollständig in die Knie.
Ich hatte mir das Programm nicht weiter angesehen, aber du hast keinerlei "Warten" da drin, das Programm klaut alle CPU-Zeit. Das mag einen Desktop-PC nicht stören, aber die FB schon:
Code:
root@fritz:/var/mod/root# dmesg | grep zaehler
[0]system-load 2  75 tasks:4 % curr:zaehler_mipsel_(4 %) max:zaehler_mipsel_(4 %, pid:3683), readytorun: 1, pgfault 40/s (max 1 avg 1.0)
[0]system-load 100 % 75 tasks:100 % curr:zaehler_mipsel_(99 %) max:zaehler_mipsel_(99 %, pid:3683), readytorun: 1, pgfault 15/s (max 1 avg 1.0)
[0]system-load 100 % 75 tasks:100 % curr:zaehler_mipsel_(99 %) max:zaehler_mipsel_(99 %, pid:3683), readytorun: 1, pgfault 15/s (max 1 avg 1.0)
[0]system-load 2  75 tasks:0 % curr:zaehler_mipsel_(0 %) max:zaehler_mipsel_(0 %, pid:3731), readytorun: 1, pgfault 19/s (max 1 avg 1.0)
[0]system-load 100 % 75 tasks:100 % curr:zaehler_mipsel_(99 %) max:zaehler_mipsel_(99 %, pid:3731), readytorun: 1, pgfault 15/s (max 1 avg 1.0)
[0]system-load 100 % 75 tasks:100 % curr:zaehler_mipsel_(99 %) max:zaehler_mipsel_(99 %, pid:3731), readytorun: 1, pgfault 15/s (max 1 avg 1.0)
[0]system-load 100 % 75 tasks:100 % curr:zaehler_mipsel_(99 %) max:zaehler_mipsel_(99 %, pid:3731), readytorun: 3, pgfault 15/s (max 1 avg 1.0)
[0]system-load 100 % 76 tasks:96 % curr:zaehler_mipsel_(95 %) max:zaehler_mipsel_(95 %, pid:3731), readytorun: 1, pgfault 462/s (max 1 avg 1.0)
[0]system-load 100 % 77 tasks:100 % curr:zaehler_mipsel_(98 %) max:zaehler_mipsel_(98 %, pid:3731), readytorun: 1, pgfault 45/s (max 1 avg 1.0)
[0]system-load 100 % 77 tasks:100 % curr:zaehler_mipsel_(98 %) max:zaehler_mipsel_(98 %, pid:3731), readytorun: 1, pgfault 15/s (max 1 avg 1.0)
[0]system-load 100 % 77 tasks:100 % curr:zaehler_mipsel_(98 %) max:zaehler_mipsel_(98 %, pid:3731), readytorun: 1, pgfault 15/s (max 1 avg 1.0)
root@fritz:/var/mod/root#
Also, denke dir was anderes aus, oder mach es per Skript (wie hier).
So mal auf die Schnelle (mit Umleitung des Fehlers auf stdout, um auch den Fall ohne USB-LPT abzufangen):
Code:
#!/bin/sh
while true; do
        # Aus (PE offen) Status 2
        # An (PE auf GND) Status 0
        STAT=$(cat /var/log/printer_status 2>&1)
        if [ -z "$STAT" ]; then
                echo "FEHLER" > $(date +%Y%m%d_%H%M%S).txt
                sleep 10
        else
                echo "$STAT" > $(date +%Y%m%d_%H%M%S).txt
                while  cat /var/log/printer_status 2>&1 | grep -q "$STAT"  ; do
                        sleep 1
                done
        fi
done
 
Zuletzt bearbeitet:
Hallo Max. Entschuldige die Wartezeit, aber ich hatte diese Woche zu tun. Ich werde Dir Deine Fragen aber gern beantworten:

Das File 'configure' ist wohl bei der Installation des Compilers mit dabei. Bei der entpackten Toolchain meiner 'ersten' Installation hat es entweder gefehlt, oder der Pfad wurde von mir fasch angegeben. Ich weiß es nicht. Aber ein Aufruf des configure-files wie oben beschrieben (übrigens von der webseite freetz.org abgekupfert) hat nicht funktioniert.
Dann hab ich probiert, den GCC-Compiler Version 3.4.6 zu installieren, was zu dem oben beschriebenen Desaster führte.

NACH dem Löschen des Freetz-Verzeichnisses und dem neu donwloaden und installieren der Sourcen funktioniert nicht nur der Aufruf des besagten Files mit den o.g. Einstellungen sondern auch das cross-compilieren mit der entpackten Toolchain mit dem MIPSEL-Compiler.

Soweit, so gut...

Zu Deiner Frage nach dem Programm:
Gleich mal vorweg: von Scripten hab ich ungefähr soviel Ahnung wie eine Kuh vom Synchronschwimmen...
Meine Programmierkenntnisse in C und der Umgang mit Linux erstrecken sich auf das, was ich mir in den letzen 4-5 Monaten selbst beigebracht habe.
Der Hintergrund des ganzen ist im Eröffnungsbeitrag hier beschrieben: Ich brauche (bzw. hätt ich's einfach gern) ein Programm, welches mir die Einschaltzeiten meines Heizungsbrenners mitschreibt. Also als Logfile. Dazu missbrauche ich den Parallel-Port (eben das 'Paper-empty'-Flag) welches mit Hilfe einer kleinen Zusatzschaltung (ein Koppelrelais parallel zur Einspritzpumpe des Brenners) immer dann den Zustand wechselt, wenn mein Heizungsbrenner ein- und ausschaltet.
Da die Einspritzmenge der Pumpe immer gleich ist, ist die Einschaltzeit direkt proportional zum Verbrauch, also kann ich darüber das verbrauchte Heizöl berechnen).

Mein Programm macht jetzt nichts anderes, als jede Sekunde zu prüfen, ob die Pumpe (das 'Paper-empty'-Flag) ein oder aus ist, und schreibt bei Zustandsänderung einen Zeitstempel nach dem Muster "hh:mm:ss;{1 oder 0}" in eine Datei mit dem Namen "Daten JJJJ_MM_TT" (also jeden Tag eine neue Datei) auf den angeschlossenen USB-Stick.

Das mit dem 'wait'-Befehl klingt sehr interessant, das schau ich mir mal an, ob ich dadurch die CPU-Last runterkriege, eigentlich reicht es mir ja dicke, wenn die Box sagen wir mal alle 250ms mal nachschaut. Das entspräche ja immer noch 4 Zyklen pro Sekunde...

Dass meine Lösung nicht das Ideal ist, denke ich mir, ich hab auch grad noch Probleme den Parallel-Port abzufragen. Wenn es eine Lösung per Script gibt, die besser oder gleich-gut funktioniert, eleganter ist und mit weniger Aufwand sowohl zu ändern als auch in der Box einzuspielen ist, (so dass sie auch einen Reset überlebt) dann bitte her damit. Bin für jeden Vorschlag dankbar! Ich will nur, dass der ganze Schmonzenz mal funktioniert.

Ich hoffe, Dir Deine Fragen damit zur Zufriedenheit beantwortet zu haben. Wenn nicht, frag ruhig nochmal nach, dann liegts wohl an mir...
Würde mich freuen, wenn Du mir in kurzen Worten mal erklären könntest, was Dein oben stehendes Script denn so macht (Explizit der Teil innerhalb der ELSE-Anweisung) und wo in meinem Freetz ich das einbauen muss, damit es auch nach einem Neustart wieder startet. Danke schonmal!
 
Hi,

danke für die Antwort. Wenn ich es so lese, war meine "Befürchtung" wohl berechtigt, du hast die viel unnötige Arbeit gemacht, die "nix mit dem Programm zu tun hatte".

Wenn du wirklich nur dein Programm übersetzen wolltest, ist dafür ein "configure" keinesfalls nötig. Du hast damit irgendein Programm (vermutlich einen GCC) konfiguriert. Das hat aber nichts mit dem Programm zu tun. Das ließe sich problemlos mit der Download-Toolchain übersetzen, dafür wäre wohl nie ein configure nötig. Das wollte ich nur "klarstellen", nicht dass jemand den Beitrag später mal liest, und das "nachvollzieht".

Dein Programm hat "den Fehler", dass es nicht wie du wolltest "jede Sekunde" prüft, sondern dass deine Schleife "immer läuft", und nur dann, wenn zufällig eine Sekunde rum ist, etwas "sinnvolles tut". Mein Vermutung wäre, dass damit deine Box "nix anderes" mehr tut bis hin zu völlig "stillsteht".
Besser wäre, zwischendrin zu warten (z.B. mal 500 ms verstreichen lassen mit "usleep(500);" oder "poll(0, 0, 500);" oder so, dann kann die Box zwischendrin was anderes tun)

zum Script:
Code:
#!/bin/sh
while true; do
        # STAT den Status des LPT zuweisen, das 2>&1 schreibt auch Fehler in diese Variable (leitet Fehler um). 
        # Hier (für PE):
        # Aus (PE offen) Status 2
        # An (PE auf GND) Status 0
        STAT=$(cat /var/log/printer_status 2>&1)

        # Steht was in der Variable "STAT", oder ist sie leer?
        if [ -z "$STAT" ]; then
                echo "FEHLER" > $(date +%Y%m%d_%H%M%S).txt
                sleep 10
        else
        # o.k, nicht leer, also was tun. 
        # etwas in $() wird ausgeführt, hier mit "$(date ...)" das Datum im Format JahrMonatTag_StundeMinuteSekunde
        # wir schreiben also einmal den aktuellen Zustand (möglichst 0 oder 2, ggf. auch einen Fehler) in eine Datei namens <Datum_Zeit>.txt
                echo "$STAT" > $(date +%Y%m%d_%H%M%S).txt
        # Solange sich der Status nicht geändert hat, abwarten (eine Sekunde) und erneut prüfen, denn wir wollen nur "Änderungen protokollieren"
                while  cat /var/log/printer_status 2>&1 | grep -q "$STAT"  ; do
                        sleep 1
                done
        # Wenn wir hier sind, hat sich der Zustand des PE gegenüber STAT geändert, 
        # der "neue Zustand" wird dann beim nächsten Durchlauf der "äußeren Schleife" protokolliert
        fi
done
 
Zuletzt bearbeitet:
Kostenlos!

Statistik des Forums

Themen
248,853
Beiträge
2,302,887
Mitglieder
378,502
Neuestes Mitglied
bimbomix75