Zarovnani v LPC11U68

Miroslav Mraz mrazik na volny.cz
Úterý Červenec 12 09:38:02 CEST 2016


Mě to tak připadá, že nemožnost nezarovnaného přístupu u cortex-M0 je 
hodně velký zásah do překladače. Pak samosebou dlouho trvá než se 
vychytají všechny mouchy. Dokonce je pravděpodobné, že původní návrh 
překladače, který byl patrně dělán pro x86, s možností, že procesor 
nebude umět nezarovnaný přístup, vůbec nepočítal a tak to tam 
dopatlávají, jak to jde. Proto jsou s tou M0(+) pořád nějaké problémy, 
které s M3,4 nebývají.
CLANG jsem taky zkoušel někdy ve verzi 3.5, ale zase tak moc nadšený 
jsem z něj nebyl. Možná má lepší podporu pro C++11, ale to nepoužívám. 
GCC produkovalo kratší a tak nějak přehlednějsí kód.

Mrazík

Dne 12.7.2016 v 08:51 Tomáš Hamouz napsal(a):
> Když už píšete o potřebě nejnovějších kompilátorů, tak zrovna minulý
> týden jsem řešil podobný problém.
>
> Používám CLANG (je restriktivnější) a po posledním upgrade IDE
> (Crossworks, včetně překladačů) mi to začalo házet výjimky na
> nezarovnaná data.
> Ukázalo se, že zřejmě optimalizační logiku přehnali, nebo udělali
> defaultně zarovnání na 1.
>
> Typický případ:
>
> // data z akcelerometru
> typedef struct {
>      uint8_t osa_x;
>      uint8_t osa_y;
>      uint8_t osa_z;
> } t_accm_data;
>
> t_accm_data    accm_average_buffer[ACCM_AVERAGE_LENGTH];
>
>
> void add_accm_data(t_accm_data* new_data) {
>       ... posun pointeru idx
>       accm_average_buffer[idx] = *new_data;
> }
>
>
> Přiřazení celé struktury se přeloží jako přesun 16b a pak 8b.
> Jenže sizeof(t_accm_data) je 3 a tím pádem při druhém průchodu se čte
> 16b z liché adresy :-(
>
> V předchozí verzi to fungovalo a když to přeložím GCC tak to funguje
> taky. Musel jsem udělat ruční zarovnání a přidat čtvrtý byte do
> struktury.
> A ani to nebylo všechno, ukázalo se že pole accm_average_buffer je
> taky nezarovnané. Zřejmě předpokládají že když struktura obsahuje samé
> 1B položky, tak ji není nutné zarovnávat. Ale ještě to neřekli těm
> kteří píšou kopírování celých struktur :-/
>
> Tomáš
>
>


Další informace o konferenci Hw-list