Nur Teile eines struct in den Flash

OP Persönliche Seite #578780
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
Gast #578790
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.
Gast #578854
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.
#578870
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
}
#578871
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.

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