Forum: Compiler & IDEs Parameter wird nicht korrekt übergeben


von Florian (Gast)


Lesenswert?

Hallo


Ich habe ein Problem mit der Parameterübergabe an eine Funktion.

Und zwar sieht das folgendermaßen auf.

In der main()-Funktion rufe ich set_leds() auf:
1
#define LED_OFF 0
2
#define LED_ON  1
3
4
...
5
if(   PIND & (1<<PLED1)  )
6
   set_leds(LED_ON, 5);
7
if( !(PIND & (1<<PLED1)) )
8
   set_leds(LED_OFF,5);

Der Code tut eigentlich erst einmal nichts anderes als ständig eine LED 
aus- und einzuschalten. Das ist aber unwesentlich. Wesentlich ist hier 
nur, dass ich die Funktion set_leds() aufrufe und ihr 2 Werte übergebe.
Einmal ein Makro, einmal einen diskreten Wert.

In der aufgerufenen Funktion jedoch kommt immer nur der erste Parameter 
an.

Der Prototyp der Funktion sieht so aus:
1
U_INT8 set_leds(U_INT8 status, U_INT8 ledname);

Das interessante ist jetzt, dass immer nur der 2. Parameter tatsächlich 
übergeben wird, der andere nicht!!

Im obigen Code kann ich mir also den Wert von ledname=5 direkt im 
Debugger anschauen. status hat jedoch "Location not valid" und der Wert 
von status wird auch nicht korrekt analysiert.

Vertauscht man die 2 Parameter in der Reihenfolge ist das Spiel das 
selbe. Dann kann man status im Debugger sehen und ledname ist dann 
"Location not valid".


Ich nutze AVR Studio Version 4.13. An was kann das liegen??? Das ist 
doch nicht normal...

von Stefan E. (sternst)


Lesenswert?

Florian wrote:

> Das interessante ist jetzt, dass immer nur der 2. Parameter tatsächlich
> übergeben wird, der andere nicht!!

Aller Wahrscheinlichkeit nach werden die Parameter korrekt übergeben, 
und der Fehler steckt in deiner Auswertung der Parameter.
Poste doch mal den Sourcecode von set_leds.

> ... Debugger ... "Location not valid" ... AVR Studio ...

Das hat nichts zu sagen. Der Debugger hat so seine Probleme mit 
Parametern und lokalen Variablen.

von Florian (Gast)


Lesenswert?

Danke für die Hilfe!

Ich hab das ganze jetzt mal etwas umgeschrieben und der gesamte Code 
sieht so aus:
1
U_INT8 set_leds(U_INT8 status, U_INT8 ledname)
2
{
3
  
4
    if(ledname == 5)
5
    {
6
    if(status==1)
7
        PORTD |=  (1<<LED1);
8
9
    else if(status==0)
10
      PORTD &= ~(1<<LED1);    
11
    }
12
  
13
  return 0;
14
}
15
16
17
int main(void)
18
{
19
  U_INT8 control = 0;
20
21
  PORTD |= (1<<LED1)| (1<<LED2);
22
23
  PORTD &= ~( (1<<LED1)| (1<<LED2) );
24
  DDRD  |= (1<<LED1) | (1<<LED2);
25
26
    control = set_leds(0,5);
27
  PORTD |= (1<<LED1)| (1<<LED2);
28
29
  return 0;
30
}

Was ich hier wieder nicht verstehe...
Der Debugger geht hier überhaupt nicht mehr in meine Funktion set_leds() 
rein. Ich verstehs absolut nicht.

Der Debugger setzt bis zur Zeile:
DDRD  |= (1<<LED1) | (1<<LED2);
alle Bits genau wie er soll, überspringt dann
control = set_leds(0,5);

und macht mit der nächsten weiter...
Er springt wirklich nicht rein. Single-Step, Breakpoints etc. schon 
alles versucht,...

Ist natürlich nur ein Testcode hier, ich weis, dass der Code ansonsten 
Bullshit ist ;-) Aber der ursprüngliche war weit komplizierter...

von Florian (Gast)


Lesenswert?

Hat sich erledigt :-)

Ich hab die Compiler Optimierung drin gehabt und die Funktionen eben 
nicht mit volatile versehen. Nachdem ich das Attribut hinzugefügt habe 
ist Ruhe und der Compiler optimiert mir nicht mehr ganze Funktionen 
heraus ;-)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Der hat dir auch vorher nichts ,,rausoptimiert'', sondern wird die
(völlig primitive) Funktion einfach inline erweitert haben, weil
das den kleineren und schnelleren Code erzeugt hat.

Schalt die Optimierung wieder ein.  "volatile" gibt es nur für Objekte,
nicht für Funktionen (was sollte es dort auch tun?).  Benutze keine
Testcases, die praktisch nichts mehr an wirklicher Aufgabe enthalten.

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.