Переключение контекста на определенный процесс после определенного ISR
Есть ли какой-нибудь (грязный) метод, чтобы спровоцировать переключение контекста на определенный процесс после определенного ISR?
В нормальной ситуации, после ISR, процесс, который был прерван, продолжит работать, и мне придется подождать, пока планировщик выберет этот конкретный процесс. Я хочу переключиться на конкретный процесс сразу после ISR.
Любой совет будет отличным. Спасибо!
1 ответ
Создайте свой драйвер так, чтобы процесс имел блокировку потока на подходящем системном вызове (read()
, ioctl()
) с ISR, пробуждающим этот поток (потому что по крайней мере один байт стал доступен для read()
).
Затем убедитесь, что поток имеет наивысший возможный приоритет и предпочтительно использует планировщик реального времени (SCHED_FIFO
или же SCHED_RR
). На практике, если ваш процесс не запускается с привилегиями root, вам нужно запустить службу с привилегиями root, настроить поток, а затем отбросить привилегии; или дать двоичный исполняемый файл CAP_SYS_NICE
возможность, например, через setcap pe=CAP_SYS_NICE binary
,
Технически возможно для водителя также связываться с расписанием, но я бы не стал этого делать. Все, что так критично ко времени, должно быть сделано вместо этого в ядре ISR.
Если вы хотите сделать это в пользовательском пространстве, потому что вы не хотите, чтобы ваш код был производным от ядра и, следовательно, под лицензией GPL, вы сами по себе.