Представьте, что у вас есть резервуар для воды, в который вы непрерывно закачиваете воду. Вы также берете воду из резервуара через маленькую трубу. Если вы не удаляете воду с большей скоростью, чем вы ее закачиваете, бак всегда переполнится, рано или поздно. То же самое верно в обработке данных. Вы должны использовать данные со скоростью, равной или превышающей скорость, с которой вы их производите, иначе рано или поздно вам не хватит памяти. Это факт жизни.
В случае, если данные поступают пакетно, с некоторыми периодами простоя, вы можете избежать медленной обработки, используя достаточно большой буфер для хранения данных на некоторое время. , Но в вашем случае это выглядит так, как будто вы осуществляете непрерывную потоковую передачу или сэмплирование с фиксированной скоростью.
Поскольку вы говорите, что не контролируете скорость, с которой поступают данные, единственный другой вариант - оптимизировать data_process_thread()
, чтобы он работал быстрее, чем скорость поступления данных. 2,5 мс - это достаточно хорошее время для обработки. Внимательно посмотрите на свой код обработки и профилируйте его, чтобы понять, на что он тратит процессорное время. Затем попытайтесь оптимизировать его, чтобы он работал быстрее.
PS: Я только что видел в ваших комментариях, что вы читаете из I2 C. Предполагая, что вы или какой-то другой встроенный микроконтроллер, попробуйте использовать DMA для копирования данных в память с периферийного устройства I2 C, если ваш микроконтроллер поддерживает это. Уменьшение количества прерываний, вероятно, освободит вам больше процессорного времени для обработки.