Tôi đang xem xét một tình huống sắp tới trong một dự án Linux nhúng (chưa có phần cứng) nơi hai chip bên ngoài sẽ cần chia sẻ một dòng IRQ vật lý duy nhất. Dòng này có khả năng trong phần cứng của kích hoạt cạnh nhưng không bị gián đoạn kích hoạt cấp.Làm cách nào để tránh các cuộc đua IRQ được chia sẻ trong Linux
Nhìn vào hỗ trợ irq chia sẻ trong Linux, tôi hiểu rằng cách này sẽ hoạt động với hai trình điều khiển riêng biệt là mỗi trình xử lý ngắt được gọi, kiểm tra phần cứng và xử lý nếu thích hợp.
Tuy nhiên tôi tưởng tượng điều kiện chủng tộc sau đây và muốn biết nếu tôi đang thiếu một cái gì đó hoặc những gì có thể được thực hiện để làm việc xung quanh điều này. Hãy nói rằng có hai nguồn ngắt bên ngoài, các thiết bị A và B:
- thiết bị B ngắt xảy ra, IRQ đi tích cực
- IRQ cạnh gây Linux lõi gián đoạn xử lý để chạy
- ISR cho điện thoại Một chạy, phát hiện không ngắt cấp phát
- thiết bị Một ngắt xảy ra, IRQ vẫn xử lý (dây-OR)
- ISR cho thiết bị B chạy, thấy gián đoạn chờ giải quyết, tích cực và xóa nó
- lõi gián đoạn xử lý thoát
- IRQ vẫn đang hoạt động, không còn phải cạnh được tạo ra, IRQ được nhốt
Dường như cho này để được cố định, gián đoạn xử lý lõi sẽ phải kiểm tra mức IRQ sau khi chạy tất cả các bộ xử lý, và nếu vẫn hoạt động, chạy lại tất cả. Linux sẽ làm điều này? Tôi không nghĩ rằng các lõi gián đoạn biết làm thế nào để kiểm tra mức độ của một dòng IRQ.
Đây có phải là điều gì đó thực sự có thể xảy ra không, và nếu có thì làm cách nào để giải quyết vấn đề này?
Cảm ơn lời khuyên. Tôi nghĩ rằng chúng ta sẽ đi với thực hiện một bộ điều khiển ngắt trong một FPGA mà chúng ta cần phải có trên diễn đàn anyway. – blueshift