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