Atmega32 Umwandlung IAR to GCC

OP #2712944
Lesenswert?

weiss Jemand, wie man folgende Zeilen von IAR in GCC umwandeln kann?

(1) __eeprom int16_t accOffset @ EEPROM_ACCOFFSET = 156;
(2) const uint8_t AUTH_aes_key[16] EEMEM = {'Y','o','u',' 
','c','a','n','n','o','t',' ','p','a','s','s','!'};
(3) __eeprom struct battParam_struct{..}battParams @ 
EEPROM_BATTPARAMS={..};

Vielen Dank im Voraus!
Persönliche Seite #2713003
Lesenswert?

Khaled G. schrieb:
> weiss Jemand, wie man folgende Zeilen von IAR in GCC umwandeln kann?
>
> (1) __eeprom int16_t accOffset @ EEPROM_ACCOFFSET = 156;

Entfällt ersatzlos. I.d.R. ist es nicht notwendig, Variablen höndisch zu 
lokatieren.

Zum Zugriff gibt's eeprom_-Funktionen, siehe Doku der AVR-Libc.

> (2) const uint8_t AUTH_aes_key[16] EEMEM = {'Y','o','u','
> ','c','a','n','n','o','t',' ','p','a','s','s','!'};
1
#include <stdint.h>
2
#include <avr/eeprom.h>
3

4
const uint8_t AUTH_aes_key[16] EEMEM = {'Y','o','u',' ','c','a','n','n','o','t',' ','p','a','s','s','!'};
5

6
// oder
7

8
const char AUTH_aes_key[16] EEMEM = { "You cannot pass!" };

> (3) __eeprom struct battParam_struct{..}battParams @
> EEPROM_BATTPARAMS={..};

Siehe (1)
#2723294
Lesenswert?

Johann L. schrieb:
> Khaled G. schrieb:
>> weiss Jemand, wie man folgende Zeilen von IAR in GCC umwandeln kann?
>>
>> (1) __eeprom int16_t accOffset @ EEPROM_ACCOFFSET = 156;
>
> Entfällt ersatzlos. I.d.R. ist es nicht notwendig, Variablen höndisch zu
> lokatieren.

Das würde ich so pauschal nicht sagen, gerade beim EEPROM. Bei einem 
Versionswechsel der Software, bei dem neue Elemente ins EEPROM 
aufgenommen werden kann sich das Layout verändern, und dann kommt Mist 
raus, wenn auf ein vorhanenes Gerät eine neue Version geflasht wird und 
die den EEPROM-Inhalt der alten Version liest.

Stefan Wagner schrieb:
> Johann L. schrieb:
>> const char AUTH_aes_key[16] EEMEM = { "You cannot pass!" };
>
> Achtung! "You cannot pass!" ist durch das vom Compiler angehängte '\0'
> 17 Bytes lang.

Wenn für das Array explizit die Länge ohne '\0' angegeben wird, wird 
dieses weggelassen. Damit ist die Variante gleich der aus dem 
Ursprungsposting, wo auch kein '\0' am Ende steht.
#2723373
Lesenswert?

Rolf Magnus schrieb:
> Wenn für das Array explizit die Länge ohne '\0' angegeben wird, wird
> dieses weggelassen. Damit ist die Variante gleich der aus dem
> Ursprungsposting, wo auch kein '\0' am Ende steht.

Hm. Und ich dachte immer, ich würde die C-Syntax so einigermaßen 
kennen...

Nachsehen:

K&R 2. Auflage
(Hanser, 1990)
1
A.8.7 Initialisierung
2
(...) Ist die Größe des Vektors nicht bekannt, bestimmt die Anzahl der
3
Zeichen in der Zeichenkette unter Berücksichtigung des abschließenden
4
NUL-Zeichens die Größe des Vektors; liegt die Größe des Vektors fest,
5
dürfen ohne das abschließende NUL-Zeichen höchstens so viele Zeichen in
6
der konstanten Zeichenkette sein, wie der Vektor Elemente hat.

Aus der Formulierung wird mir beim ersten Lesen nicht eindeutig klar, ob 
das NUL-Byte nicht mit reinkommt, oder doch. Also im Urtext nachsehen.

Draft ANSI C Standard (ANSI X3J11/88-090) (May 13, 1988)
http://flash-gordon.me.uk/ansi.c.txt
1
3.5.7 Initialization
2
(...)
3
An array of character type may be initialized by a character string
4
literal, optionally enclosed in braces.  Successive characters of the
5
character string literal (including the terminating null character if
6
there is room or if the array is of unknown size) initialize the
7
members of the array.

und in N1548 Committee Draft — December 2, 2010 ISO/IEC 9899:201x
http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf
1
14 An array of character type may be initialized by a character string
2
literal or UTF−8 string literal, optionally enclosed in braces. 
3
Successive bytes of the string literal (including the terminating null
4
character if there is room or if the array is of unknown size) initialize
5
the elements of the array.

Ok, das ist jetzt eindeutig. Ist noch Platz, kommt das NUL-Byte mit 
rein, sonst nicht.

War mir in über 20 Jahren noch nie aufgefallen, da ich bei char-Arrays 
immer auf Platz für das NUL-Byte geachtet habe.

Danke für den Hinweis, ist gut zu wissen.

Grüße

Stefan

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