Делаю финтифлюшку с проигрывателем звука в МК на ШИМ.
Делаю искусственное расширение 8кГц данных до 48кГц путем многократной передачи одного значения.
Получаю 48кГц прерывания, внутри инкремент до 6, потом идет запрос в main на смену значения. Ибо промежуточный буфер с данными варится в main loop.
Собираю gcc, норм работает.
Делаю -O1.
Частота ШИМ внезапно возрастает. На слух раза в два.
Целый день еложу по флагам компилятора, юзаю какие-то __attribute__.
Леплю счетчики, чтобы узнать количество вхождений в прерывание, до прерывания, внутри прерывания после запроса значения, внутри прерывания теоретически между запросами на данные (и ска, оно туда попадает!).
Ничего не помогает.
Я бы оставил без расширения частот. Но звук говно, и не могу впихнуть отрывок звука, лучше чем 8кГц.
Я бы оставил без оптимизации. Но тогда в целевой МК не влезет то, что есть.
Товарищ куда-то в ассемблерные листинги полез, ничего не нашел.
Короч, хз. Одно расстройство.
Блин, я всего-то хотел побибикать в ШИМ.
___
UPD.
Проблема решилась.
Воткнул в прерывание гпио, чтоб посмотреть, совпадает ли частота прерываний с частотой шим. Ну а вдруг.
Как оказалось, при включенной оптимизации прерывание №1 затягивалось, а прерывание №2 срабатывало очень быстро.
Вот так и получалось повышение частоты в два раза.
Гугл и товарищ подсказали поставить в конце прерывания цикл на ожидание, когда там флаг сбросится.
И помогло.
Теперь следующая загадка - включение lto просто убивает программу.
Но это уже совсем другая история.