Когда я пытался получить некоторые сигналы в частотной области, я столкнулся с проблемой того, что snd_pcm_readi () может занимать очень много времени. Это вызывает проблемы в разделе logi c моего кода, который зависит от времени.
У меня есть то, что большую часть времени snd_pcm_readi () возвращается через приблизительно от 0,00003 до 0,00006 секунд. Однако каждый 4-5 вызов snd_pcm_readi () требует приблизительно 0,028 секунд. Это огромная разница, и это приводит к сбою части моего кода в logi c.
Как получить согласованное время для каждого вызова snd_pcm_readi ()?
пытался поэкспериментировать с размером периода, но мне неясно, что именно он делает, даже после перечитывания документации несколько раз. Я не использую дизайн, управляемый прерываниями, я просто вызываю snd_pcm_readi () и он блокируется до тех пор, пока не вернется - с данными.
Я могу только предположить, что причина, по которой он блокируется на переменное количество времени, заключается в том, что что snd_pcm_readi () извлекает данные из аппаратного буфера, в котором уже есть данные, которые легко доступны для передачи в «буфер приложений» (который я поддерживаю). Однако иногда приходится выполнять дополнительную работу в пространстве ядра или на аппаратной стороне, поэтому вызов функции в этих случаях занимает больше времени.
Какой цели служит «размер периода», когда я не используете дизайн, управляемый прерываниями? Может ли моя проблема быть решена путем манипулирования размером периода, или я должен сделать что-то еще?
Я хочу добиться, чтобы каждый вызов snd_pcm_readi () занимал примерно одинаковое количество времени. Я не прошу API-интерфейс, совместимый с реальным временем, который, как я полагаю, ALSA даже не пытается из-за разницы во времени вызова функций, порядка 500 раз длиннее (что что я вижу!) тогда это реальная проблема.
Что с этим можно сделать и что мне с этим делать?
Я бы привел минимальный воспроизводимый пример, но это не легко в моем случае.