Реализация корректной межмодульной синхронизации в ядре Linux

Я реализую специальный драйвер последовательной шины для определенной платы Linux на базе ARM (фактически, специальный драйвер UART). Этот драйвер должен обеспечивать связь с определенным MCU на другом конце шины по специальному протоколу. Драйвер не будет (и на самом деле не должен) предоставлять какую-либо из своих функций пользовательскому пространству, и его вообще невозможно реализовать в пользовательском пространстве (следовательно, потребность в пользовательском драйвере вместо использования стандартного подсистема телетайпа).

Драйвер будет реализовывать протокол связи и операции чтения/записи UART, и он должен экспортировать набор функций более высокого уровня для своих пользователей, чтобы они могли обмениваться данными с MCU (например, read_register(), drive_gpios()и все такое прочее). Будет только один пользователь этого модуля.

Вызывающий модуль должен будет дождаться завершения операций (упомянутая выше read_register()и другие). В настоящее время я рассматриваю возможность использования семафоров: пользовательский модуль будет вызывать функцию моего драйвера, которая будет инициировать передачу и ожидать семафора; обработчик IRQ моего драйвера будет отправлять запросы на MCU и читать ответы, а когда это будет сделано, отправить сообщение на семафор, тем самым разбудив вызывающий модуль. Но я не совсем знаком с программированием ядра, и меня сбивает с толку множество возможных альтернативных реализаций (задачи? очереди ожидания?).

Вопрос в том, подходит ли мой подход, основанный на семафорах, или он слишком наивен? Каковы возможные альтернативы? Есть ли какие-то подводные камни, которые я могу упустить?

7
задан Roman Dmitrienko 2 April 2012 в 10:50
поделиться