mikrocontroller.net

Forum: Compiler & IDEs Function Pointer aus Struct im Flash aufrufen


Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
typedef void (*VoidFnct)(int);

global menu_posing; // wird von Interrupts manipuliert

typedef struct { // Structure fürs Menü
  const char *text;
 [...]
  VoidFnct function;
} MENU_ENTRY ;

const MENU_ENTRY menue[] PROGMEM= { // Menü array
[...]
  { menu_str_1, 0,10, 3, 1, start_child},//2
[...]
};

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

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

}


Autor: Marcus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat sich erledigt!

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

Gruß Marcus

Autor: Timmo H. (masterfx)
Datum:

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

typedef struct {
  char        *nptr;     /* Name der Funktion */
  generic_f   *fptr;     /* Funktionspointer */
  char        *syntax;   /* Syntax */
}commandtable;


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

   //usw.

};

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.