Forum: Mikrocontroller und Digitale Elektronik GCC section für string


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Michael S. (michatroniker)


Bewertung
0 lesenswert
nicht 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

von Harry L. (mysth)


Bewertung
0 lesenswert
nicht lesenswert
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!

von A.. P. (arnonym)


Bewertung
-3 lesenswert
nicht 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…"

: Bearbeitet durch User
von Brummbär (Gast)


Bewertung
2 lesenswert
nicht 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.

von Michael S. (michatroniker)


Bewertung
0 lesenswert
nicht 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.

von (prx) A. K. (prx)


Bewertung
0 lesenswert
nicht lesenswert
Brummbär schrieb:
> Der EEProm lässt sich nicht direkt mittels Pointer ansprechen.

Eine mutige Aussage, wenn man bedenkt, dass der Controller überhaupt 
nicht genannt wurde.

: Bearbeitet durch User
von Niklas G. (erlkoenig) Benutzerseite


Bewertung
1 lesenswert
nicht 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.ä.

: Bearbeitet durch User
von Michael S. (michatroniker)


Bewertung
0 lesenswert
nicht 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

von Niklas G. (erlkoenig) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Michael S. schrieb:
> error: expected expression before '[' token

Hm, wie genau sieht der Compiler-Aufruf aus, welche Compiler-Version 
hast du? Das ganze funktioniert erst ab C++11.

von Michael S. (michatroniker)


Bewertung
0 lesenswert
nicht lesenswert
ich verwende C11 ohne C++...

von Niklas G. (erlkoenig) Benutzerseite


Bewertung
0 lesenswert
nicht lesenswert
Achso. Aufgrund der weitgehenden Abwärtskompatibilität ist es aber 
meistens ohne großen Aufwand möglich, Projekte (teilweise) auf C++ 
umzustellen, damit man solche Funktionalität nutzen kann.

von Michael S. (michatroniker)


Bewertung
0 lesenswert
nicht lesenswert
okay. Das sprengt dann aber wohl den Rahmen, für eine kleine solche 
Funktion auf C++ umzustellen. Ist nämlich ein recht großes Projekt, dann 
muss ich vllt eben doch globale variablen anlegen.
Danke dir jedenfalls für die Hilfe!

Michael

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.