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


von Thomas F. (thomas-hn) Benutzerseite


Lesenswert?

Hallo,

mit
1
typedef struct
2
{
3
  uint8_t bla;                            
4
  char blub[10];            
5
} test;
6
7
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

von Florian (Gast)


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.
1
typedef struct {
2
 uint8_t bla;
3
 char *blub;
4
} test;
5
6
test testvariable = { 0xFF, "hallo" );

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

von Karl H. (kbuchegg)


Lesenswert?

1
#include <avr/io.h>
2
#include <avr/pgmspace.h>
3
4
typedef struct
5
{
6
  uint8_t bla;                            
7
  const char* blub;            
8
} test;
9
10
const char String1[] PROGMEM = "hallo vom Flash";
11
12
test testvariable = { 0xff, String1 };


von Ulrich (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.


von Ulrich (Gast)


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.....

von Ulrich (Gast)


Lesenswert?

dat hier ging wunderbar:
1
  debug_t debugs[] =
2
  {
3
  {PSTR("COUNTI2C"), &fifo_count_i2c, (0<<5)|10},
4
  .
5
  .
6
  .
7
  .
8
  };

von Thomas F. (thomas-hn) Benutzerseite


Lesenswert?

Karl heinz Buchegger wrote:
>
1
> #include <avr/io.h>
2
> #include <avr/pgmspace.h>
3
> 
4
> typedef struct
5
> {
6
>   uint8_t bla;
7
>   const char* blub;
8
> } test;
9
> 
10
> const char String1[] PROGMEM = "hallo vom Flash";
11
> 
12
> test testvariable = { 0xff, String1 };
13
> 
14
>


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

von Ulrich (Gast)


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.

von Karl H. (kbuchegg)


Lesenswert?

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

Mittels pgm_read_byte
1
#include <avr/io.h>
2
#include <avr/pgmspace.h>
3
4
typedef struct
5
{
6
  uint8_t bla;                            
7
  const char* blub;            
8
} test;
9
10
const char String1[] PROGMEM = "hallo vom Flash";
11
12
test testvariable = { 0xff, String1 };
13
char t;
14
15
void out( char c )
16
{
17
  t = c;
18
}
19
20
void foo_P( const char* str )
21
{
22
  char c;
23
24
  while( (c = pgm_read_byte( str++ )) != 0 )
25
    out( c );
26
}
27
28
int main()
29
{
30
  foo_P( testvariable.blub );
31
32
  while( 1 )
33
    ;
34
}

von Karl H. (kbuchegg)


Lesenswert?

Ulrich wrote:
> dat hier ging wunderbar:
>
>
1
  debug_t debugs[] =
2
>   {
3
>   {PSTR("COUNTI2C"), &fifo_count_i2c, (0<<5)|10},
4
>   .
5
>   .
6
>   .
7
>   .
8
>   };
9
>


Ich krieg da immer eine Fehlermeldung
1
typedef struct
2
{
3
  uint8_t bla;                            
4
  const char* blub;            
5
} test;
6
7
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
1
# 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.

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.