GCC section für string

#5646286
Lesenswert?

Hallo zusammen!

Ich hab ne Frage zu GCC:
ich möchte einen String im EEProm ablegen. Das geht ja über
1
__attribute__((section (".eepromSection")))
(mit einer entsprechenden section im linker file. leider funktioniert 
das nur bei Variablen:
1
char __attribute__((section (".eepromSection"))) abc[] = "meinStringImEEPROM";
Es funktioniert aber nicht, wenn ich einfach einen konstanten String aus 
dem EEPROM einer Funktion übergeben will:
1
void function(char * arg);
2

3
function(__attribute__((section (".eepromSection"))) "meinString");
--> das gibt nen Compiler error.
weiß jemand, wie die Syntax hierfür ist? Ich will ja nicht vor jedem 
Funktionsaufruf erst eine char* Variable erzeugen. Der String soll aber 
trotzdem in den EEPROM, um Flash speicher zu sparen.

dankeschön für euere Hilfe!
Michael
#5646361
Lesenswert?

Harry L. schrieb:
> Du willst also 512Byte EEPROM mit Strings zumüllen um bei dem um ein
> Vielfaches größerem Flashspeicher ein paar Bytes zu sparen?
>
> Klingt nach ner totalen Schnaps-Idee!
>
> Das solltest du dringend nochmal überdenken!

"Entschuldigung, wo geht es hier denn nach… ?"

"Was, wo wollen Sie hin? Ne ne, ich erklär' Ihnen mal, wo sie hin 
wollen…"
Gast #5646371
Lesenswert?

Michael S. schrieb:
> weiß jemand, wie die Syntax hierfür ist? Ich will ja nicht vor jedem
> Funktionsaufruf erst eine char* Variable erzeugen. Der String soll aber
> trotzdem in den EEPROM, um Flash speicher zu sparen.

Der EEProm lässt sich nicht direkt mittels Pointer ansprechen.
Daher funktioniert der Aufruf auch nicht.

Entweder schreibst Du Deine Funktion so, dass sie direkt auf das EEProm 
zugreifen kann oder Du kopierst den String vorher in den RAM.
#5646862
Lesenswert?

Brummbär schrieb:
> Der EEProm lässt sich nicht direkt mittels Pointer ansprechen.
> Daher funktioniert der Aufruf auch nicht.
>
> Entweder schreibst Du Deine Funktion so, dass sie direkt auf das EEProm
> zugreifen kann oder Du kopierst den String vorher in den RAM.

Danke dir! Allerdings funktioniert das beim STM32L0 soweit ich weiß 
schon:
1
char __attribute__((section (".eepromSection"))) __attribute__ ((aligned (4))) text[] = "meinString";
2
void function(char * arg);
3

4
int main(...){
5
    function(text);
6
}
dieser code funktioniert fehlerfrei, obwohl die variable text auf einen 
EEPROM Adressbereich zeigt. Ich hab nur keine Lust, für jeden String 
erst eine globale Variable zu definieren, würde das gern in der gleichen 
Zeile im Funktionsaufruf machen.
Persönliche Seite #5646940
Lesenswert?

Mit einem Makro, einem Lambda und einer lokalen statischen Variablen 
geht es:
1
#include <cstdio>
2

3
#define EEPROM_STR(literal) ([] () -> const char (&) [sizeof(literal)] { static constexpr char str [] __attribute__((section(".eepromSection"))) = literal; return str; } ())
4

5
void test (const char* str) {
6
  puts (str);
7
}
8

9
int main () {
10
  test (EEPROM_STR("Hello, world!"));
11
}

Schön ist aber anders :-) Mit C++20 wird es vermutlich auch möglich ein 
User Defined Literal zu nutzen, in der Form test("Hello, world!"_eeprom) 
o.ä.
#5646976
Lesenswert?

Niklas G. schrieb:
> Mit einem Makro, einem Lambda und einer lokalen statischen Variablen
> geht es:
>
>
1
#include <cstdio>
2
> 
3
> #define EEPROM_STR(literal) ([] () -> const char (&) [sizeof(literal)] { 
4
> static constexpr char str [] __attribute__((section(".eepromSection"))) 
5
> = literal; return str; } ())
6
> 
7
> void test (const char* str) {
8
>   puts (str);
9
> }
10
> 
11
> int main () {
12
>   test (EEPROM_STR("Hello, world!"));
13
> }
danke, klingt gut - ich versteh zwar nicht alles, aber leider gibts auch 
nen compiler error:

error: expected expression before '[' token

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