Forum: Compiler & IDEs Atmega32 Umwandlung IAR to GCC


von Khaled G. (khaled_g)


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!

von Johann L. (gjlayde) Benutzerseite


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)

von Khaled G. (khaled_g)


Lesenswert?

Danke.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Johann L. schrieb:
> I.d.R. ist es nicht notwendig, Variablen höndisch zu
> lokatieren.

Wenn doch, dann mittels --section-start=.eeprom=0x81009c dem Linker
mitgeben.

von Stefan W. (dl6dx)


Lesenswert?

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.

Grüße

Stefan

von Rolf M. (rmagnus)


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.

von Stefan W. (dl6dx)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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

Naja, wenn du das Ding als üblichen C-String benutzen willst, dann
willst du ja das abschließende Nullzeichen auch mit dabei haben.

von Stefan W. (dl6dx)


Lesenswert?

Jörg Wunsch schrieb:
> Naja, wenn du das Ding als üblichen C-String benutzen willst, dann
> willst du ja das abschließende Nullzeichen auch mit dabei haben.

Besser ist das...

Grüße

Stefan

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.