Parameter wird nicht korrekt übergeben

Gast #930634
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...
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.
Gast
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...
Gast
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 ;-)
Moderator Persönliche Seite
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 18 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.