Forum: Compiler & IDEs PGM_P Array - darf ich das so?


von Josef K. (josefk)


Lesenswert?

Hallo zusammen,

ich wollte nur kurz fragen, ob ich folgendes so definieren und 
deklarieren darf...
1
//stringlib.h
2
#ifndef STRINGLIB_H_
3
4
#define STRINGLIB_H_
5
6
7
8
#include <avr/pgmspace.h>
9
10
extern const char checksum00[] PROGMEM;
11
12
extern const char checksum01[] PROGMEM;
13
14
#endif
1
//stringlib.c
2
#include "stringlib.h"
3
4
const char checksum00[] PROGMEM = "keine Fehler";
5
6
const char checksum01[] PROGMEM = "falsche Checksumme";
1
//errorbitmap.h
2
#ifndef ERRORBITMAP_H_
3
4
#define ERRORBITMAP_H_
5
6
#include <stdint.h>
7
8
#include <avr/pgmspace.h>
9
10
#include "stringlib.h";
11
12
extern char *errortext;
13
14
typedef struct{
15
16
17
      //checksum
18
19
      uint8_t      ebm_testchecksum;
20
21
22
}struct_errorbitmap;
23
24
extern PGM_P p_errortext_checksum0[]; 
25
#endif
1
//errorbitmap.c
2
#include "errorbitmap.h"
3
4
PGM_P p_errortext_checksum0[] = {checksum00,checksum01};
1
//main.c
2
#include <avr/io.h>
3
4
#include <avr/pgmspace.h>
5
6
#include <string.h>
7
#include "errorbitmap.h"
8
9
char *errortext;
10
errorbitmap.ebm_testchecksum = 0;
11
int main(void)
12
{
13
 errorbitmap.ebm_testchecksum = lesevoneepromirgendwas();
14
 //ausgabe
15
 text_p(p_errortext_checksum[errorbitmap.ebm_testchecksum]);
16
 return 0;
17
}

Das sollte mal abbilden, was ich mache. text_p() erwartet Pointer zum 
Falsh.
Mach ich dabei etwas falsch? Ich bin gerade auf Bugsuche :(

von Josef K. (josefk)


Lesenswert?

Ach ja.

ich habe natürlich in meiner global.h
struct_errorbitmap errorbitmap;
angelegt.
Die global.h wird überall, wo nötig, eingebunden.

von T. H. (pumpkin) Benutzerseite


Lesenswert?

Ich kann erstmal keinen Fehler entdecken. Wo hängt es denn genau? 
Vermutlich klappt text_p nicht, wenn das der Fall ist überprüfe

  errorbitmap.ebm_testchecksum = lesevoneepromirgendwas();

Für weiteres bringt die Glaskugel nicht viel. Kleiner Tip: in der 
pgmspace.h sind wesentlich übersichtlichere Typen wie prog_char etc 
definiert.

von Werner B. (werner-b)


Lesenswert?

Da die Zeiger auch im Progmem stehen, versuchs mal mit..
1
text_p(pgm_read_word(&p_errortext_checksum[errorbitmap.ebm_testchecksum]));

von Josef K. (josefk)


Lesenswert?

Hmm. Das dann lese ich ja 
p_errortext_checksum[errorbitmap.ebm_testchecksum] in den SRAM, oder? 
text_p erwartet aber einen Pointer ins Flash.

Generell muss ich sagen, wußte ich nicht ob das obige funktioniert. 
Leider hängt mein Programm ein bißchen, wie im 
Beitrag "Langzeittest der Software" zu sehen ist, und ich weiß 
nicht wo.

Es kann also durchaus sein, dass obiger Code problemlos funktioniert. 
Ich wollte nur mal nachfragen.
So wie es momentan aussieht funktioniert das alles auch. Muß wohl doch 
woanders liegen.

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.