Phần mềm ngắt vs chức năng


10

Sau khoảng 3 năm làm việc với MCU, tôi vẫn không biết việc sử dụng phần mềm bị gián đoạn là gì? Tôi đã thực hiện một số công việc với STM32 và tôi chưa bao giờ sử dụng các phần mềm bị gián đoạn. Quả thực đây là một câu hỏi lớn đối với tôi:

Tại sao khi chúng ta có thể sử dụng một chức năng đơn giản để thực hiện một nhiệm vụ, chúng ta nên sử dụng một phần mềm ngắt? Sự khác biệt giữa ngắt phần mềm và chức năng là gì?

Mỗi khi bạn thích, bạn có thể gọi một chức năng (mà bạn đã viết cho công việc của bạn). Nên có một số lợi ích khi sử dụng ngắt phần mềm thay vì một chức năng đơn giản. Tôi không chắc nhưng tôi nghĩ có một lợi ích cho việc ngắt phần mềm: bạn có thể chỉ định mức độ ưu tiên cho ngắt phần mềm, sau đó bạn có thể ưu tiên cao hơn cho ngắt phần mềm để tránh gián đoạn phần cứng phá vỡ nhiệm vụ của bạn.


1
Tôi nghĩ mục đích chính của việc sử dụng ngắt là bạn có thể tiếp tục thực hiện các nhiệm vụ quan trọng khác trong khi chờ đợi điều gì đó khác xảy ra và khi thời gian không phải lúc nào cũng ổn định. Ngoài ra tôi nghĩ rằng nó là một chút nhanh hơn so với bỏ phiếu trong hầu hết các trường hợp.
MrPhooky

1
@MrPhooky Đó là phần cứng làm gián đoạn bạn đang nói về. OP đang nói về sự gián đoạn phần mềm.
Brhans

Câu trả lời:


19

Sự khác biệt chính giữa một chức năng và một phần mềm bị gián đoạn là cái được gọi là bối cảnh .

  • Một chức năng chạy trong bối cảnh của chương trình chính của bạn.
  • Một ngắt chạy trong bối cảnh của trình xử lý ngắt.

Trên một hệ thống đơn giản, điều này có thể không có sự khác biệt thực sự và các ngắt phần mềm có thể được sử dụng đơn giản như một cách thuận tiện để cung cấp các thói quen thư viện được mã hóa cứng trong ROM - bạn không cần biết địa chỉ của mọi thói quen, chỉ có mã ID và điểm vào chính. Điều này làm cho mã của bạn di động hơn.

Tuy nhiên, trên các hệ thống phức tạp hơn, ngắt phần mềm có thể chạy trong một môi trường hoàn toàn khác, được gọi là bối cảnh hạt nhân . Thông thường, ứng dụng của bạn sẽ chạy trong ngữ cảnh người dùng được bảo vệ có quyền truy cập hạn chế vào tài nguyên. Chỉ khi chạy trong ngữ cảnh kernel, bạn mới có thể thực hiện các tác vụ phức tạp hơn - thực sự một số hệ thống thậm chí giới hạn các lệnh nào có thể được thực thi, vì vậy bạn cần một cơ chế để kích hoạt mã trong ngữ cảnh kernel - và sử dụng ngắt đó.


1
Ngoài ra, các ngắt có thể tùy ý dừng tiến trình của chương trình để hệ thống có thể làm việc khác (ví dụ: ngắt phần cứng). Các chương trình của bạn không cần tính đến điều này, bởi vì, theo quan điểm của chương trình của bạn, trạng thái của chức năng không thay đổi so với khi xảy ra gián đoạn. Trên các hệ thống cũ, đây là cách các chương trình TSR (Chấm dứt / Thường trú) mô phỏng đa nhiệm, bằng cách ngắt ngắt bộ đếm thời gian / đồng hồ. Ngay cả khi không có các cấp IOPL, vẫn có một lợi ích để giữ cho đồng hồ hệ thống được cập nhật.
phyrfox

4
Cũng có thể lưu ý rằng các "ngắt phần mềm" đó cũng được gọi là "các ngắt đồng bộ", bởi vì mã ứng dụng biết chính xác khi nào và tại sao một ngắt đó xảy ra, trái với "các ngắt không đồng bộ" có thể, theo quan điểm của ứng dụng, về cơ bản xảy ra bất cứ lúc nào một cách không mong muốn.
JimmyB

@HannoBinder: Tôi nghĩ rằng OP đang nói về việc gửi các yêu cầu ngắt tới bộ điều khiển ngắt vector Cortex-M3; nếu mã cho một ngắt ưu tiên cao gửi một ưu tiên thấp hơn, yêu cầu sẽ được hoãn lại cho đến một thời gian sau khi tất cả các ngắt ưu tiên cao hơn đã kết thúc.
supercat

12

Ngắt phần mềm có thể được sử dụng để hoàn thành một nhiệm vụ ngắt ở mức ưu tiên thấp hơn. Mã thời gian quan trọng thường được ưu tiên ngắt cao để tránh độ trễ quá lớn. Khi phần quan trọng về thời gian kết thúc, có thể có các tác vụ bổ sung có thể quá quan trọng về thời gian cho vòng lặp chính, nhưng không quá quan trọng để giữ các ngắt ưu tiên cao khác. Kích hoạt một ngắt phần mềm ưu tiên thấp hơn có thể thực hiện điều này.

