Forum: Compiler & IDEs compiler Fehler beim Timer vergleich


von Bauer (Gast)


Lesenswert?

Hallo Zusammen

Ich hoffe ihr könnt mir weiterhelfen. Es ist eigentlich eher ein 
grundlegendes C Problem als speziefisch eines mit Timer.

Folgendes:
Ich habe verschiedene hrtimer in einem Linux Kernel Modul am laufen. Die 
sind in einem Array pwm_devices[] organisiert. Ist ein solcher hrtimer 
abgelaufen wird immer dieselbe callback Funktion aufgerufen.

In dieser callback Funktion muss ich herausfinden welcher hrtimer nun 
die callback Funktion aufgerufen hat.
Aber gerade dieser Vergleich scheint dem compiler nicht zu gefallen.

Der compiler meint:
invalid operands to binary == (have 'struct hrtimer' and 'struct hrtimer 
**')

Es geht eigentlich nur um den Vergleich:
if(pwm_devices[i].pwmHRTimer == &timer){

Was mach ich falsch?

Der Callback code:
1
enum hrtimer_restart my_hrtimer_callback( struct hrtimer *timer )
2
{
3
  int i;
4
  ktime_t now;
5
6
  for(i = 0; i < PWM_DEVICES; i++){
7
    if(pwm_devices[i].pwmHRTimer == &timer){
8
      now = hrtimer_cb_get_time( &pwm_devices[i].pwmHRTimer );
9
10
      //if the hightime flag was true then set the lowtimer as next
11
      if(pwm_devices[i].highTimer_active){
12
        hrtimer_forward( &pwm_devices[i].pwmHRTimer, now, pwm_devices[i].ktime_lowtime);
13
      }
14
      else{
15
        hrtimer_forward( &pwm_devices[i].pwmHRTimer, now, pwm_devices[i].ktime_hightime);
16
      }
17
18
      pwm_devices[i].highTimer_active = (pwm_devices[i].highTimer_active == 1 ? 0 : 1);
19
20
      /* Set PIN Value */
21
      gpio_set_value(pwm_pins[i].gpio, pwm_devices[i].highTimer_active);
22
23
      break;
24
    }
25
  }
26
  
27
  return HRTIMER_RESTART;
28
}

Bin um jeden Vorschlag dankbar.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Du kannst keine Strukturen vergleichen sondern nur Skalare und Pointer.

von (prx) A. K. (prx)


Lesenswert?

Bauer schrieb:
> Es geht eigentlich nur um den Vergleich:
> if(pwm_devices[i].pwmHRTimer == &timer){

if(&pwm_devices[i].pwmHRTimer == timer){

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Bauer schrieb:
> if(pwm_devices[i].pwmHRTimer == &timer){

Du willst nicht die Adresse des Pointers "timer" vergleichen, also lass 
den Adressoperator & weg.

Ich nehme an, daß das Strukturelement pwmHRTimer ein Pointer vom Typ 
struct hrtimer * ist, ist es das nicht, sondern eine eingebettete 
Struktur, dann brauchst Du wieder einen Adressoperator -- und zwar auf 
der anderen Seite des Vergleichs.

Wie ist pwm_devices definiert?

von ... (Gast)


Lesenswert?

Johann L ist dumm. Der sagt völligen unfug.
A.K vergleicht adressen. kann sinn haben, muss aber nicht.
Ich:

if(pwm_devices[i].pwmHRTimer == *timer)

vergleiche den Inhalt der Strukturen.

Such dir eine variante aus. Allerdings... ach vergisses. wirst schon 
wissen, warum du das nicht selbst verstehst, was du tust -.-

von (prx) A. K. (prx)


Lesenswert?

... schrieb:
> Johann L ist dumm. Der sagt völligen unfug.

;-)

> vergleiche den Inhalt der Strukturen.

Schon mal versucht?

von ... (Gast)


Lesenswert?

ööhm. bin ich vllt dumm? :-O
hab bis jetzt mit Struct-Vergleich noch nie probleme gehabt :-/
Vielleicht liegts aber auch daran, dass ich die immens schlaue 
entscheidung treffe, beim Softwarekontzept C zu vermeiden. C++ rockt das 
haus.

von (prx) A. K. (prx)


Lesenswert?

... schrieb:
> C++ rockt das haus.

Von Haus aus gibts den Vergleichsoperator da aber auch nicht. Der 
einzige Unterschied ist, dass du ihn selber definieren kannst.

von ... (Gast)


Lesenswert?

na nun ist aber gut. C++ hat implizite vergleichoperatoren drin. Das 
vergleicht die Struktur auf elementebene. Kan KANN den = Operator 
überladen, muss es aber nicht.
Und C sollte das eigentlich auch können :-/

von (prx) A. K. (prx)


Lesenswert?

... schrieb:
> na nun ist aber gut. C++ hat implizite vergleichoperatoren drin. Das
> vergleicht die Struktur auf elementebene.

Das wäre mir neu. Welcher Compiler macht das von sich aus, oder ab wann 
ist das in C++ drin?

von Bauer (Gast)


Lesenswert?

Danke für die Inputs.

@A.K:
     &pwm_devices[i].pwmHRTimer == timer
     würde bedeuten, dass timer exact derselbe Timer wie pwmHRTimer ist. 
Sonst würde es nicht funktionieren. Das muss ich heute Abend testen.

@Rufus:
      ja, pwmHRTimer ist eine eingebetete Struktur innerhalb meiner 
eigenen Struktur pwm_devices. evtl würde es mehr Sinn machen einen 
pointer auf den Timer zu halten und nicht die Struktur.

Ich werde mich wieder melden wenn ich es ausprobieren kann.
Danke schon mal.

PS: ja C++ ist auch nicht schlecht ;-)

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.