2012-01-05 15 views
11

mọi người đều biết rằng trình xử lý ngắt phải ngắn nhất có thể. và thêm các chức năng như printk để gỡ lỗi bên trong trình xử lý ngắt là điều không nên thực hiện. Trên thực tế, tôi đã thử nó trước khi tôi gỡ lỗi hạt nhân Linux cho một thiết bị gián đoạn điều khiển char tôi viết, và nó phá hỏng thời gian của người lái xe.printk bên trong một handler ngắt, là nó thực sự là xấu?

Câu hỏi tôi có, là lý do tại sao điều này xảy ra? Chức năng printk được lưu vào bộ đệm! nó có nghĩa là, theo như tôi hiểu rằng dữ liệu được chèn vào trong một hàng đợi, và nó đang được xử lý sau, có lẽ nhất là sau khi trình xử lý ngắt được kết thúc.

Vậy tại sao nó không hoạt động?

+4

Xem xét khả năng cuộc gọi in của bạn vừa lấp đầy bộ đệm, buộc nó phải tuôn ra. Điều gì sẽ xảy ra khi thực hiện I/O trong trình xử lý ngắt của bạn? –

+0

CÓ, nó thực sự là xấu. Cảm ơn và chúc ngủ ngon. –

+0

Nó * hoạt động *. 'printk' được thiết kế để gọi từ ngữ cảnh ngắt hoặc quá trình. Nếu không, nó sẽ không được sử dụng nhiều để gỡ lỗi. Bạn rõ ràng là không gọi nó trong bối cảnh gián đoạn trong một trình điều khiển sản xuất, mặc dù. – EML

Trả lời

26

Chức năng printk không chỉ chèn vào hàng đợi/bộ đệm - giả sử mức nhật ký đủ cao, đầu ra từ printk sẽ được phát ra ngay giao diện điều khiển, như một phần của cuộc gọi đến printk. Điều này đặc biệt chậm nếu bàn điều khiển, ví dụ, trên một cổng nối tiếp. Nhưng trong mọi trường hợp, printk không giới thiệu chi phí khá đáng kể và có thể ảnh hưởng đến thời gian.

Nếu bạn có một thời điểm quan trọng nơi bạn muốn nhận được một số đầu ra gỡ lỗi, bạn có thể xem bằng cách sử dụng chức năng trace_printk trong hạt nhân hiện đại. Điều này thực sự không chỉ đưa đầu vào vào dấu vết vòng, và bạn có thể đọc nó sau này. Hãy xem this article để biết chi tiết đầy đủ.

+0

Các trình gỡ rối như một giải pháp thay thế cho trace_printk như thế nào? Là nó đủ tốt hay nó có bất kỳ caveats quá? – user31986

-3

Có, rất xấu vì printf có thể không phải là reentrant. Điều gì có thể xảy ra là chương trình chính gọi printf, một ngắt đến trong khi printf đang thực hiện, và sau đó xử lý IRQ gọi printf một lần nữa: những điều rất xấu có thể xảy ra (ví dụ: bế tắc, bộ đệm nội bộ hỏng, v.v.)

+7

Câu hỏi là về 'printk', không phải' printf' mà thậm chí không tồn tại trong hạt nhân. Và 'printk' của hạt nhân Linux là reentrant và có thể được gọi từ bối cảnh ngắt vv Vì vậy, câu trả lời này hoàn toàn sai lầm. – Roland

+0

Uh, tôi đã đọc sai tiêu đề và tên chức năng có ký tự dấu phẩy trong bài đăng của anh ấy:/ – zvrba

+0

Nghiêm túc những gì bạn đang cố thêm vào cuộc thảo luận? Tôi tự hỏi tại sao câu trả lời đó không được đánh dấu tiêu cực! – user31986