2012-01-11 16 views
6

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:

  1. thiết bị B ngắt xảy ra, IRQ đi tích cực
  2. IRQ cạnh gây Linux lõi gián đoạn xử lý để chạy
  3. ISR cho điện thoại Một chạy, phát hiện không ngắt cấp phát
  4. thiết bị Một ngắt xảy ra, IRQ vẫn xử lý (dây-OR)
  5. 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ó
  6. lõi gián đoạn xử lý thoát
  7. 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?

Trả lời

2

Về cơ bản, với phần cứng bạn đã mô tả, việc thực hiện một dây hoặc cho các ngắt sẽ KHÔNG BAO GIỜ hoạt động chính xác trên đó.

Nếu bạn muốn thực hiện dây hoặc, bạn thực sự cần sử dụng các đầu vào IRQ nhạy cảm với mức. Nếu điều đó không khả thi, thì có lẽ bạn có thể thêm vào một loại điều khiển ngắt nào đó. Thiết bị đó sẽ lấy N đầu vào nhạy cảm với mức độ, và có một đầu ra, và một số loại 'rõ ràng'. Khi bộ điều khiển ngắt được rõ ràng nó sẽ làm giảm đầu ra của nó, sau đó xác nhận lại đầu ra nếu bất kỳ đầu vào nào của nó vẫn được khẳng định.

Về mặt phần mềm, bạn có thể xem đang chạy dòng IRQ đến đầu vào bộ xử lý khác. Điều này sẽ cho phép bạn ít nhất là kiểm tra trạng thái, nhưng việc xử lý ISR ​​lõi Linux sẽ không biết gì về điều này, và vì vậy bạn sẽ phải vá một thứ gì đó để kiểm tra nó và chuyển qua ISR một lần nữa. Ngoài ra, điều này có nghĩa là trong trường hợp tải nặng ngắt, bạn KHÔNG BAO GIỜ sẽ thoát khỏi ISR ​​này. Do bạn đang thực hiện một dây hoặc trên IRQ, tôi giả định rằng các thiết bị này sẽ không bị gián đoạn quá thường xuyên.

Một điều nữa là xem xét kỹ lưỡng bộ xử lý. Có thể có một số loại lừa bạn có thể kéo với thiết lập ngắt để làm cho nó nhận ra ngắt một lần nữa.

Tôi sẽ không thử bất cứ điều gì quá khó khăn bản thân mình, tôi muốn tách các nguồn vào đầu vào IRQ riêng biệt, thay đổi đầu vào mức nhạy cảm, hoặc thêm một chip điều khiển ngắt.

+1

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