C : Ako zadefinovat tabulku funkcii do flash pamati v C99?

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Pondělí Září 18 09:08:02 CEST 2023


Tak jedine, kam se da vrazit to const je takhle, jen je problem to 
otestovat aby to prekladac nevyhodil a nevolal fci rovnou.
Zkusil jsem to takhle pro STM32 a jtabulka Fn_Arrayx je ve flash

// tabulkafunkcii

void( * constFn_Arrayx[4])() = {

Fn1,

Fn2,

Fn3,

Fn4

};

volatilevoid( * Fn_Array[4])();

....

memcpy(Fn_Array, Fn_Arrayx, sizeof(Fn_Array));

Fn_Array[0]();


Dne 18.09.2023 v 8:49 Jan Waclawek napsal(a):
> V mikrokontroleroch je bezne, ze je niekolko druhov pamati s roznymi
> vlastnostami. Okrem FLASH vs. RAM to moze byt napr. niekolko druhov RAM s
> roznou dobou pristupu, pamate s uplne inym sposobom pristupu (to je pripad
> FLASH/RAM v mnohych 8-bitoch, alebo napr. EEPROM, kde sice zapis je mozny
> ale dlho trva a ma svoje pravidla, alebo napr, externa pamat v '51, apod.).
>
> Toto norma C nijako neriesi. C predpoklada uniformnu suvislu pamat.
> Niektori clenovia komisie pre normu C pred 20 rokmi urobili chaby pokus v
> tomto smere navrhom TR18037, ale ten je jednak nedovareny, a druhak sa do
> normy nedostal.
>
> Inaksie povedane, toto si riesi kazdy prekladac po svojom, mnohe to
> jednoducho neriesia vobec a nechavaju to na invencii uzivatela.
>
> Pomerne rozsirenym (i ked uplne nespravnym) riesenim je, ze ak sa premenna
> definuje ako const, tak prekladac ju umiestni do FLASH. Skus to. Pozor na
> to, ze pri smernikoch mas v jednej definicii dva typy (typ, na ktory sa
> ukazuje a typ, ktorym sa ukazuje - takze mozes mat napr. smernik ukazujuci
> na konstantny char, alebo konstantny smernik ukazujuci na [nekonstantny]
> char (a samozrejme aj konstantny smernik ukazujuci na konstantny char a k
> napises tie const dva, pred aj za hviezdicku)), takze je dolezite, kam sa
> presne ten const napise. Uprimne povedane, funkcne smerniky nepouzivam,
> vyhybam sa im, takze neviem presne ako to zapisat spravne.
>
> wek
>
>
> ----- Original Message ---------------
>
> Subject: C : Ako zadefinovat tabulku funkcii do flash pamati v C99?
>     From: Jan Waclawek<konfera na efton.sk>
>     Date: Mon, 18 Sep 2023 08:40:24 +0200
>       To:hw-list na list.hw.cz
>
> [preposielam]
>
> Ahojte,
>
> chvilku sa trapim s definovanim tabulky funkcii vo Flash. Ide mi o
> nasledovnu cast kodu:
>
> void Fn1(void) {
> };
> void Fn2(void) {
> };
> void Fn3(void) {
> };
> void Fn4(void) {
> };
>
> // tabulka funkcii
> void ( *Fn_Array[4])() = {
>     Fn1,
>     Fn2,
>     Fn3,
>     Fn4
> }
>
> Ked zapisem tu tabulku takto, tak mi komplikator C da tabulku do RAM a
> zozerie mi patricne miesto v RAMke, ale nevygeneruje ziadny warning ani
> error. Chcel by som sa preto spytat, ako mam v C99 zapisat tu tabulku
> funkcii, aby sa nekopirovala do RAM ale ostala vo Flash. Niekde treba
> vhodne doplnit const, ale neviem kde, stale mi vyhadzuje
> warningy. Kompilator je XC8 v2.43 free s -O2 optimalizaciami. Stara verzia
> PicC PRO to vedela prelozit do flash automaticky, ale ta zase nie je C99
> kompatililna.
>
> Velmi pekne dakujem za pomoc.
>
> A.
>
> _______________________________________________
> HW-list mailing list  -  sponsored bywww.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>
> _______________________________________________
> HW-list mailing list  -  sponsored bywww.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list

------------- další část ---------------
HTML příloha byla odstraněna...
URL: <http://list.hw.cz/pipermail/hw-list/attachments/20230918/39383590/attachment-0001.htm>


Další informace o konferenci Hw-list