Volani funkci v C pres tabulku vektoru
Jaroslav Buchta
jaroslav.buchta na hascomp.cz
Středa Březen 28 06:40:32 CEST 2012
proboha proc tak slozite...
Casto se pro tento ucel pouziva struktura ve ktere jsou typove spravne
ukazatele na funkce
typedef void (*tGPIO_func1)(int par1);
typedef int (*tGPIO_func2)(int par1, char *par2);
typedef struct _FUNCPTRS {
tGPIO_func1 f1;
tGPIO_func2 f2;
...
} FUNCPTRS, *PFUNCPTRS
Pak knihovna muze strukturu na pevne adrese inicializovat
PFUNCPTRS pFuncPtrs = (PFUNCPTRS)0x100000;
pFuncPtrs->f1 = func1;
...
a program prostrednictvim ukazatele na strukturu jednoduse primo volat
funkce. Je to jakasi primitivni obdoba metod u objektoveho programovani.
PFUNCPTRS pFuncPtrs = (PFUNCPTRS)0x100000;
y = pFuncPtrs->f1(x)
...
Je to nezavisle na platforme, praci s ukazateli, zadne tvrde pretypovani.
Mozna tam jsou syntakticke chyby ale jde o princip.
Dne 28.3.2012 3:09, Petr Labaj napsal(a):
> From: "Jindroush"<kubecj na asw.cz>
> From: "Miroslav Šinko"<sinkomiro na gmail.com>
>
> Takze jeste jednou diky obema.
>
> Nakonec se to da udelat takhle:
>
> typedef void (*tGPIO_func1)(int par1);
> typedef int (*tGPIO_func2)(int par1, char *par2);
>
> (*(tGPIO_func1 *)(0x100000)) (1);
> vysl = (*(tGPIO_func2 *)(0x100004)) (2, "ahoj");
>
> Zatim to nemam jak spustit a proverit bojem, ale prelozene do
> assembleru to vypada dobre. Nepotrebuje to zadnou RAM,
> tu adresu si to vezme primo z Flash do registru a podle neho
> to zavola knihovni funkci (na Cortex-M4).
>
> 8000006: f44f 1380 mov.w r3, #1048576 ; 0x100000
> 800000a: 681b ldr r3, [r3, #0]
> 800000c: f04f 007c mov.w r0, #1 ; 0x1
> 8000010: 4798 blx r3
>
> Takze super.
> Ted jeste na to napsat nejake makro, aby se to dalo lidsky pouzivat.
>
> PL
>
> _______________________________________________
> HW-list mailing list - sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
Další informace o konferenci Hw-list