[email protected] 0 28 мая, 2018 Опубликовано 28 мая, 2018 · Жалоба На неком девайсе основанном на процессоре ARM DM3730, работает операционная система Linux (без патчей rt) и моё приложение. В рамках этого приложения множество потоков (планировщик SCHED_RR), основных три: - поток 1: забор данных с устройства (максимальный приоритет); - поток 2: подготовки данных (нормальный приоритет); - поток 3: обработки данных (низкий приоритет); в последнем потоке происходит вызов из сторонеей библиотеки fftw3.h. при этом, когда данных много и происходит вызов обработки этих данных из сторонней библиотеки, поток 3 захватывает ядро на огромный отрезок времени (~550мс) и не вытесняется. Из-за этого первый поток (самый критичный), не успевает забрать данные, что для меня очень критично. Помогите с методами решения данной проблемы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
kolobok0 0 28 мая, 2018 Опубликовано 28 мая, 2018 · Жалоба ...Помогите с методами решения данной проблемы. не буду оригинален... - спросить сэмпл с интересующими Вас параметрами, у разработчиков сторонней либы. Думаю лучше него вряд-ли Вам кто сможет подсказать. Либо если есть исходники - то залазить и смотреть глазками. со стороны забора данных - стараться всё переместить на железо, чтоб разгрузить алу. как то так (круглый) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Enthusiast 0 24 июня, 2018 Опубликовано 24 июня, 2018 · Жалоба Обычно я всегда ставлю части кода, чувствительные к времени вызова, в обработчик интервального таймера. Суть подхода в том, что во время срабатывания обработчика таймера на заданное время выполняется только код, вложенный в этот обработчик, а все остальные потоки стоят и ждут. Подробнее почитать об интервальном таймере (8.13 setitimer: Setting Interval Timers) можно тут: "Advanced Linux programming". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Olej 0 1 июля, 2018 Опубликовано 1 июля, 2018 · Жалоба На неком девайсе основанном на процессоре ARM DM3730, работает операционная система Linux (без патчей rt) и моё приложение. В рамках этого приложения множество потоков (планировщик SCHED_RR), основных три: - поток 1: забор данных с устройства (максимальный приоритет); - поток 2: подготовки данных (нормальный приоритет); - поток 3: обработки данных (низкий приоритет); в последнем потоке происходит вызов из сторонеей библиотеки fftw3.h. при этом, когда данных много и происходит вызов обработки этих данных из сторонней библиотеки, поток 3 захватывает ядро на огромный отрезок времени (~550мс) и не вытесняется. Из-за этого первый поток (самый критичный), не успевает забрать данные, что для меня очень критично. Помогите с методами решения данной проблемы. В Linux обычно (для обычных потоков) вообще особая политика шедулирования, O(0) как они её называют и которой сильно гордятся :biggrin: Даже с RR шедулирование "по кругу" происходит по системному тику ядра, переменная HZ ядра, обычно равная 1000, а это значит 1 ms, ... тогда совершенно не понятно ваши "~550мс". У вас точно расставлены потокам приоритеты реального времени, а не nice? Проверяли ли вы отладкой, что они действительно приняты потоками? (нет ошибки при установке). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться