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


von jola (Gast)


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

von Karl H. (kbuchegg)


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] ));
                                    ***

von jola (Gast)


Lesenswert?

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

Wer lesen kann...

Ich danke vielmals.

von jola (Gast)


Lesenswert?

Nicht zur Strafe nur zur Übung hab ich den FAQ Eintrag zur 
Funktioinszeigertabelle entsprechend erweitert.

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

von Karl H. (kbuchegg)


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)) =

von jola (Gast)


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.