avr-gcc const und Pointer

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From German to

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





schleierhaft :-(


Was genau bedeutet denn "const" bei Variablen-Deklarationen?

Konstanten in CONST liegen, und dieses Segment nachher im Flash Speicher  




Was ist der Unterschied zwischen
   const int x = 1;
und
   #define x 1

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)



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*  

Zugriffe auf Flash und RAM unterschiedlich sind, was aber gleich zur  


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


Pointer zeigt?




Code schreibt?

DoDi

Re: avr-gcc const und Pointer
Hans-Peter Diettrich wrote:
Quoted text here. Click to load it

Quoted text here. Click to load it

Bitte was? ;-)

Quoted text here. Click to load it

Quoted text here. Click to load it



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

Quoted text here. Click to load it

Quoted text here. Click to load it



Wenn du den Optimizer des Compilers abgeschaltet hast kann die Variante
mit #define besser sein. Ansonsten wird der Optimizer anschauen was du

ist.
  
Quoted text here. Click to load it


ohne Angabe signed oder unsigned sein. "int" hat keine definierte
Breite, mindestens 16 Bits und ist ohne Angabe signed.

Quoted text here. Click to load it

Quoted text here. Click to load it

Dazu wurden im anderen Thread Beispiele gepostet.

Quoted text here. Click to load it

Quoted text here. Click to load it

Ja.



Quoted text here. Click to load it

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-manual/pgmspace.html
<http://gcc.gnu.org/onlinedocs/gcc/Named-Address-Spaces.html

Re: avr-gcc const und Pointer
Michael Baeuerle wrote:
Quoted text here. Click to load it

Quoted text here. Click to load it


Quoted text here. Click to load it

Quoted text here. Click to load it

Beispiel:
------------------------------------------------------------------------
$ cat constant.c
#include <avr/io.h>

void bla(void)
{
   const char x = 1;

   PORTB = x;
}
------------------------------------------------------------------------

ergibt:
------------------------------------------------------------------------
$ avr-gcc -Os -mmcu=atmega128 -c -o constant constant.c
$ avr-objdump -d constant

constant:     file format elf32-avr


Disassembly of section .text:

00000000 <bla>:
   0:   81 e0           ldi     r24, 0x01       ; 1
   2:   88 bb           out     0x18, r24       ; 24
   4:   08 95           ret
------------------------------------------------------------------------

Da ist also nichts im RAM gelandet.

Re: avr-gcc const und Pointer
Michael Baeuerle schrieb:
Quoted text here. Click to load it

Quoted text here. Click to load it

Oder liegt diese Vorverarbeitung in der Arduino IDE (*.ino --> *.cpp)?

[...]
Quoted text here. Click to load it






DoDi

Re: avr-gcc const und Pointer
Hans-Peter Diettrich wrote:
Quoted text here. Click to load it

Quoted text here. Click to load it

Kann ich dir leider nicht sagen, ich programmiere AVRs immer direkt


Re: avr-gcc const und Pointer
Am 23.03.2015 um 16:32 schrieb Michael Baeuerle:

Quoted text here. Click to load it

Quoted text here. Click to load it

Die GNU Coding Rules bevorzugen ja die Const-Variante da der Compiler  

Allerdings funktioniert das:

const uint8_t bufSize20%;
char buffer[bufSize];


not const". Hier muss man define nehmen.

Nebenbei meine ich auch das

typedef int counter_t;
counter_t cnt;
int x;
...
cnt=x;






Robert

Re: avr-gcc const und Pointer
Robert Loos schrieb:

Quoted text here. Click to load it


Deshalb ja meine Frage, ob man bei kleinen Konstanten besser byte nehmen  
sollte.

Quoted text here. Click to load it

Quoted text here. Click to load it

Bei Arduino funktioniert das mit
   const int bufSize = 100;

DoDi

Re: avr-gcc const und Pointer
Robert Loos wrote:
Quoted text here. Click to load it

Quoted text here. Click to load it

Quoted text here. Click to load it

Quoted text here. Click to load it



werden) sollte das auch so funktionieren.

Quoted text here. Click to load it



Ist doch auch (real) der gleiche Typ.

Re: avr-gcc const und Pointer
Am 24.03.2015 um 11:43 schrieb Michael Baeuerle:
...
Quoted text here. Click to load it


Quoted text here. Click to load it

Ja jetzt! Aber diese Zuweisung ist wahrscheinlich schon bei der  







Re: avr-gcc const und Pointer
Robert Loos schrieb:
Quoted text here. Click to load it


Quoted text here. Click to load it


Von C darfst Du keine Typsicherheit erwarten, die auf Typnamen basiert.  
IMO vereinfachen typedefs nur dem Compiler das Parsen von Deklarationen,  

bezeichnet.











auszugeben. Stell Dir nur mal vor, wieviele verschiedene  



DoDi

Re: avr-gcc const und Pointer
Hallo Hans-Peter,

Hans-Peter Diettrich schrieb:





Quoted text here. Click to load it




Fehlermeldungen auszuspucken, wenn man ein wirklich striktes Typsystem hat,
noch ist das ein Problem, bei Aufruf eine Standardfunktion entweder selbst
eine Typwandlung zu machen oder eben eine weitere Version dieser
Standardfunktion zu erstellen, die nichts weiter macht, als die Typwandlung


Aufruf der Funktion hat.


