extern Funktionsprototyp + Aufruf

OP #3180114
Lesenswert?

in der header steht:

#define PORT_LED    PORTA
#define LED_GRUEN    PINA3

extern void LedOn(uint8_t PinNummer, uint8_t Port);

und in der c sieht das wie folgt aus:

void LedOn(uint8_t PinNummer, uint8_t Port)
{
  Port |= (1<<PinNummer);
}
int main(void)
{
/* Initialisierungen */
TimerInit();
IoInit();
Uart0Init(UBRR_BERECHNUNG(BAUD_RATE,F_CPU));

/* UART0 Test, einmalig */
Uart0Puts("\n\n\n\r");
Uart0Puts("UART OK\n\r");

/* LED Test */
LedOn(LED_GRUEN,PORT_LED);
_delay_ms(500);

sei();

while(1){}
}

In diesem leuchtet die LED gar net auf. Ersetze ich jedoch
LedOn(LED_GRUEN,PORT_LED);
durch
PORT_LED |= (1<<LED_GRUEN);

dann leuchtet diese auf... ich kann nicht ersehen wo der wurm ist
programmieren tu ich unter AS6...
apropo, weiß jemand wo ich AS6.1 her kriege, außer von atmel.com?
Gast #3180126
Lesenswert?

aber ich glaube das ganze ist eh nicht gut für den Optimierer, ich bin 
mir nicht sicher ob er es wirklich zu einem "set pin" umwandelt. Vermute 
fast, das er jedesmal den Port liest, das oder macht und den Port wieder 
screibt.

Soetwas macht man mit einem Makro, dann gibt es auch dein Problem nicht 
mehr.
#3180171
Lesenswert?

Michael B. schrieb:
> Probiers mal mit:
>
> extern void LedOn(uint8_t PinNummer, volatile uint16_t Port);
>
> void LedOn(uint8_t PinNummer, volatile uint16_t Port)
> {
>   Port |= (1<<PinNummer);
> }
>
> oderso.

Würde auch noch nichts helfen

void LedOn(uint8_t PinNummer, volatile uint16_t* Port)
{
  *Port |= (1<<PinNummer);
}

so würde es gehen. Aber eigentlich möchte man das nicht, weil der 
Optimizer dann nur noch in speziellen Fällen eine Chance hat, das auf 
die kürzest mögliche Form zu bringen (er muss die Funktion inlinen 
können, um eine Chance zu haben)
#3180181
Lesenswert?

Rafi Dafi schrieb:

> sollten makros mit bedacht eingesetzt werden... gibts nachteile beim
> einsatz?

Generell gesehen: Natürlich.
Man muss immer im Hinterkopf haben, dass Makros nur eine Textersetzung 
sind und nicht mehr. D.h. ein Makro wird (mehr oder weniger) genau so 
aufgelöst, als ob du im Editor ein Copy&Replace machen würdest.
Das kann manchmal gut gehen, das kann manchmal aber auch ins Auge gehen. 
Daher ist es wichtig, dass man als Programmierer weiß, dass man es mit 
einem Makro zu tun hat.
Und genau deswegen gibt es die einzige Konvention, an die sich weltweit 
alle C-Programmierer halten: Makronamen werden ausschliesslich in 
Grossbuchstaben geschrieben und umgekehrt sind Namen ausschliesslich in 
Grossbuchstaben exklusiv für Makros reserviert.

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