Zarovnani v LPC11U68

Tomáš Hamouz hamouz na divesoft.cz
Pondělí Červenec 11 12:42:26 CEST 2016


Až dosud jsem byl přesvědčen že __attribute((aligned(n)))) je
_požadavek_ na compiler/linker, aby danou proměnnou umístil dle
požadavku, nikoliv informace jak je proměnná zarovnaná.

Tedy říkáte jak "má být", nikoliv jak "je".

Tomáš


> Kompilátor to od určité verze (~4.8.x) začal do jisté míry řešit. Přece
> jen není moc dobré, když vyprodukovaný kód skončí v hard fault. A právě
> proto, že to kompilátor začal řešit, je zarovnání dat docela důležité.
> Když strukturu, resp. pole struktur správně zarovnáte a řeknete 
> překladači (právě tím __attribute((aligned(n)))) jak je zarovnána, 
> umožníte mu dělat lepší optimalizaci. Některé funkce tím lze urychlit až
> na dvojnásobek.

> Mrazík

> Dne 11.7.2016 v 06:13 jiri na bezstarosti.cz napsal(a):
>> Pouzivam GCC, pisu to takhle, bez toho se zarovnava podle typu.
>>
>> #define ALIGN4 __attribute((aligned(4)))
>> uint8_t dispdata[1024] ALIGN4 ={
>>               0x00,0x00,0x00,0x00
>> ...
>>
>> Takhle to pro Cortex-M0 pisu, kdyz vim, ze si pro data nekde sahnu treba
>> jako pro uint32_t a deklarovano je uint8_t (zde to bylo kvuli rychlejsimu
>> prehazovani dat po jakesi videopameti LCD).
>>
>> Kdyz si Cortex-M0 sahne pro nezarovnana data, skonci v HardFault, to
>> neumi, a kompilator to neresi.
>>
>> J.B.



Další informace o konferenci Hw-list