ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
149982 Топик полностью
Alex B. (04.03.2009 17:41, просмотров: 669) ответил Vladimir Ljaschko на Максима: "А нечего вообще битовые поля использовать". Сдали огромную часть территории на откуп компилятору, а теперь нужно изобретать, как забрать обратно.
В данном случае битовые поля структуры - это частный случай. Речь идет об атомарной модификации периферийного регистра или переменной без запрещения прерываний. Дело в том, что оптимизатор компилятора, сука, непредсказуемый. Вот пример, где битовых полей и рядом нет, но проблема выплывает во всей красе:
 00288  804002     mov.w 0x0800, w1
85:                        mys_pt->qwer |=  (1 << 4);
 0028A  900012     mov.w [w1+2], w0
86:                        mys_pt->qwer |=  (1 << 5);
 0028C  B30300     ior.w #0x30,  w0
 0028E  980110     mov.w w0, [w1+2]
А теперь макросы:
92:                        BFARI(&mys_pt->qwer, 4, 4, BFA_SET, 1);
 002A0  2080A1     mov.w #0x80a, w1
 002A2  200100     mov.w #0x10,  w0
 002A4  780101     mov.w w1,     w2
 002A6  700912     ior.w w0,    [w2],[w2]
93:                        BFARI(&mys_pt->qwer, 5, 5, BFA_SET, 1);
 002A8  400000     add.w w0,     w0, w0
 002AA  700891     ior.w w0,    [w1],[w1]
Вот они уже атомарные.
Согласуйте импеданс!