Hallo Leute,
ich bin in den letzten Tagen mehrmals über den Begriff "Link Time
Optimization" hier im Forum gestolpert.
Ich habe mich eingelesen und damit herumexperimentiert.
Konkret bin ich ein Problem angegangen, dass mich schon länger
beschäftigt, nämlich Pinzugriff über Funktionen. Außerdem störte mich,
dass man immer die Kombination Port/Pin mit herumschleppt.
PeDas sbit.h ist zwar ein Schritt in die richtige Richtung, aber man
handelt sich damit eben auch alle "Gefahren" von Makros ein, außerdem
kann man den Pin damit nicht in Datenstrukturen speichern.
Aber Funktionen haben Overhead, und spätestens über Modulgrenzen hinweg
kann der Compiler nicht mehr viel optimieren, und schon dauert das
Setzen eines Bits 30 statt 2 Takte.
AUTOSAR und auch die Arduino-API machens vor: eine Funktion der Art
1 | write_pin(channel_t channel, boolean value);
|
Hier mal mein Experiment:
main.c:
1 | #include "dio/dio.h"
|
2 |
|
3 | int main(void)
|
4 | {
|
5 | write_channel(channel_2, 1);
|
6 | write_channel(channel_0, 0);
|
7 |
|
8 | while(1);
|
9 |
|
10 | return 0;
|
11 | }
|
dio.h:
1 | typedef enum
|
2 | {
|
3 | channel_0 = 0u,
|
4 | channel_1,
|
5 | channel_2,
|
6 | channel_3,
|
7 | channel_4,
|
8 | channel_5
|
9 | }
|
10 | channel_t;
|
11 |
|
12 | void write_channel(channel_t channel, boolean value);
|
dio.c:
1 | #include <avr/io.h>
|
2 | #include "dio.h"
|
3 |
|
4 | volatile uint8_t *ports[] = { &PORTB, &PORTB, &PORTC, &PORTD};
|
5 |
|
6 | void write_channel(channel_t channel, boolean value)
|
7 | {
|
8 | uint8_t pin;
|
9 | uint8_t port;
|
10 |
|
11 | pin = channel & 0x07;
|
12 | port = channel >> 3;
|
13 |
|
14 | if (value)
|
15 | *ports[port] |= (1 << pin);
|
16 | else
|
17 | *ports[port] &= ~(1 << pin);
|
18 | }
|
Kompiliert mit -Os -flto für den ATmega1284P ergibt sich:
1 | 000000a4 <main>:
|
2 | a4: 2a 9a sbi 0x05, 2 ; 5
|
3 | a6: 28 98 cbi 0x05, 0 ; 5
|
4 | a8: ff cf rjmp .-2 ; 0xa8 <main+0x4>
|
Genau das was ich solange probiert habe (über Makros, inline-Funktionen,
etc.).
Das gcc Manual sagt, -flto und Debuggen vertragen sich nicht. Ok, damit
kann man (grad auf nem Controller) leben.
Ansonsten werde ich das mal in meinem aktuellen Projekt zuhause
ausprobieren.
Ich muss sagen, ich bin gerade bisl euphorisch. Hat es denn einen Grund
wieso man von der LTO so selten hört?
Gibt es vielleicht irgendwelche Nebeneffekte?
Kann das Ganze irgendwie nach hinten los gehen?
Grüße,
Franz