Ебать какую я щас глючину словил...
Сижу, ни кого не трогаю - делаю плавный разгон ШД на атмеге 8.
Ну, думаю, заглянув в дезасм, - ничё военого, и тактов хватает. Захуярю ка прямо в прерывании. Там 1 инкремент инта32, 3 проверки и 1 деление. Длинно, но на вид влазит.
Короч, получается, ожидаемо, бред. Но интересно ж почему. Смотрю в симулятор - и правда, вместо 349 шага - шаг становится 10ххх каким-то, и корёжит кучку полей в структуре, в которой лежит состояние ШД.
Глубже в дезасме - после RETI PC почему-то лезет в кусок кода, который ни к одной команде (а оно сишное) не имеет отношения, вытягивает из стека 2 байта в 2 регистра и так - многораз...
Вытащил из прерывания, всё то же - но через калбэк с главного цикла. В прерывании только 1 инкремент шага и 1 выставление флага посчитать следующую длительность... Всё работает...
НО. Если бы не хватало производительности - шо прямо там, шо в глагнэ - оно бы не успевало считать следующий шаг и не выдерживалась бы скорость.
То есть - успевает, так как скорость набирается до штатной и за положенное время.
Вот что, блядь, у компилатора нетак в голове?