Тестирование приоритетного вытеснения в Linux RT LTS4.4 с помощью prio-preempt - PullRequest
0 голосов
/ 26 октября 2018

Моя система использует Arm cortexa7 @ 1 ГГц с набором патчей реального времени Linux 4.4.138-rt19 от CIP Community: v4.4.138-cip25-rt19

Я пробежал ПРИО-preempt.c чтобы проверить приоритет приоритета в моей системе. Однако у меня есть проблема: система, вероятно, работает только с числом потоков меньше 27 созданных потоков.

Что касается теоретического аспекта, то в приложении ltp prio-preempt создается 27 worker_threads с разными приоритетами, N busy_threads (N: зависит от количества процессоров, в моем случае N = 2) с высоким приоритетом и master_thread (самый высокий приоритет) ).

При развертывании приложения на плате threads_running всегда меньше 27, в то время как create_fifo_thread (worker_thread, i, ...) успешно создало 27 worker_thread (s). Я запустил ту же самую программу выше на cortexa15@1.5GHz, проблема не произошла.

Для дальнейшего понимания я подумал, что проблема может быть связана с планировщиком Linux RT, который не может пробудить спящих потоков после снятия блокировки bmutex .

У кого-нибудь есть такая же проблема для меня? Пожалуйста, поделитесь своей идеей.

1 Ответ

0 голосов
/ 30 ноября 2018

По сути, в системе Linux FULL Preemptive RT потоки с более высоким приоритетом всегда вытесняют потоки с более низким приоритетом для управления процессором (-ами).В моем случае проблема фактически возникла на еще более быстродействующем процессоре, я тестировал на двойной cortexa15@1.5 ГГц или на четырехъядерной cortexa15@1.4 ГГц.Однако частота сбоев была намного ниже.

Поскольку проблема возникала случайным образом, в случае сбоя все процессоры одновременно выполняют потоки с более высоким приоритетом и забывают потоки с более низким приоритетом.

Итак, я назначил определенный процессор для выполнения определенного потока (высокий pri).

#define CPU_0 0x01 /* Bind CPU 0 */
#define CPU_1 0x02 /* Bind CPU 1 */
#define CPU_2 0x04 /* Bind CPU 2 */
#define CPU_3 0x08 /* Bind CPU 3 */
...
{
    unsigned long cpuset = CPU_0;

    if (pthread_setaffinity_np(pthread_self(), sizeof(cpuset), &cpuset) < 0) {
       printf("failed to pthread_setaffinity_np\n");
    }
}

И выдает другие процессоры для выполнения других заданий (низкий pri).Моя система больше не зависает и, вероятно, запускает все 27 worker_thread (потоки низкого уровня)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...