AVR: array of function-pointers in progmem, Was mache ich falsch?

OP #4481997
Lesenswert?
• ▲
▼
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.
OP #4482036
Lesenswert?
• ▲
▼
OK sorry fürs stören. Hab den Fehler entdeckt.
"&" hat gefehlt!

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 ] ); // <-- hier fehte das '&'
14
    return cmdFunc();
15
}

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.