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