- 1
- 2
- 3
- 4
static volatile stm32f4_usart *usart_get_regs(const console_tbl *ct)
{
return (stm32f4_usart *) ct->ulCtrlPort1;
}
Нашли или выдавили из себя код, который нельзя назвать нормальным, на который без улыбки не взглянешь? Не торопитесь его удалять или рефакторить, — запостите его на говнокод.ру, посмеёмся вместе!
−52
static volatile stm32f4_usart *usart_get_regs(const console_tbl *ct)
{
return (stm32f4_usart *) ct->ulCtrlPort1;
}
А если будет замест volatile - inline, возможен вариант, что компилятор выкинет эту функцию?
Gay 07.11.2016 16:35 # −66
bormand 07.11.2016 17:29 # +1
volatile stm32f4_usart *
MiD 07.11.2016 17:36 # 0
з.ы. взято отседова:
https://devel.rtems.org/browser/rtems/c/src/lib/libbsp/arm/stm32f4/console/usart.c?rev=1485a58ce30c4ced71446976036f 03a5c32f451d
bormand 07.11.2016 17:41 # +3
MiD 07.11.2016 17:51 # 0
union {
struct {
uint32_t val1 :1;
uint32_t val2 :5;
uint32_t val3 :8;
....
} fields;
uint32_t reg;
};
где val1, val2...valN - это битовые поля внутри регистра, заданной длины. Если я буду, конфигурирую регистр, через битовые поля и не использую volatile, очень велика вероятность, что компилятор может каким то образом всё мне поломать? А если может, то как, например?)
MiD 07.11.2016 17:54 # 0
bormand 07.11.2016 17:56 # +3
Может склеить несколько обращений к битовым полям в одну операцию над целым регистром. Обычно на это насрать, только быстрее работать будет... Но если в даташите, например, написано "заполните все биты кроме enable, а затем установите enable", то может получиться факап.
Soul_re@ver 07.11.2016 17:59 # +2
Например может сломать так:
Теоретически индеец ещё может поломать. И то что положение битовых полей в структуре не определено ЕМНИП.
bormand 07.11.2016 18:01 # 0
Гцц, например, явно оговаривал, что можно такие махинации через юнион гонять...
Soul_re@ver 07.11.2016 18:08 # 0
Реально можно напороться на проблемы если у тебя есть указатель на поле юниона. Большинство компиляторов теперь следуют strict-aliasing и запись/чтение несовпадающих типов может не работать.
bormand 07.11.2016 18:11 # 0
Soul_re@ver 07.11.2016 18:16 # +1
bormand 07.11.2016 18:17 # +1
MiD 07.11.2016 18:38 # +1
Soul_re@ver 07.11.2016 18:41 # 0
bormand 07.11.2016 18:43 # 0
MiD 07.11.2016 18:53 # 0
http://ideone.com/JUUEbb
bormand 07.11.2016 20:19 # 0
kurwa-nextgen 07.11.2016 21:34 # 0
http://ideone.com/pDB1X0
barop 07.11.2016 22:33 # −63
gost 08.11.2016 12:44 # 0
proctologist 08.11.2016 16:43 # 0
bormand 07.11.2016 18:05 # +2
dxd 07.11.2016 22:44 # 0
barop 07.11.2016 23:07 # −63
bormand 07.11.2016 23:33 # +3
The practice of reading from a different union member than the one most recently written to (called “type-punning”) is common. Even with -fstrict-aliasing, type-punning is allowed, provided the memory is accessed through the union type.
https://gcc.gnu.org/onlinedocs/gcc-4.9.2/gcc/Optimize-Options.html