Я отлаживаю часть аудиопрограммы, требующей небольшой задержки, но зависящей от работы без xruns. Я уменьшил проблему, чтобы быть в вызове до free()
. Это довольно большой блок данных для освобождения.
Это на Raspberry Pi 3 с использованием Linux и g cc (целевой armhf). Программное обеспечение использует pthread и приоритет в реальном времени. Мне нужно разрешить задержку 21 мс, чтобы использовать программное обеспечение без изменений. Если вы комментируете вызов free()
, я могу выполнить его в течение 5 мс без xruns.
Есть ли способ ускорить вызов free()
? Может быть, использовать какой-то механизм сборки мусора, работающий в потоке с низким приоритетом?
Обновление
После некоторых исследований выясняется, что free()
на самом деле работает в низком уровне приоритетная тема уже. Единственное, что происходит в потоке реального времени, - это одновременная передача данных на аудиоустройство и с него (четыре канала на входе и четыре на выходе). Несмотря на это, free()
вызывает xruns. Это заставляет меня задуматься, не может ли free()
быть прерван даже планировщиком в реальном времени на цели armhf? Размер объекта, который должен быть освобожден, составляет 2 МБ.
Возможно, что-то происходит, что я упустил из виду. Я не являюсь первоначальным автором этого исходного кода, поэтому у меня пока нет полного его понимания.