Автор: AlexMatyu May 28 2018, 10:59
На неком девайсе основанном на процессоре ARM DM3730, работает операционная система Linux (без патчей rt) и моё приложение. В рамках этого приложения множество потоков (планировщик SCHED_RR), основных три:
- поток 1: забор данных с устройства (максимальный приоритет);
- поток 2: подготовки данных (нормальный приоритет);
- поток 3: обработки данных (низкий приоритет);
в последнем потоке происходит вызов из сторонеей библиотеки fftw3.h. при этом, когда данных много и происходит вызов обработки этих данных из сторонней библиотеки, поток 3 захватывает ядро на огромный отрезок времени (~550мс) и не вытесняется. Из-за этого первый поток (самый критичный), не успевает забрать данные, что для меня очень критично.
Помогите с методами решения данной проблемы.
Автор: kolobok0 May 28 2018, 17:45
Цитата(AlexMatyu @ May 28 2018, 13:59)
...Помогите с методами решения данной проблемы.
не буду оригинален...
- спросить сэмпл с интересующими Вас параметрами, у разработчиков сторонней либы.
Думаю лучше него вряд-ли Вам кто сможет подсказать.
Либо если есть исходники - то залазить и смотреть глазками.
со стороны забора данных - стараться всё переместить на железо, чтоб разгрузить алу.
как то так
(круглый)
Автор: Enthusiast Jun 24 2018, 10:40
Обычно я всегда ставлю части кода, чувствительные к времени вызова, в обработчик интервального таймера. Суть подхода в том, что во время срабатывания обработчика таймера на заданное время выполняется только код, вложенный в этот обработчик, а все остальные потоки стоят и ждут. Подробнее почитать об интервальном таймере (8.13 setitimer: Setting Interval Timers) можно тут: http://electronix.ru/redirect.php?http://www.cse.hcmut.edu.vn/~hungnq/courses/nap/alp.pdf.
Автор: Olej Jul 1 2018, 10:05
Цитата(AlexMatyu @ May 28 2018, 13:59)
На неком девайсе основанном на процессоре ARM DM3730, работает операционная система Linux (без патчей rt) и моё приложение. В рамках этого приложения множество потоков (планировщик SCHED_RR), основных три:
- поток 1: забор данных с устройства (максимальный приоритет);
- поток 2: подготовки данных (нормальный приоритет);
- поток 3: обработки данных (низкий приоритет);
в последнем потоке происходит вызов из сторонеей библиотеки fftw3.h. при этом, когда данных много и происходит вызов обработки этих данных из сторонней библиотеки, поток 3 захватывает ядро на огромный отрезок времени (~550мс) и не вытесняется. Из-за этого первый поток (самый критичный), не успевает забрать данные, что для меня очень критично.
Помогите с методами решения данной проблемы.
В Linux обычно (для обычных потоков) вообще особая политика шедулирования, O(0) как они её называют и которой сильно гордятся
Даже с RR шедулирование "по кругу" происходит по системному тику ядра, переменная HZ ядра, обычно равная 1000, а это значит 1 ms, ... тогда совершенно не понятно ваши "~550мс".
У вас точно расставлены потокам
приоритеты реального времени, а не nice?
Проверяли ли вы отладкой, что они действительно
приняты потоками? (нет ошибки при установке).