uriy 5 15 августа, 2017 Опубликовано 15 августа, 2017 · Жалоба Делаю проект. В железке используются микрофон, динамик, кнопки, дисплей и USB. Для динамика сейчас выставлен самый высокий приоритет, но даже при этом слышна какая-то рваность в звуке. Когда остается только одна задача вывода звука такой эффект пропадает. Сейчас для вывода звука сделана отдельна задача. В ней происходит масштабирование сэмплов для регулировки уровня громкости и переключение между буферами. Два буфера. Один выводится по DMA в динамик другой обрабатывается. Они переключаются внутри задачи вывода звука. В прерывании по завершению DMA взводится семафор. Внутри задачи жду этот семафор, после получения переключаю буфер и так дальше. Буфера по 180 сэмплов, вывод на частоте 8 кГц. Проц работает на 180 Мгц. Когда работает несколько задач возникает ощущение что на переключение контекста уходит много времени и получается разрыв в ЦАП. Может быть кто-то знает где посмотреть подобные примеры? Пока параллельно разбираюсь с Tracealyzer Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 234 6 октября, 2017 Опубликовано 6 октября, 2017 · Жалоба В прерывании по завершению DMA взводится семафор. Внутри задачи жду этот семафор, после получения переключаю буфер и так дальше. В этом скорее всего и есть причина разрывов. DMA надо перезапускать в самом ISR. А ещё лучше: организовать double-buffer DMA (чтобы после завершения передачи через DMA очередного блока сразу начинал передаваться следующий и при этом происходило прерывание, сигнализирующее о смене блока). И данные для следующих блоков уже должны быть подготовлены заранее задачей. В задачу спускать только нотификацию о необходимости подкачки данных в кольцевой буфер DMA-блоков. Когда работает несколько задач возникает ощущение что на переключение контекста уходит много времени и получается разрыв в ЦАП. Конечно. И когда будут (или уже есть) другие ISR, то они тоже будут приводить к задержке переключения контекста. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
uriy 5 6 октября, 2017 Опубликовано 6 октября, 2017 · Жалоба DMA надо перезапускать в самом ISR.Да я уже сообразил что именно так нужно делать. Теперь работает как надо. Сейчас даже стыдно осознавать что я потратил пару недель прежде чем понял это. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться