Переключение контекста на определенный процесс после определенного ISR

Есть ли какой-либо (грязный) метод, чтобы спровоцировать переключение контекста на определенный процесс после определенного ISR?

В обычной ситуации после ISR процесс, который был прерван, продолжает работать, и мне приходится ждать, пока планировщик выберет этот конкретный процесс. Я хочу переключиться на конкретный процесс сразу после ISR.

Любой совет будет отличным. Спасибо!


person user3498780    schedule 13.05.2018    source источник
comment
«В обычной ситуации после ISR процесс, который был прерван, продолжит работу» - нет, не всегда, и для подготовки потока/процесса к аппаратному прерыванию не требуется никакого (грязного) метода, это нормальное поведение для драйверов, когда операция ввода-вывода завершена, обычно с использованием семафора или сигнализации о событии и запроса запуска планировщика после выхода из состояния прерывания.   -  person Martin James    schedule 13.05.2018
comment
Если есть свободное ядро ​​или если ваш ожидающий поток имеет достаточно высокий приоритет, чтобы вытеснить все, что выполнялось на ядрах до прерывания, ваш поток/процесс будет запущен, а не просто готов.   -  person Martin James    schedule 13.05.2018


Ответы (1)


Сконструируйте свой драйвер так, чтобы процесс блокировал поток при подходящем системном вызове (read(), ioctl()) с ISR, пробуждающим этот поток (поскольку для read() стал доступен по крайней мере один байт).

Затем убедитесь, что этот поток имеет максимально возможный приоритет и предпочтительно использует планировщик реального времени (SCHED_FIFO или SCHED_RR). На практике, если ваш процесс не запускается с привилегиями root, вам нужно будет запустить службу с привилегиями root, настроить поток, а затем отказаться от привилегий; или предоставить двоичному исполняемому файлу CAP_SYS_NICE возможность, например. setcap pe=CAP_SYS_NICE binary.

Технически водитель тоже может вмешиваться в расписание, но я бы этого делать не стал. Все, что столь критично по времени, должно выполняться в ISR ядра.

Если вы хотите сделать это в пользовательском пространстве, потому что вы не хотите, чтобы ваш код был производным от ядра и, следовательно, под лицензией GPL, вы сами по себе.

person Nominal Animal    schedule 13.05.2018