Hallo zusammen,
ich sitze gerade ernsthaft auf dem Schlauch und finde den Fehler nicht.
Mein System:
AVR ATmega168, AVR/GNU C Compiler 4.9.2 aus der AtmelStudio 7 Toolchain
Debugger ist mein altes STK500
Nun habe ich im Programm ein Array von Pointern auf Funktionen und
möchte dieses aus dem Ram in den Flash legen. Folgendes ist mein
Ram-Ansatz der funktioniert:
1 | typedef uint8_t (*cmdfunc_t)( void );
|
2 |
|
3 | uint8_t cmdfunc_execute( const uint8_t funcNr )
|
4 | {
|
5 | static const cmdfunc_t uartCmdFuncList[] = {
|
6 | func1, func2, ..., funcN
|
7 | };
|
8 |
|
9 | // debug
|
10 | printf( "%p", (void*)uartCmdFuncList[ funcNr ] ); // => 0x1E03
|
11 |
|
12 | return uartCmdFuncList[ funcNr ]();
|
13 | }
|
Und jetzt mein nicht funktionierender flash-Ansatz:
1 | typedef uint8_t (*cmdfunc_t)( void );
|
2 |
|
3 | uint8_t cmdfunc_execute( const uint8_t funcNr )
|
4 | {
|
5 | static const cmdfunc_t cmdFuncArr[] PROGMEM = {
|
6 | func1, func2, ..., funcN
|
7 | };
|
8 |
|
9 |
|
10 | // debug
|
11 | printf( "%p", (void*)pgm_read_word( cmdFuncArr[ funcNr ] ) ); // => 0xFFFF
|
12 |
|
13 | cmdfunc_t cmdFunc = (cmdfunc_t)pgm_read_word( cmdFuncArr[ funcNr ] );
|
14 | return cmdFunc();
|
15 | }
|
So und hier steh ich am Schlauch. Warum funktioniert die RAM-Variante,
aber nicht die FLASH-Variante?
Was mache ich falsch? warum liest er 0xFFFF aus dem Flash, anstatt
0x1E03?
Hat jemand einen Tip oder Rat für mich?
Vielen herzlichen Dank schonmal fürs lesen.