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