Не уверен, должен ли я публиковать это здесь или нет, но я должен спросить.
Контекст:
- Linux на встроенной платформе (процессор @ ~ 500 МГц)
- Одна команда работает над программным обеспечением для одного пользователя
- Одна команда работает над Linux + драйвер + uboot и т. Д.
Программное обеспечение должно обрабатывать GPIO, некоторые выводятся (пишут при необходимости), некоторые вводятся (читаются при необходимости для одних, предпочтительно как прерывания для других).
Это многопоточное приложение с ~ 10-15 потоками в политике планирования SCHED_FIFO.
Допустим, у меня есть модуль под названием WGPIO, который является оболочкой, обрабатывающей GPIO. (это разработано командой Linux между прочим. WGPIO все еще находится в пользовательском пространстве, но они могут разработать драйвер при необходимости)
Вот некоторый псевдо-код того, что разработано, как мы говорим.
gpio_state state = ON;
// IO_O is output. Set to ON, don't care if it's active_high or active_low btw
WGPIO_WriteOutput(IO_O,state);
// IO_I is input, read when needed
WGPIO_ReadInput(IO_I,&state);
// register callback when rising edge occurs on IO named IO_IT
WGPIO_SetCallback(IO_IT,EDGE_RISING,my_callback);
// Unmask to enable further IT-like processing
WGPIO_UnmaskIRQ(IO_IT);
Я должен быть в состоянии справиться с некоторыми изменениями GPIO за 5-10 мс.
Достаточно ли опроса какого-либо пользовательского пространства (тогда WGPIO будет иметь поток SCHED_FIFO) на нескольких FD, чтобы имитировать обработку, подобную прерыванию, в моем приложении? Это выглядит как самая простая идея.
Если вам нужна дополнительная информация, не стесняйтесь спрашивать.
Заранее спасибо.