GCC optimalizace, zahada

Miroslav Mraz mrazik na volny.cz
Sobota Listopad 4 09:31:31 CET 2017


#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
> ...


Další informace o konferenci Hw-list