Forum: Compiler & IDEs Zeiger auf const-Array im __flash?


von Michael G. (mjgraf)


Lesenswert?

Hallo zusammen,

für eine LCD-Ansteuerung möchte ich die Zeichensatzdaten im Flash 
ablegen, d.h. z.B.
1
const __flash uint8_t  mjg8pxBitmaps []  = { ... }
für die eigentlichen Bitmaps,
1
const __flash uint16_t mjg8pxIndices[] = { ...}
für die Indizes auf die Positionen der (unterschiedlich breiten) Zeichen 
im Bitmap-Array, und
1
const __flash uint8_t mjg8pxWidths[] = {
für die Breiten der einzelnen Zeichen.

Ebenfalls ins Flash soll ein Descriptor
1
typedef struct {
2
  const uint8_t numRows;
3
  const uint8_t first;
4
  const uint8_t last;
5
  const uint8_t * const bitmaps ;
6
  const uint16_t * const indices;
7
  const uint8_t * const widths;
8
} mjgFontDescriptor_t;
 um alle Daten zu einem Zeichensatz - das System soll mit mehreren 
umgehen können - mit einem Zeiger auf den Descriptor übergebn zu können.
1
const __flash mjgFontDescriptor_t mjg8pxDescriptor = {
2
  1, // number of 8 bit rows
3
  33, // ASCII code of first character in charset
4
  134, // ASCII code of last character in charset
5
  mjg8pxBitmaps, // Z. 1471
6
  mjg8pxIndices, // Z. 1472
7
  mjg8pxWidths,  // Z. 1473
8
};

Für jedes der Arrays erhalte ich jedoch die Fehler

Error 1  initializer element is not computable at load time  1471
Error 2  (near initialization for 'mjg8pxDescriptor.bitmaps')  1471
Error 3  initializer element is not computable at load time  1472
Error 4  (near initialization for 'mjg8pxDescriptor.indices')  1472 
Error 5  initializer element is not computable at load time  1473
Error 6  (near initialization for 'mjg8pxDescriptor.widths')  1473

Was mache ich falsch? Alle Daten des Descriptors sind "eigentlich" 
bekannt. Trotzdem kriege ich den nicht initialisiert -- liegt es daran, 
dass der Compiler hier Daten haben müsste, die erst der Linker kennt?

Gruß & Dank,
Michael

von 0xff (Gast)


Lesenswert?

mach für die mjg8* vor dem struct noch einen 'extern  const' protoypen.

von 0xff (Gast)


Lesenswert?

oh, und statt
1
  const uint8_t * const bitmaps;
mach ich:
1
   uint8_t const * bitmaps;

landet dann lt. .map im flash.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Du verwendest in Initializern falsche Zeiger; Der Address-Space muß 
stimmen.

D.h. du kannst einen normalen Zeigen nicht mit einem __flash-Zeiger 
initialisieren und umgekehrt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Z.B. im Typedef

const __flash uint8_t* widths;

anstatt

const uint8_t * const widths;

von Michael G. (mjgraf)


Lesenswert?

Johann L. schrieb:
> Z.B. im Typedef
>
> const __flash uint8_t* widths;
>
> anstatt
>
> const uint8_t * const widths;

Danke, das war's!

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.