mikrocontroller.net

Forum: Compiler & IDEs Nur Teile eines struct in den Flash


Autor: Thomas Finke (thomas-hn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mit
typedef struct
{
  uint8_t bla;                            
  char blub[10];            
} test;

test PROGMEM testvariable = {0xff, "hallo"};

kann ich mir ja eine Struktur erstellen welche komplett im Flash 
untergebracht wird. Ist es aber auch möglich nur das "blub"-Array 
innerhalb der Struktur in den Flash zu legen und "bla" im RAM zu lassen?

Gruß,

Thomas

Autor: Florian (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wird nicht funktionieren, da dann das Array nicht mehr 
zusammenhängend wäre. Wenn Du blub aber als Pointer definierst und den 
Inhalt konstant zuweist, dann klappt das.
typedef struct {
 uint8_t bla;
 char *blub;
} test;

test testvariable = { 0xFF, "hallo" );

Allerdings wird blub dann immernoch Speicher belegen und zwar 
entsprechend der Pointer-Größe, die allerdings architekturabhängig ist.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include <avr/io.h>
#include <avr/pgmspace.h>

typedef struct
{
  uint8_t bla;                            
  const char* blub;            
} test;

const char String1[] PROGMEM = "hallo vom Flash";

test testvariable = { 0xff, String1 };



Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
einfach dann um den String von Florian noch ein PSTR drumherum und schon 
ist es im Flash... geht doch ganz einfach ;-)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ulrich wrote:
> einfach dann um den String von Florian noch ein PSTR drumherum und schon
> ist es im Flash... geht doch ganz einfach ;-)

Hast du's ausprobiert?
Das liegt zwar nahe, funktioniert aber nicht.


Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
eigenltich war ich mir schon sehr sicher, sonst hätte ich es ja nicht 
geschrieben ;-). Mal gucken was wir in meiner Code-Schatztruhe so 
finden.....

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
dat hier ging wunderbar:
  debug_t debugs[] =
  {
  {PSTR("COUNTI2C"), &fifo_count_i2c, (0<<5)|10},
  .
  .
  .
  .
  };

Autor: Thomas Finke (thomas-hn) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger wrote:
>
> #include <avr/io.h>
> #include <avr/pgmspace.h>
> 
> typedef struct
> {
>   uint8_t bla;
>   const char* blub;
> } test;
> 
> const char String1[] PROGMEM = "hallo vom Flash";
> 
> test testvariable = { 0xff, String1 };
> 
> 


Wie greife ich denn da dann auf beispielsweise blub[2] zu?

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich schaue in diesen fällen immer in die supper libc Doku die man z.B. 
per google sehr leicht findet. Dort stolpert man dann auch über die 
funktionen die Daten aus dem Flash auslesen können.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie greife ich denn da dann auf beispielsweise blub[2] zu?

Mittels pgm_read_byte
#include <avr/io.h>
#include <avr/pgmspace.h>

typedef struct
{
  uint8_t bla;                            
  const char* blub;            
} test;

const char String1[] PROGMEM = "hallo vom Flash";

test testvariable = { 0xff, String1 };
char t;

void out( char c )
{
  t = c;
}

void foo_P( const char* str )
{
  char c;

  while( (c = pgm_read_byte( str++ )) != 0 )
    out( c );
}

int main()
{
  foo_P( testvariable.blub );

  while( 1 )
    ;
}


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ulrich wrote:
> dat hier ging wunderbar:
>
>
  debug_t debugs[] =
>   {
>   {PSTR("COUNTI2C"), &fifo_count_i2c, (0<<5)|10},
>   .
>   .
>   .
>   .
>   };
> 


Ich krieg da immer eine Fehlermeldung
typedef struct
{
  uint8_t bla;                            
  const char* blub;            
} test;

test testvariable = { 0xff, PSTR("String1") };

../Forum9.c:12: error: braced-group within expression allowed only 
inside a function

Wenn ich mir das PSTR Makro ansehe
# define PSTR(s) (__extension__({static char __c[] PROGMEM = (s); &__c[0];}))

dann kann ich mir auch so ungefähr vorstellen warum das nicht bei
einer Initialisierung ausserhalb einer Funktion geht.

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]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [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.