compiler Fehler beim Timer vergleich

Gast #3358244
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.
Persönliche Seite #3358290
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?
Gast #3358291
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 -.-
Gast #3358318
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.
Gast #3358377
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 :-/
Gast #3358972
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 ;-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren