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

Jan Waclawek konfera na efton.sk
Pondělí Září 18 08:49:55 CEST 2023


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 by www.HW.cz
Hw-list na list.hw.cz
http://list.hw.cz/mailman/listinfo/hw-list



Další informace o konferenci Hw-list