Function Pointer aus Struct im Flash aufrufen

Gast #687589
Lesenswert?

Hallo,

obwohl ich jetzt die Suche schon stark emüht habe, komme ich leider an 
einer Stelle nicht weiter.
Ich habe in der Array menu eine Funktion hinterlegt und möchte diese nun 
aufrufen. Wie schaffe gelingt es die im Flash gespeicherte Adresse an 
einen Funktionspointer zu übergeben bzw. einen Funktionspointer daraus 
zu generieren. Die Textausgabe funktioniert ohne Probleme.

Danke

gruß Marcus
1
typedef void (*VoidFnct)(int);
2

3
global menu_posing; // wird von Interrupts manipuliert
4

5
typedef struct { // Structure fürs Menü
6
  const char *text;
7
 [...]
8
  VoidFnct function;
9
} MENU_ENTRY ;
10

11
const MENU_ENTRY menue[] PROGMEM= { // Menü array
12
[...]
13
  { menu_str_1, 0,10, 3, 1, start_child},//2
14
[...]
15
};
16

17
void start_child (int menu_posing) { // diese Soll jetzt nun den Text
18
  lcd_clear();                // ausgeben und die Funktion aufrufen
19
  help_ptr = pgm_read_word(&(menue[menu_posing].text));
20
  lcd_string_p(help_ptr);
21

22
// Hier ist das Problem!
23
        (pgm_read_word(&(menue[menu_posing].function)))(menu_posing);
24

25
}
Gast #687627
Lesenswert?

Hat sich erledigt!

Diese Codeschnipsel hat die Lösung gebracht, für den Fall das jemand 
dieses Problem auch haben mag.
1
  
2
((VoidFnct)(pgm_read_word(&(menue[menu_posing].function))))(menu_posing);

Gruß Marcus
#687817
Lesenswert?

Ich habe mal eine Debug-Console programmiert. Da sah es etwa so aus:
1
typedef void generic_f (char argc, char *argv); 
2

3
typedef struct {
4
  char        *nptr;     /* Name der Funktion */
5
  generic_f   *fptr;     /* Funktionspointer */
6
  char        *syntax;   /* Syntax */
7
}commandtable;
8

9

10
const commandtable f[] = {
11
      {"help ...... Hilfe ausgeben\n",cmd_help,"help\n"},
12
      {"dump ...... Memory Dump\n",cmd_dump,"dump <addr>\n"},
13

14
   //usw.
15

16
};
17

18
/* Wird aufgerufen wenn String+\n empfagen wurde 
19
   cmdptr ist der Pointer auf das eingegebene commando */
20
void call_cmd(char *cmdptr){
21
  char cmd_pos, arguments, cmd_length;
22
  /* Auf gültigkeit prüfen. Wenn Commando erkannt 
23
     Position in commandtable zurückgeben */
24
  cmd_pos = is_cmd(cmdptr);  
25
  if(cmd_pos == -1) 
26
     printf("Kommando nicht gefunden\n");
27
  else{
28
     argc = count_arg(cmdptr, &cmd_length);
29
     arguments = cmdptr+cmd_length+1;     /* command + offset = args */
30
     (f[cmd_pos].fptr)(argc,arguments);    /* Funktion aufrufen */
31
   }
32
}
Ist jetzt nicht ganz vollständig, aber so in etwa gehts. Vorallen recht 
flexibel werden variabler Anzahl von Argumenten usw.

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