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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.