Volani funkci v C pres tabulku vektoru

Miroslav Šinko sinkomiro na gmail.com
Středa Březen 28 01:50:52 CEST 2012


Vase funkcie maju rozne parametre a rozne navratove hodnoty, volanie ich 
musi koretkne predat. Ak by vsetky funkcie boli void funcX(void), tak by 
to mozno slo zjednodusit, ale tiez ma napada len volanie cez pointer. 
Ten by stacil potom len jeden.

Inac tie moje zapisy som odladil na GCC pre AVR:

pFunc1 = (fpFunc1)*((fpFunc1)0x100000);
pFunc2 = (fpFunc2)*((fpFunc2)0x100004);

konkretne pre 32b platformu by stacilo
pFunc1 = (fpFunc1)*((unsigned long*)0x100000);
pFunc2 = (fpFunc2)*((unsigned long*)0x100004);

a este mam copy/paste chybu v 2. riadku z povodneho mailu
 > typedef int (*func2)(int par1, char *par2);
spravne:
typedef int (*fpFunc2)(int par1, char *par2);

miro


On 28. 3. 2012 1:41, Petr Labaj wrote:
> Diky.
> Takze myslite, ze neexistuje varianta skakat primo podle te tabulky
> vektoru (coz by v assembleru urcite slo jako indirect call), ale musim
> to z te Flash vytahat do RAM (do tech pointeru) a volat to az pres ne.
> Myslel jsem prave jestli neexistuje nejaka konstrukce, ktera by v C
> udelala nejak elegantne ekvivalent toho indirect call podle konstaty
> ve Flash.
>
> PL
>
> *************************************
>
> From: "Miroslav Šinko"<sinkomiro na gmail.com>
> To: "HW-news"<hw-list na list.hw.cz>
> Sent: Wednesday, March 28, 2012 1:31 AM
> Subject: Re: Volani funkci v C pres tabulku vektoru
>
>
> Par poznamok bez testovania:
>
> zadefinujte si typ pointera na funkcie. nie je to nutne, ale sprehladni:
> typedef void(*fpFunc1)(int par1);
> typedef int (*func2)(int par1, char *par2);
>
> vytvorte instancie pointerov:
> fpFunc1 pFunc1;
> fpFunc2 pFunc2;
>
> do pointerov teraz treba priradit adresy z tabulky, toto asi z hlavy
> nedam celkom spravne. nejak takto:
> pFunc1 = (fpFunc1)*(0x100000);
> pFunc2 = (fpFunc2)*(0x100004);
>
> vsetky 3 predchadzajuce kroky sa daju napisat v jednom riadku na
> funkciu, ale by to bolo neprehladne.
>
> potom volanie:
> pFunc1(par1);
> iRet = pFunc2(par1, "par2");
>
>
> miro
>
>
> On 28. 3. 2012 0:59, Petr Labaj wrote:
>> Potreboval bych pres tabulku vektoru volat v C knihovni funkce, ktere
>> budou ulozene nekde ve Flash.
>>
>> Vyrobit tu tabulku vektoru na definovane adrese snad nebude moc
>> velky problem, v linker scriptu tomu vyrobim sekci na pevne adrese
>> a udelam tu tabulku treba v ASM:
>>
>> .section ".vectors"
>> .long func1
>> .long func2
>>
>> Ale jak pak ty funkce volat z jineho programu v C, kdyz jedine co vim je,
>> ze funkce maji prototypy napr.
>>
>> void func1 (int par1);
>> int func2 (int par1, char *par2);
>>
>> a ze tabulka vektoru zacina na absolutni adrese treba 0x100000, tedy
>> ze adresa funkce func1 je ulozena na 0x100000 a adresa funkce func2
>> je na 0x100004.
>>
>> Diky za kazdy tip.
>> 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