2012-04-02 16 views
7

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ć?

+3

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

+0

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) –

Odpowiedz

5

Tradycyjnie obsługi przerwań w Linuksie odbywa się w dwóch częściach:

  1. Tak zwane „górna połowa” jest rzeczywista pracy w kontekście przerwaniami (IRQ obsługi sama). Ta część musi wyjść tak szybko, jak to możliwe. Więc w zasadzie sprawdza źródło przerwania, a następnie rozpoczyna od dołu do połowy.

  2. "Bottom-pół". Może być zaimplementowana jako kolejka robocza. Jest to miejsce, w którym wykonywana jest właściwa praca. To działa w normalnym związku, więc można go używać funkcji blokowania itp

Jeśli chcesz tylko czekać na IRQ w wątku roboczego, lepiej użyć specjalnego obiektu o nazwie completion. Jest dokładnie stworzony do tego zadania.

Powiązane problemy