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