Тестирование приоритетного прерывания на linux rt lts4.4 с помощью prio-preempt

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

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

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

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

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

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

2
0
44
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

По сути, в системе Linux FULL Preemptive RT потоки с более высоким приоритетом всегда вытесняют потоки с более низким приоритетом, чтобы взять под контроль ЦП. В моем случае проблема на самом деле возникла на еще более быстром процессоре, я тестировал на dual cortexa15@1,5 ГГц или четырехъядерном cortexa15@1,4 ГГц. Однако процент неудач был намного ниже.

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

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

#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");
    }
}

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

Другие вопросы по теме