Zeiger auf eine Funktion im Flash.
Hallo,
irgendwie verstehe ich das jetzt mit den Pointern auf Flashspeicher nicht :-s
Als Beispiel hier ein Miniprogramm in C:
Code:
#include<stdio.h>
void zeige(void) {
printf("Hallo, hier bin ich\n");
}
void zeige2(void) {
printf("und hier noch einmal\n");
}
int main(void) {
typedef void (*funktion) (void);
funktion feld[] = {&zeige,&zeige2};
feld[0]();
feld[1]();
return 0;
}
Es hat nicht viel Sinn, soll einfach nur deutlich machen, wo mein Problem liegt.
Auf dem PC klappt es ja Prima, auf dem AVR hol ich mir ja irgendwelche RAM Adressen #-o .
Ich weiß daß es an der Harvard Architektur und an den getrennten RAM/FLASH/EEPROM Adressräumen liegt, es ist auch kein Problem Daten zu lesen, nur halt mit Zeigern krieg ich das nicht hin ](*,)
Aus der Doku zu avr-gcc werde ich auch nicht schlauer...
Könnte mir mal jemand unter die Arme greifen und mir mal sagen wie ich das Miniprogramm in AVR implementiere ?
Gruß Sebastian
Re: Zeiger auf eine Funktion im Flash.
Code:
typedef void (*function_t) (void);
extern void zeige (void);
extern void zeige2 (void);
function_t feld[] = {zeige, zeige2};
void caller (int addr, function_t zeige3)
{
feld[0]();
feld[1]();
zeige3();
((void(*)(void)) addr) ();
}
Zitat:
Zitat von izaseba
Könnte mir mal jemand unter die Arme greifen und mir mal sagen wie ich das Miniprogramm in AVR implementiere?
Gruß Sebastian
Geht genauso.
Obiger Code assemblier avr-gcc so:
Code:
.file "foo.c"
.arch atmega8
__SREG__ = 0x3f
__SP_H__ = 0x3e
__SP_L__ = 0x3d
__tmp_reg__ = 0
__zero_reg__ = 1
.global __do_copy_data
.global __do_clear_bss
.global feld
.data
.type feld, @object
.size feld, 4
feld:
.word pm(zeige)
.word pm(zeige2)
.text
.global caller
.type caller, @function
caller:
/* prologue: frame size=0 */
push r14
push r15
push r16
push r17
/* prologue end (size=4) */
movw r14,r24
movw r16,r22
lds r30,feld
lds r31,(feld)+1
icall
lds r30,feld+2
lds r31,(feld+2)+1
icall
movw r30,r16
icall
movw r30,r14
icall
/* epilogue: frame size=0 */
pop r17
pop r16
pop r15
pop r14
ret
/* epilogue end (size=5) */
/* function caller size 25 (16) */
.size caller, .-caller
/* File "adc.c": code 25 = 0x0019 ( 16), prologues 4, epilogues 5 */