Wdrażam niestandardowy sterownik magistrali szeregowej dla określonej płyty opartej na systemie ARM (w rzeczywistości jest to niestandardowy sterownik UART). Ten sterownik umożliwia komunikację z określonym MCU na drugim końcu magistrali za pomocą niestandardowego protokołu. Kierowca nie będzie (a właściwie musi nie) narazić któregokolwiek z jej funkcji w przestrzeni użytkownika, ani nie jest to możliwe do wdrożenia go w przestrzeni użytkownika w ogóle (stąd konieczność sterownika niestandardowego zamiast używania akcji TTY podsystemu).Implementacja poprawnej synchronizacji między modułami w jądrze Linuksa
Kierowca będzie wdrożyć protokół komunikacyjny i UART odczytuje/zapisuje i ma do eksportowania zestaw funkcji wyższego poziomu do swoich użytkowników, aby umożliwić im komunikowanie się z MCU (np read_register()
, drive_gpios()
, wszystkie te rzeczy) . Będzie tylko jeden użytkownik tego modułu.
Moduł wywołujący będzie musiał czekać na zakończenie operacji (wyżej wymienione read_register()
i inne). Obecnie rozważam użycie semaforów: moduł użytkownika wywoła funkcję mojego sterownika, która zainicjuje transfery i zaczeka na semafor; przerywnik IRQ mojego sterownika wysyła żądania do MCU i odczytuje odpowiedzi, a po zakończeniu wysyła do semafora, budząc moduł wywołujący. Ale nie jestem obeznany z programowaniem jądra i jestem zaskoczony mnóstwem możliwych alternatywnych implementacji (tasklets? Wait queues?).
Pytanie brzmi: czy moje podejście oparte na semaforach jest w porządku, czy jest zbyt naiwne? Jakie są możliwe alternatywy? Czy są jakieś pułapki, których może mi brakować?
Semafory powinno załatwić sprawę z tego, co rozumiem, aby enderstand lepsze wewnętrzne linux nalezy skorzystac ładnym książce „Rozwój jądra linex 3rd edition”, który jest dostępny za darmo PDF i jest na bieżąco (.39 jądra wierzę). Ta książka nie jest naprawdę głęboka, ale wyjaśnia podstawowe zasady i pokazuje opcje. Miłej zabawy w hakowanie. – AoeAoe
Miła książka, dziękuję! Jeśli ktoś jest zainteresowany, chciałbym również zasugerować uzyskania Sterowniki Linux i Linux Kernel Development Development Module (oba są dostępne w Internecie za darmo) –