www.mikrocontroller.net

Forum: Compiler & IDEs Parameter wird nicht korrekt übergeben


Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#define LED_OFF 0
#define LED_ON  1

...
if(   PIND & (1<<PLED1)  )
   set_leds(LED_ON, 5);
if( !(PIND & (1<<PLED1)) )
   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:
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...

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Hilfe!

Ich hab das ganze jetzt mal etwas umgeschrieben und der gesamte Code 
sieht so aus:

U_INT8 set_leds(U_INT8 status, U_INT8 ledname)
{
  
    if(ledname == 5)
    {
    if(status==1)
        PORTD |=  (1<<LED1);

    else if(status==0)
      PORTD &= ~(1<<LED1);    
    }
  
  return 0;
}


int main(void)
{
  U_INT8 control = 0;

  PORTD |= (1<<LED1)| (1<<LED2);

  PORTD &= ~( (1<<LED1)| (1<<LED2) );
  DDRD  |= (1<<LED1) | (1<<LED2);

    control = set_leds(0,5);
  PORTD |= (1<<LED1)| (1<<LED2);

  return 0;
}


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...

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.