[AVR] (Hilfe) Funktionszeiger-Tabelle im Flash ablegen + zugreifen

Gast #1925698
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.
1
#include <avr/pgmspace.h>
2

3
typedef void (*void_function_ptr) (void);
4

5
void test_function1(void);
6
void test_function2(void);
7

8
static uint8_t volatile function_number = 0u; 
9
static void_function_ptr volatile my_function_ptr = 0u; 
10

11
const void_function_ptr my_functions_ram[] =
12
{
13
   test_function1,
14
   test_function2
15
};
16

17
const void_function_ptr my_functions_flash[] __attribute__ ((progmem)) =
18
{
19
   test_function1,
20
   test_function2
21
};
22

23
int main(void)
24
{
25
   uint8_t cnt;
26

27
   for (;;)
28
   {
29
      for (cnt=0; cnt<(sizeof(my_functions_ram) >> 1u); cnt++)
30
      {
31
         my_function_ptr = my_functions_ram[cnt];
32
         my_function_ptr();
33

34
         my_function_ptr = (void_function_ptr)(pgm_read_word(my_functions_flash[cnt]));
35
         my_function_ptr();
36
      }
37
   }
38

39
   return 0;
40
}
41

42
void test_function1(void)
43
{
44
   function_number = 1u;
45
}
46

47
void test_function2(void)
48
{
49
   function_number = 2u;
50
}

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__pgmspace.html#ga84a61d55b7efefabd8419e28f02704f9
[2] http://www.nongnu.org/avr-libc/user-manual/FAQ.html#faq_rom_array
[3] http://www.mikrocontroller.net/articles/FAQ#Funktionszeiger
[4] 
http://www.avrfreaks.net/index.php?name=PNphpBB2&file=printview&t=2139&start=0
#1928875
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)) =
Gast #1929123
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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.