www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [AVR] (Hilfe) Funktionszeiger-Tabelle im Flash ablegen + zugreifen


Autor: jola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich nutze eine Tabelle mit Funktionszeigern. Die Tabelle im RAM 
(my_functions_ram) funktioniert auch prima, so wie ich das möchte.
Die Tabelle im FLASH (my_functions_flash) leider nicht.
#include <avr/pgmspace.h>

typedef void (*void_function_ptr) (void);

void test_function1(void);
void test_function2(void);

static uint8_t volatile function_number = 0u; 
static void_function_ptr volatile my_function_ptr = 0u; 

const void_function_ptr my_functions_ram[] =
{
   test_function1,
   test_function2
};

const void_function_ptr my_functions_flash[] __attribute__ ((progmem)) =
{
   test_function1,
   test_function2
};

int main(void)
{
   uint8_t cnt;

   for (;;)
   {
      for (cnt=0; cnt<(sizeof(my_functions_ram) >> 1u); cnt++)
      {
         my_function_ptr = my_functions_ram[cnt];
         my_function_ptr();

         my_function_ptr = (void_function_ptr)(pgm_read_word(my_functions_flash[cnt]));
         my_function_ptr();
      }
   }

   return 0;
}

void test_function1(void)
{
   function_number = 1u;
}

void test_function2(void)
{
   function_number = 2u;
}

Da meine Tabelle immer größer wird, möchte ich sie wirklich gerne 
komplett in den Flash verbannen. Dazu habe ich versucht mich mit [1], 
[2], [3] und vor allem [4] entsprechend schlau zu machen. Aber bisher 
erfolglos. [4] passt genau zu meiner Frage, aber eine abschließende 
Lösung kann ich leider nicht heraus lesen.

Vielleicht kann mir einer noch ein paar Tipps geben, oder mich in die 
richtige Richtung schubsen. Für jede Hilfe bin ich dankbar.

Gruß
jola


[1] 
http://avr-libc.nongnu.org/user-manual/group__avr_...
[2] http://www.nongnu.org/avr-libc/user-manual/FAQ.htm...
[3] http://www.mikrocontroller.net/articles/FAQ#Funktionszeiger
[4] 
http://www.avrfreaks.net/index.php?name=PNphpBB2&f...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jola schrieb:

>          my_function_ptr =
> (void_function_ptr)(pgm_read_word(my_functions_flash[cnt]));


          my_function_ptr =
 (void_function_ptr)(pgm_read_word(  & my_functions_flash[cnt] ));
                                    ***

Autor: jola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> my_function_ptr =
>  (void_function_ptr)(pgm_read_word(  & my_functions_flash[cnt] ));
>                                     ***

Wer lesen kann...

Ich danke vielmals.

Autor: jola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nicht zur Strafe nur zur Übung hab ich den FAQ Eintrag zur 
Funktioinszeigertabelle entsprechend erweitert.

http://www.mikrocontroller.net/articles/FAQ#Funkti...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
jola schrieb:
> Nicht zur Strafe nur zur Übung hab ich den FAQ Eintrag zur
> Funktioinszeigertabelle entsprechend erweitert.

Sollte eigentlich unnötig sein, denn dein Problem hat ja nichts mit 
Funktionszeigern an sich zu tun, sondern damit, dass du pgm_read_word 
falsch benutzt hast.
Denn dein Problem war ja nichts anderes, als das pgm_read_word eine 
Adresse haben will von der es Lesen soll. Jeder der Flash-Zugriffe 
verstanden hat, sollte das eigentlich unmittelbar kapiert haben, zumal 
es ja anders logisch gesehen gar nicht geht.

Aber wenn schon, dann hättest du auch mal einen Blick in den Abschnitt 
"Flash-Zugriffe" machen sollen um nachzusehen, wie die im Tuturial 
vorgesehene Syntax für Variablen im Flash funktioniert.

const void_function_ptr my_functions_flash[] PROGMEM =  ...

und nicht

const void_function_ptr my_functions_flash[] _attribute_ ((progmem)) =

Autor: jola (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Karl heinz Buchegger schrieb:
> Sollte eigentlich unnötig sein, denn dein Problem hat ja nichts mit
> Funktionszeigern an sich zu tun, sondern damit, dass du pgm_read_word
> falsch benutzt hast.

Absolut richtig. Ich war zu sehr auf die Funktionszeiger fixiert.

Trotzdem denke ich, dass es da in der FAQ gut dazu passt. Ich behaupte 
mal wagemutig, dass öfter konstante als veränderbare 
Funktionszeigertabellen benutzt werden. Und wenn nicht, hoffe ich, dass 
es zumindest nicht verwirrt. Es wurde ja nicht gelöscht sondern das 
PROGMEM / attribute ((progmem)) Problem statt dessenn korrigiert, 
danke.

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.