ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Воскресенье
2 июня
154757
AlexBi (24.04.2009 12:29, просмотров: 13188)
Нашел маленький, но не приятный баг в С30 Программа struct SS { unsigned var; unsigned f1 : 1; unsigned f2 : 1; } ; void foo(struct SS *ps, unsigned f) { if(f) { asm(" disi #0x3ff"); ps->f1=1; asm(" disi #0"); } else { asm(" disi #0x3ff"); ps->f1=0; asm(" disi #0"); } } Результат компиляции при включенной оптимизации -Os .global _foo ; export _foo: mov [w0+2],w2 cp0 w1 .set ___BP___,50 bra z,.L2 disi #0x3ff bset w2,#0 bra .L6 .L2: disi #0x3ff bclr w2,#0 .L6: mov w2,[w0+2] disi #0 return Т.е. атомарного доступа к ps->f1 за счет asm(" disi ") не получилось. Однако при оптимизации -O3 результат нормальный. Интересно, можно ли переписать эту функцию на АСМ, но не привязываться к конкретному положению f1 в структуре, т.е. что бы это положение определялось автоматически?