Fehler vermeidet. Ein Sprache, die implizite Typwandlungen macht, ist
kaputt.


--  


Re: avr-gcc const und Pointer
Martin Schoenbeck schrieb:


Quoted text here. Click to load it

Ein funktionierendes Typsystem erlaubt dem Compiler, erlaubte von  
unerlaubten Konvertierungen zu unterscheiden. Ein "unsigned" Wert kann  

werden, da ist keine Fehlermeldung und nicht mal eine Warnung notwendig.  
Bei "signed" Werten wird es problematischer, die lassen sich an  
"unsigned" nicht zuweisen, wenn sie negativ sind. Aber auch da ist  








Geschmack zu viele) implizite Umwandlungen gestattet :-]

DoDi

Re: avr-gcc const und Pointer
Hallo Hans-Peter,

Hans-Peter Diettrich schrieb:

Quoted text here. Click to load it

Quoted text here. Click to load it

Quoted text here. Click to load it


einbauen. Das ist nicht das, was ich unter einem funktionierenden Typsystem
verstehe, denn da definiere _ich_ als Entwickler, welche Eigenschaften ein


treffen.

Quoted text here. Click to load it




grauenhaft.

Quoted text here. Click to load it








Quoted text here. Click to load it


ausgereiftes Typsystem hat, sondern wenn sie implizit konvertiert. Das

denke, niemand wird ernsthaft bestreiten wollen, jedenfalls vom Standpunkt

bequemer als Assembler.


--  


Re: avr-gcc const und Pointer
Martin Schoenbeck schrieb:
Quoted text here. Click to load it


Quoted text here. Click to load it

Quoted text here. Click to load it

Nein, das geht z.B. in Delphi (OPL) mit einem einzigen Datentyp:
   type TMyNumber = low..high;
   int8_t = -128..127;
   uint8_t = 0..$FF;


vordefinierten Datentyp festlegen, der dann irgendwann oder auf  

dessen bekannte Grenzen einsetzen.


Quoted text here. Click to load it



Quoted text here. Click to load it





der Standardtyp (int, integer...) bei allen derzeitigen general-purpose  
Compilern bei 32 Bit. Bei Mikrocontrollern auch mal weniger, da wird das  



beliebiger Genauigkeit.

DoDi

Re: avr-gcc const und Pointer
Hallo Hans-Peter,

Hans-Peter Diettrich schrieb:

Quoted text here. Click to load it

Quoted text here. Click to load it

Quoted text here. Click to load it


Quoted text here. Click to load it

Quoted text here. Click to load it

Jetzt nochmal langsam: man hat also nur einen einzigen Datentyp und mit dem
kann der Compiler dann von diesem einzigen Datentyp zu diesem einzigen


noch wie man sie zuweist?
Quoted text here. Click to load it



Quoted text here. Click to load it

Quoted text here. Click to load it


87432947239847239482734983274329874329847329847324983274329847329847324987324





Prozessorregister sind?

Quoted text here. Click to load it


Ja, und nicht mehr als 640 kB.


Quoted text here. Click to load it



Quoted text here. Click to load it

Und zwischen all dem wandelt der Compiler dann hin und her ohne mich zu
fragen. *Grusel*


--  


Re: avr-gcc const und Pointer
Martin Schoenbeck schrieb:

Quoted text here. Click to load it

Ja, so ist es.


Quoted text here. Click to load it


mit Deinem Lieblingcompiler.

DoDi

Re: avr-gcc const und Pointer
Hallo Hans-Peter,

Hans-Peter Diettrich schrieb:

Quoted text here. Click to load it

Ist schon eine kuriose Definition von Datentyp.


Quoted text here. Click to load it

Quoted text here. Click to load it




--  


Re: avr-gcc const und Pointer
Martin Schoenbeck wrote:
Quoted text here. Click to load it


Ack. Beliebter Stolperstein: integer promotion
<http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_intpromote

Auf dem PC:
------------------------------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>

int main(void)
{
   unsigned char a = UCHAR_MAX;

   printf("a: 0x%X\n", (unsigned int) ~a);
   exit(0);
}
------------------------------------------------------------------------
Ergebnis:
|  
| a: 0xFFFFFF00


kommen. Meistens wollte man aber wohl eher das hier:
------------------------------------------------------------------------
#include <stdlib.h>
#include <stdio.h>
#include <limits.h>

int main(void)
{
   unsigned char a = UCHAR_MAX;

   printf("a: 0x%X\n", (unsigned int) (unsigned char) ~a);
   exit(0);
}
------------------------------------------------------------------------
Ergebnis:
|  
| a: 0x0

Re: avr-gcc const und Pointer
Hans-Peter Diettrich wrote:
Quoted text here. Click to load it

Quoted text here. Click to load it

Quoted text here. Click to load it


definiertes Verhalten:
|  
| A computation involving unsigned operands can never overflow, because
| a result that cannot be represented by the resulting unsigned integer
| type is reduced modulo the number that is one greater than the largest
| value that can be represented by the resulting type.




Beispiel:
---------------------------------------
   unsigned int a = UINT_MAX;
   unsigned int b = 0;

   a = a + 1U;
   if (a == b) { ...
---------------------------------------



Re: avr-gcc const und Pointer
Michael Baeuerle schrieb:


Quoted text here. Click to load it






nicht lange zu warten :-(

DoDi

Site Timeline