GCC optimalizace, zahada

Jaroslav Buchta jaroslav.buchta na hascomp.cz
Sobota Listopad 4 09:52:50 CET 2017


Jak uz jsem psal, to pretypovani taky uplne nepomohlo, jen se zmenilo 
chovani. Ty inline funkce zkusim, makro jsem udelal, protoze mi to 
prislo jako dobry navod pro prekladac, ze z toho opravdu nema udelat 
normalni funkci.
Nejdriv ale zkusim probadat ten assembler, je to ale opravdu 
neprehledne, vse je v registrech a divne offsetovano. Pricina problemu 
mne opravdu zajima. Displej by mel data zapsat vzestupnou hranou a DSB + 
ISB zajisti asi 150ns prodlevu WR v 0 i podle mereni, takze v casovani 
asi problem nebude.

A ten registr BSRR se da pouzivat i sestnactibitove? Mam dojem, ze jsem 
nekde cetl, ze ne a taky by to popiralo duvod existence registru BRR 
(neni to horni pulka BSRR) Navic vyuzivam toho, ze set i reset se udela 
jednim 32b zapisem, ladim na max. rychlost.

Dne 04.11.2017 v 9:31 Miroslav Mraz napsal(a):
> #define APPLYDOREGS(A,B,C)    *(uint32_t volatile*)(&GPIOA->BSRR) = A;\
> atd.
> Možná je lepší si předefinovat ty registry něco jako
> typedef struct {
> ...
> union {
>   struct {
>     volatile uint16_t BSR;
>     volatile uint16_t BRR;
>   };
>   volatile uint32_t BSRR;
> };
> ...
> } GPIO_Type;
> a pracovat s tím bez toho ošklivého přetypování. Ale jestli to máte už 
> v programu na víc místech, tak se na to vykašlete a přetypujte. Oni 
> asi mají v STM uniony zakázané - to je další příklad, kdy byrokratický 
> postup certifikace vítězí nad zdravým rozumem. Nepoužívat uniony je 
> rozumné, pokud chcete kód přenášet na architekturu s jinou endianitou. 
> Tohle ale nikdo na jinou architekturu přenášet nebude, takže k zákazu 
> union není důvod. Nakonec ARM v CMSIS uniony používá.
> Rýpavá poznámka. Proč používáte makra ? Není lepší použít statickou 
> inline funkci ? Makra bývají občas také zdrojem problémů.
>
> Mrazík
>
> Dne 3.11.2017 v 20:08 Jaroslav Buchta napsal(a):
>> ...
>> #define APPLYDOREGS(A,B,C)    *(uint32_t *)(&GPIOA->BSRR) = A;\
>>                              *(uint32_t *)(&GPIOB->BSRR) = B;\
>>                              *(uint32_t *)(&GPIOC->BSRR) = C
>> ...
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list




Další informace o konferenci Hw-list