Forum: PC-Programmierung Debian 8 zu 9.6 und timer_settime schlägt nun fehl.


von Mw E. (Firma: fritzler-avr.de) (fritzler)


Angehängte Dateien:

Lesenswert?

Was ist die Definition von defekt?
Gestern gings noch! (Oder so ähnlich)

Ich hab hier einen kleinen MIPS Emulator geschrieben und der 
funktioniert eigentlich.
Unter anderem wird auch eine Videokarte emuliert welche einen VSYNC IRQ 
generiert und das mit einem Timer.
Unter Debian8 lief das bestens, aber nach einem Dist Upgrade auf 9.6 
bekomme ich ERRNO 22 (Invalid Argument) bei timer_settime in Z.174.

Der Code ist im Anhang in der Funktion video_init.

Hat da wer ne Idee wieso das auf einmal rumzickt?

In der Manpage: 
http://man7.org/linux/man-pages/man2/timer_settime.2.html
steht drinne, dass keiner der Argumente von timer_settime NULL sein 
darf.
Aber bei allen Beispielen ist old_value immer NULL, weil mans eh nie 
braucht.
Selbst dort einen Pointer reinwerfen ändert nichts am Problem.

von Rolf M. (rmagnus)


Lesenswert?

Mw E. schrieb:
> Unter Debian8 lief das bestens, aber nach einem Dist Upgrade auf 9.6
> bekomme ich ERRNO 22 (Invalid Argument) bei timer_settime in Z.174.

Woher weißt du das denn? Du gibst den Fehler nirgends aus.

> Hat da wer ne Idee wieso das auf einmal rumzickt?

Vergleiche mal die Signatur:
1
int timer_settime(timer_t timerid, int flags,
2
                  const struct itimerspec *new_value,
3
                  struct itimerspec *old_value);

mit deinem Aufruf:
1
ret = timer_settime(&irq_vsync_timer, 0, &irq_zeitbasis, NULL);

Insbesondere das erste Argument.

von Hau Wech (Gast)


Lesenswert?

Scheint eine Kernel - Funktion zu sein .

Der Kernel wird sehr viel an Codeänderungen haben ,
aber auch eine DotConfig .config -Änderung wäre möglich .

Die Werte irq_vsync_timer und irq_zeitbasis könnten nicht vorhanden sein 
,
und ungeprüft in den Aufruf gelegt sein .

Wer weiß , ob dieses  irq_vsync_timer sich verändert hat , und mehr oder 
weniger Werte enthält .

Schnelle Alternativen :
# Alten Kernel in Bootloader eintragen und booten
# Neuen Kernel mit funktionierender .config recompillieren

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Die Fehlernummer hat mir der GDB zugesteckt.
Im GDB kannste dir __errno_location() anzeigen lassen und dann lesen was 
da steht.

Aber ja facepalm, Klassiker.
Das ist zu feste bei drinne Handles als Pointer zu übergeben.
Interessant was für Schweinereien per Zufall funktionieren.
Das hätte ja eigentlich nie funktionieren dürfen.

Läuft jetz wieder, danke fürs drauf stoßen!

: Bearbeitet durch User
von Rolf M. (rmagnus)


Lesenswert?

Hau Wech schrieb:
> Scheint eine Kernel - Funktion zu sein .

Es handelt sich um einen POSIX-Standard-Systemaufruf.

PS: Du plenkst!

Mw E. schrieb:
> Die Fehlernummer hat mir der GDB zugesteckt.
> Im GDB kannste dir __errno_location() anzeigen lassen und dann lesen was
> da steht.

Wäre es nicht einfacher, perror() zu verwenden oder alternativ 
strerror(errno) in deinen eh schon vorhandenen printf() einzubauen? Dann 
musst du nicht immer den Debugger bemühen, um eine brauchbare 
Fehlermeldung zu bekommen.

> Läuft jetz wieder, danke fürs drauf stoßen!

Gerne!

von DPA (Gast)


Lesenswert?

Mw E. schrieb:
> Aber ja facepalm, Klassiker.
> Das ist zu feste bei drinne Handles als Pointer zu übergeben.

Da sollte doch eigentlich der Compiler mindestens warnen. Ich empfehle, 
immer die Optionen -std=c99 -Wall -Wextra -pedantic -Werror mitzugeben, 
dann kompiliert sowas gar nicht erst.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Ja eigentlich sollte das ne Warnung geben.
Den Fehler hab ich kurz nochmal eingebaut, gab aber keine (gcc 6.3.0).
-Wall -Wextra nutze ich immer.

Selbst mit -pedantic und c99 kommt da keine Warnung.

Das ist wohl das typische Problem wenn durch typedefs bereits ein 
Pointer wegabstrahiert wird.

Denn static timer_t irq_vsync_timer; ist ein Pointer und wird von 
timer_create alloziert und gefüllt.
Da ich es da als Pointer reinwerfen musste hab ichs bei timer_settime 
wohl auch direkt so getan.

Aber eigentlich sollte der gcc mitbekommen, dass er da einen Pointer auf 
einen Pointer bekommt statt einem Pointer kopfkratz.

Hangeln wir uns doch mal lang:
- time.h enthält die Funktionen, aber timer_t liegt in sys/types.h
- sys/types.h sagt: typedef  __timer_t  timer_t;
- glibc/posix/bits/types.h sagt: __STD_TYPE __TIMER_T_TYPE __timer_t;
- glibc/sysdeps/unix/sysv/linux/x86/bits/typesizes.h sagt: #define 
__TIMER_T_TYPE void *

Ja geil nen Voidpointer!

von Rolf M. (rmagnus)


Lesenswert?

Mw E. schrieb:
> Ja geil nen Voidpointer!

Na dann ist es ja kein Wunder.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Das meinte ich auch mit der abschließenden Zeile.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.