Ví dụ: giả sử bạn có nhiều động cơ bước với mỗi bộ đếm thời gian riêng. Các ngắt hẹn giờ được ưu tiên cao để giảm thiểu jitter bước. Nhiệm vụ quan trọng nhất về thời gian có thể đơn giản như cài đặt hoặc xóa xung bước hoặc tăng các đầu ra pha. Có thể có các chức năng bổ sung cần thiết như tính toán các đường dốc tăng tốc, xử lý cảm biến, v.v. Vì việc này cần được xử lý từng bước, nên có thể không thích hợp để xử lý việc này từ main () vì thời gian của vòng lặp chính có thể quá dài. Các tác vụ bổ sung này có thể được xử lý bằng ngắt phần mềm ưu tiên thấp hơn để không làm tăng độ trễ của các kênh bước ưu tiên cao khác.

Sự khác biệt giữa ngắt phần mềm và chức năng là gì?

Một hàm được gọi ngay lập tức từ bất cứ nơi nào nó được gọi và không thay đổi mức ưu tiên ngắt hiện tại nếu được gọi từ ngắt. Một ngắt phần mềm là một trình kích hoạt ngắt sẽ khiến ngắt đó được gọi khi ưu tiên của nó xuất hiện. Nếu một lệnh gọi hàm được chèn vào cuối ngắt ưu tiên cao, hàm sẽ được chứa trong mức ưu tiên cao đó. Bằng cách kích hoạt ngắt phần mềm ưu tiên thấp hơn và sau đó quay trở lại từ ngắt ưu tiên cao, chức năng sẽ được gọi ở mức ưu tiên mới (thấp hơn).


2
Một mô hình phổ biến khác có thể là có một ngắt 100KHz để xử lý các công cụ quan trọng về thời gian và cũng cần đánh dấu thời gian 1kHz, nhưng không có sẵn hai bộ định thời riêng biệt. Sẽ không mất nhiều thời gian cho một thói quen ngắt 100kHz để nói rằng if ((timer_count--) & 0x80000000) SET_TICK_INTERRUPT_FLAG(); else timer_count = temp-1; các ngắt khác sau đó có thể thực hiện công việc của nó và với các ngắt bị vô hiệu hóa nhanh chóng thêm 100 vào timer_count; ngay cả khi thói quen 1kHz mất hơn 10us để thực thi, nó sẽ không can thiệp vào tần số 100kHz.
supercat

Theo cách tương tự, tôi đã sử dụng các ngắt phần mềm trong các hệ thống đơn giản (không có RTOS đầy đủ) làm bộ lập lịch giả, trong đó các yêu cầu phần cứng được xử lý bởi ISR, nhưng các hàm gọi lại và các tác vụ dài khác được thực hiện để thay đổi Trạng thái phần cứng được ủy quyền cho phần mềm bị gián đoạn.
Evil Dog Pie

Về cơ bản, bạn đã mô tả một biến thể của "nửa dưới". Bạn có bất cứ tài liệu tham khảo nào cho việc này cũng được gọi là "gián đoạn phần mềm" không? Đó là một ý nghĩa hoàn toàn khác với câu trả lời của Majenko và câu hỏi được gắn thẻ ARM - kiến ​​trúc thực sự có hướng dẫn SWI (ngắt phần mềm).
domen

3
@domen Tôi không chắc bạn cần loại tài liệu tham khảo nào. Nó được gọi là "ngắt phần mềm" bởi vì đó là những gì được sử dụng để đạt được nó. Trong ngữ cảnh của ARM, OP đặc biệt tham chiếu STM32 và cung cấp một liên kết đến hướng dẫn tham khảo RM0008. Đây không phải là hướng dẫn tham khảo lõi ARM. "Ngắt phần mềm" duy nhất được đề cập trong RM0008 là EXTI_SWIER (thanh ghi sự kiện ngắt phần mềm) có thể được sử dụng để tạo ra các ngắt phần mềm cho dù các chân phần cứng thực tế có được sử dụng cho các ngắt hay không. Cá nhân tôi chưa sử dụng hướng dẫn SWI (SWC).
Tut

Cảm ơn! Có thể tốt khi đưa một số thông tin này vào câu trả lời, để làm rõ "phần mềm bị gián đoạn" là gì.
domen

7

Để mở rộng một chút về câu trả lời của Majenko, các ngắt phần mềm được sử dụng để triển khai các hệ điều hành, đặc biệt là giao diện gọi hệ thống. Điều này có nghĩa là các ứng dụng không cần phải được liên kết với hệ điều hành để thực hiện các cuộc gọi chức năng và chuyển đổi ngữ cảnh cho phép HĐH giới hạn quyền truy cập vào phần cứng và tận dụng những thứ như bộ nhớ được bảo vệ.

Nếu bạn không sử dụng HĐH và bạn kiểm soát tất cả mã trên MCU, có lẽ bạn không cần sử dụng các ngắt phần mềm. (Mặc dù như Tut đã đề cập, chúng có thể có những cách sử dụng khác.)

Các giao diện gọi hệ thống LinuxMS-DOS trên x86 sử dụng các ngắt phần mềm, vì vậy tôi sẽ liên kết với các giao diện đó làm ví dụ.


1
Và trong nhiều trường hợp os sử dụng các ngắt mềm, chúng được bọc trong các chức năng để làm cho cuộc sống đơn giản hơn.
hildred

1
Tôi vẫn lập trình mọi thứ (hoàn toàn mới) cho DOS và tôi rất quen thuộc với các trình xử lý int 21. Hầu hết mọi thứ tôi cần I / O khôn ngoan đều được xử lý với DOS ISR.
R Drast

Xin lưu ý rằng trang được trích dẫn cho Linux là từ năm 1993-1996.
một CVn

Tôi đã thay thế liên kết bằng một liên kết cập nhật hơn.
Adam Haun
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.