gcc, arm, pristup k periferiim
Jan Waclawek
konfera na efton.sk
Pátek Srpen 17 15:04:15 CEST 2018
Vlastne...
... dlhsie studium toho .lst ...
... musim sa gcc ospravedlnit.
Ked som namiesto
WRITE_REG(hspi->Instance->CR1, (hspi->Init.Mode | hspi->Init.Direction |
hspi->Init.DataSize |
hspi->Init.CLKPolarity |
hspi->Init.CLKPhase | (hspi->Init.NSS & SPI_CR1_SSM) |
hspi->Init.BaudRatePrescaler |
hspi->Init.FirstBit | hspi->Init.CRCCalculation) );
pouzil
WRITE_REG(SPI1->CR1, (hspi->Init.Mode | hspi->Init.Direction |
hspi->Init.DataSize |
hspi->Init.CLKPolarity |
hspi->Init.CLKPhase | (hspi->Init.NSS & SPI_CR1_SSM) |
hspi->Init.BaudRatePrescaler |
hspi->Init.FirstBit | hspi->Init.CRCCalculation) );
tak cela ta tirada konci (porovnaj so zaverom v
https://list.hw.cz/pipermail/hw-list/2018-August/510530.html kde je adresa
daneho SPI registra v r3, kam bola predtym pracne vyskladana po bytoch
citanych zo vstupnej struktury):
814 028e 4A4A ldr r2, .L34 @ tmp560,
815 0290 1660 str r6, [r2] @ D.8423, MEM[(struct SPI_TypeDef
*)1073819648B].CR1
(pricom
978 .L34:
979 03b8 00300140 .word 1073819648
[nie je mi jasne, preco v toml listingu musia byt byty v poli dat
usporiadene ausgerechnet little endian, ale to je len esteticky problem,
nikto normalny do tych .lst nepozera]).
Cize, ak v zapise je priamo register, ktory treba, tak sa k nemu pristupuje
wordovo, aj ked je zapnute packovanie.
Inaksie povedane, gcc v povodnom pripade pouzije ten bytovy pristup len
kvoli tomu, lebo adresa registra mu je odovzdana cez premennu (ktora je v
tej inicializacnej strukture), takze v okamihu prekladu gcc nevie, ci ta
premenna ukazuje na deklarovanu premennu toho SPI typu (co je tiez
struct), na ktorej by si mohol vynutit zarovnanie od linkera, alebo je ta
SPI struktura polozkou v nejakej vacsej strukture, ktora by mohla byt
kvoli packovaniu nezarovnana...
... cize sa jedna o zasluzeny trest za pouzivanie "kniznic" typu Cube/HAL.
wek
----- Original Message ---------------
>Nemusi, vid ten citat od armu.
>
>Ak je struct ako taky zarovnany (co prekladac moze od linkera vynutit), tak
>prekladac presne vie, ako su zarovnane jeho jednotlive polozky, a tak k
>nim moze pristupit. Ak by to tak nebolo, tak ani po odstraneni
>fpacked-struct by sa nemohlo k jednotlivym polozkam pristupovat inak ako
>po bytoch.
>
>Hento podla mna najdete v bugzille gcc ako poziadavku aby sa to vylepsilo v
>tomto smere, nejdem to hladat.
>
>wek
>
>
>
>----- Original Message ---------------
>>Nikoli možná, ale zcela určitě. U Cortex-M0 je nezarovnaný přístup velký
>>problém, takže překladač to rozložit vlastně musí. Pořád je to lepší než
>>u starých verzí, kdy to rovnou spadlo do hardfaultu. Takže data, která
>>zapisujete (čtete) musí mít explicitní zarovnání pomocí např.
>>__attribute__ ((aligned (4))). U Cortex-M3,4 tohle dělat nemusíte, ale
>>ani tam to není na škodu - mělo by to být o něco efektivnější.
>>
>>Mrazík
>>
>>Dne 17.8.2018 v 13:09 Jaroslav Buchta napsal(a):
>>> ...
>>> Mozna je to i tim, ze struktura nema
>>> attribut zarovnani na 4B.
Další informace o konferenci Hw-list