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','!'};
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.
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
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.
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
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
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.
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