[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

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