2012-04-02 36 views
7

Tôi đang triển khai trình điều khiển bus nối tiếp tùy chỉnh cho một bo mạch Linux dựa trên ARM (một trình điều khiển UART tùy chỉnh). Trình điều khiển này sẽ cho phép giao tiếp với một MCU nhất định ở đầu kia của xe buýt thông qua một giao thức tùy chỉnh. Trình điều khiển sẽ không (và thực sự là không được) phơi bày bất kỳ chức năng nào của nó với không gian người dùng, cũng không thể thực hiện nó trong không gian người dùng (do đó, cần cho trình điều khiển tùy chỉnh thay vì sử dụng hệ thống con TTY).Thực hiện đồng bộ hóa mô-đun chính xác trong hạt nhân Linux

Trình điều khiển sẽ thực hiện giao thức truyền thông và đọc/ghi UART và nó phải xuất một tập hợp các chức năng cấp cao hơn cho người dùng để cho phép họ liên lạc với MCU (ví dụ: read_register(), drive_gpios(), tất cả nội dung này) . Sẽ chỉ có một người dùng của mô-đun này.

Mô-đun gọi điện sẽ phải đợi để hoàn thành các thao tác (đã nêu ở trên read_register() và các thiết bị khác). Tôi hiện đang xem xét sử dụng semaphores: module người dùng sẽ gọi chức năng của trình điều khiển của tôi, sẽ bắt đầu chuyển giao và chờ đợi trên một semaphore; trình xử lý IRQ của trình điều khiển của tôi sẽ gửi yêu cầu tới MCU và đọc câu trả lời, và khi hoàn thành, đăng lên semaphore, do đó sẽ thức dậy mô-đun gọi điện. Nhưng tôi không thực sự quen thuộc với lập trình hạt nhân, và tôi bị bối rối bởi vô số các triển khai có thể thay thế (các tasklet? Chờ đợi hàng đợi?).

Câu hỏi đặt ra là: phương pháp tiếp cận dựa trên semaphore của tôi OK, hoặc quá ngây thơ? Các lựa chọn thay thế có thể là gì? Có bất kỳ cạm bẫy nào tôi có thể bị mất không?

+3

Semaphores nên làm công việc từ những gì tôi hiểu, để enderstand tốt hơn linux internals xin vui lòng tham khảo cuốn sách tốt đẹp "linex hạt nhân phát triển 3rd edition" có sẵn như pdf miễn phí và được cập nhật (.39 hạt nhân tôi tin). Cuốn sách đó không thực sự sâu sắc, nhưng nó giải thích các nguyên tắc cơ bản và các tùy chọn hiển thị. Hacking vui vẻ. – AoeAoe

+0

Một cuốn sách hay, cảm ơn bạn! Nếu bất kỳ ai quan tâm, tôi cũng đề xuất bạn nên có được Phát triển trình điều khiển Linux và Phát triển mô-đun hạt nhân Linux (cả hai đều có sẵn trực tuyến miễn phí) –

Trả lời

5

Theo truyền thống IRQ xử lý trong Linux được thực hiện trong hai phần:

  1. Vì vậy, gọi là "thượng nửa" là làm việc thực tế trong bối cảnh IRQ (IRQ xử lý riêng của mình). Phần này phải thoát càng nhanh càng tốt. Vì vậy, về cơ bản nó kiểm tra nguồn ngắt và sau đó bắt đầu từ nửa dưới.

  2. "Nửa dưới". Nó có thể được thực hiện như hàng đợi công việc. Đó là nơi công việc thực tế được thực hiện. Nó chạy trong bối cảnh bình thường, vì vậy nó có thể sử dụng chức năng chặn vv

Nếu bạn chỉ muốn chờ đợi cho IRQ trong sợi nhân của bạn, tốt hơn để sử dụng đối tượng đặc biệt gọi là completion. Nó được tạo chính xác cho nhiệm vụ này.

Các vấn đề liên quan