Fwd: STM CUBE - zkusenosti
Miroslav Mraz
mrazik na volny.cz
Pondělí Říjen 5 10:14:23 CEST 2015
Všechno se vyvíjí. Před pár lety jsme zde diskutovali, zda konstrukce
static const uint8_t pole[] = {1,2,3,4,5,6};
volatile uint32_t x = * (uint32_t *) (pole + 1);
je korektní nebo ne. Tehdy to na Cortex-M0 padalo do hard-fault, dnešní
verze gcc (4.9.3) to přeloží korektně. Stále ale platí, že při podobném
přetypování je lépe se podívat do listingu, co s tím vlastně překladač
provedl.
Tahle dokonalost překladače někdy docela naštve. Dělal jsem port FFT
právě na Cortex-M0, fungovalo to dobře ale jako člověk zvídavý kouknu do
listingu - a ejhle data se tam nějak přesouvají po jednotlivých bytech.
To je divné, protože nejmenší datová jednotka je tam 16-bit integer. Z
mapy vyplynulo, že linker nezarovnal datové bufery, protože to po něm
nikdo nechtěl. Po vynuceném zarovnání tt. buferů (tak aby překladač
věděl, že jsou zarovnány) se běh algoritmu zrychlil na dvojnásobek.
Mrazík
Dne 4.10.2015 v 20:23 Ales Povalac napsal(a):
> Dobrý den,
>
> toto je bug překladače, který mě před pár roky také potrápil. Je
> reportovaný na http://gcc.gnu.org/bugzilla/show_bug.cgi?id=45052 .
> Týká se verze GCC 4.5.1, použité v Sourcery G++ Lite 2010.09-51 a
> Atollic Studiu 2.1.0. Novější verze GCC už potíže nemají.
>
> Zdravím
> A. Povalač
>
>
Další informace o konferenci Hw-list