Forum: Mikrocontroller und Digitale Elektronik AVR: array of function-pointers in progmem, Was mache ich falsch?


von Leo B. (luigi)


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.

von Leo B. (luigi)


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
}

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.