2012-01-05 9 views
11

każdy wie, że przerywnik powinien być krótki, jak to możliwe. i dodawanie funkcji, takich jak printk do debugowania wewnątrz obsługi przerwań, jest czymś, czego nie powinno się robić. Właściwie, próbowałem go wcześniej, kiedy debugowałem jądro Linuxa dla napisanego przeze mnie urządzenia z obsługą przerwania, i to zepsuło czas sterownika.printk wewnątrz obsługi przerwań, czy to naprawdę takie złe?

Mam pytanie, dlaczego tak się dzieje? printk Funkcja jest buforowana! oznacza to, o ile rozumiem, że dane są wstawiane do kolejki i są obsługiwane później, najprawdopodobniej po zakończeniu obsługi przerwań.

Dlaczego więc to nie działa?

+4

Rozważ możliwość, że twoja funkcja drukowania po prostu wypełni bufor, zmuszając go do przepłukania. Co się stanie podczas wykonywania operacji wejścia/wyjścia w obsłudze przerwań? –

+0

TAK, jest naprawdę źle. Dziękuję i dobranoc. –

+0

It * does * work. 'printk' jest przeznaczony do wywołania z kontekstu przerwań lub procesów. Gdyby tak nie było, nie byłoby zbyt wiele do debugowania. Oczywiście nie nazywasz tego w kontekście przerwań w sterowniku produkcyjnym. – EML

Odpowiedz

26

The Funkcja printk nie jest tylko wstawianiem do kolejki/bufora - zakładając, że poziom dziennika jest wystarczająco wysoki, dane wyjściowe z printk zostaną natychmiast wyemitowane do konsoli, w ramach połączenia z printk. Jest to szczególnie powolne, jeśli konsola ma na przykład port szeregowy. W każdym razie, printk wprowadza dość znaczny narzut i może wpływać na czas.

Jeśli masz krytyczne miejsce, w którym chcesz uzyskać dane wyjściowe debugowania, możesz skorzystać z funkcji trace_printk we współczesnych jądrach. To właśnie wprowadza dane wejściowe do bufora dzwonków śledzenia i możesz je później przeczytać. Aby uzyskać szczegółowe informacje, zapoznaj się z this article.

+0

W jaki sposób debugfs jest alternatywą dla trace_printk? Czy to wystarczająco dobre, czy też ma jakieś zastrzeżenia? – user31986

-3

Tak, jest bardzo źle od printf najprawdopodobniej nie jest powtórką. Co może się zdarzyć, że główny program wywołuje printf, przerwanie przybywa natomiast printf jest wykonywany, a następnie procedura obsługi przerwań wzywa printf znowu bardzo złe rzeczy mogą się zdarzyć (np impasu skorumpowanych bufory wewnętrzne itd)

+7

Pytanie dotyczy 'printk', a nie' printf', które nawet nie istnieje w jądrze. I "printk" jądra Linuksa jest reentrant i może być wywołany z kontekstu przerwań itp. Tak więc ta odpowiedź jest całkowicie błędna. – Roland

+0

Uh, błędnie przeczytałem tytuł, a nazwa funkcji ma funky znak końcowy w swoim wpisie:/ – zvrba

+0

Poważnie, co próbujesz dodać do dyskusji? Zastanawiam się, dlaczego ta odpowiedź nie jest oznaczona jako negatywna! – user31986

Powiązane problemy