avr-gcc const und Pointer

23/03/2015 - 15:21 von Hans-Peter Diettrich | Report spam
Ich bin immer noch etwas verwirrt, was den avr-gcc betrifft :-(

Ich weiß ja schon, daß der Compiler einen Mix aus C und C++ akzeptiert,
und die Sketche(s) so interpretiert, daß man dort nicht unterscheiden
kann bzw. muß, was als C und was als C++ zu verstehen ist. Einige
Details bezüglich der Speicherbereiche sind mir aber noch ziemlich
schleierhaft :-(


Was genau bedeutet denn "const" bei Variablen-Deklarationen?
Von traditionellen Compilern her hàtte ich erwartet, daß solche
Konstanten in CONST liegen, und dieses Segment nachher im Flash Speicher
landet. Anscheinend ist das aber nicht so, sonst wàre ja PROGMEM oder
__flash hier überflüssig?


Was ist der Unterschied zwischen
const int x = 1;
und
#define x 1
bezüglich der Ablage und nachfolgenden Verwendung?
Klar, ein #define hat keine Adresse, aber wenn man die nie braucht, wie
sollten dann Konstanten am besten deklariert werden, um Speicher zu
sparen? (RAM und Code)
[Von Pascal wàre ich gewohnt, daß untypisierte Konstanten wie #define
funktionieren, wàhrend typisierte Konstanten im Speicher liegen]

Was ist der Unterschied zwischen "const int" und "const char"?
Lohnt es sich, kleine Werte als char oder byte zu deklarieren?

Wie werden String-Literale abgelegt?
In etlichen Beispielen wird dort ein Puffer verwendet, in den so ein
Literal kopiert wird, bevor der Puffer an weitere Funktionen als char*
übergeben wird. Das leuchtet mir insofern ein, daß die Befehle für
Zugriffe auf Flash und RAM unterschiedlich sind, was aber gleich zur
nàchsten Frage führt:

Wie sind Pointer als Parameter implementiert?
Zeigen solche Parameter (z.B. char *p) immer ins RAM, oder werden sie
als 24 Bit Pointer gehandhabt, was ja zu ineffizientem Code führen
würde, wenn man vorher schon weiß, in welchen Speicherbereich so ein
Pointer zeigt?


Kann mir jemand auf die Sprünge helfen, wie der avr-gcc da vorgeht, und
wie man sowohl effizienten als auch lesbaren und möglichst einfachen
Code schreibt?

DoDi
 

Lesen sie die antworten

#1 Michael Baeuerle
23/03/2015 - 16:32 | Warnen spam
Hans-Peter Diettrich wrote:

Ich bin immer noch etwas verwirrt, was den avr-gcc betrifft :-(

Ich weiß ja schon, daß der Compiler einen Mix aus C und C++
akzeptiert, und die Sketche(s)



Bitte was? ;-)

[...]
Was genau bedeutet denn "const" bei Variablen-Deklarationen?
Von traditionellen Compilern her hàtte ich erwartet, daß solche
Konstanten in CONST liegen, und dieses Segment nachher im Flash
Speicher landet. Anscheinend ist das aber nicht so, sonst wàre ja
PROGMEM oder __flash hier überflüssig?



"const" bedeutet, dass man auf etwas nicht schreiben darf. Es bezeichnet
nicht, wo es zu liegen hat. Es muss im gleichen Adressraum liegen wie
eine Variable des gleichen Typs ohne "const" (bei AVR also nicht im
Flash).

Was ist der Unterschied zwischen
const int x = 1;
und
#define x 1
bezüglich der Ablage und nachfolgenden Verwendung?
Klar, ein #define hat keine Adresse, aber wenn man die nie braucht, wie
sollten dann Konstanten am besten deklariert werden, um Speicher zu
sparen? (RAM und Code)
[Von Pascal wàre ich gewohnt, daß untypisierte Konstanten wie #define
funktionieren, wàhrend typisierte Konstanten im Speicher liegen]



Wenn du den Optimizer des Compilers abgeschaltet hast kann die Variante
mit #define besser sein. Ansonsten wird der Optimizer anschauen was du
machst und die Variable nur dann in den Speicher legen wenn es nötig
ist.

Was ist der Unterschied zwischen "const int" und "const char"?
Lohnt es sich, kleine Werte als char oder byte zu deklarieren?



"char" ist in C ein Byte (CHAR_BIT breit, üblicherweise 8) und kann
ohne Angabe signed oder unsigned sein. "int" hat keine definierte
Breite, mindestens 16 Bits und ist ohne Angabe signed.

Wie werden String-Literale abgelegt?
In etlichen Beispielen wird dort ein Puffer verwendet, in den so ein
Literal kopiert wird, bevor der Puffer an weitere Funktionen als char*
übergeben wird. Das leuchtet mir insofern ein, daß die Befehle für
Zugriffe auf Flash und RAM unterschiedlich sind,



Dazu wurden im anderen Thread Beispiele gepostet.

was aber gleich zur
nàchsten Frage führt:

Wie sind Pointer als Parameter implementiert?
Zeigen solche Parameter (z.B. char *p) immer ins RAM,



Ja.

oder werden sie
als 24 Bit Pointer gehandhabt, was ja zu ineffizientem Code führen
würde, wenn man vorher schon weiß, in welchen Speicherbereich so ein
Pointer zeigt?



Wenn ein Pointer ins Flash zeigen soll muss er ein entsprechendes
Attribut verpasst bekommen. Siehe PROGMEM und _flash im anderen Thread
bzw. hier in der Doku:
<http://www.nongnu.org/avr-libc/user...e.html>
<http://gcc.gnu.org/onlinedocs/gcc/N...s.html>

Ähnliche fragen