Cho phép ngắt nhưng không có ISR


10

Tôi muốn biết điều gì sẽ xảy ra nếu Ngắt được bật (ví dụ: Ngắt mất trọng tài trong mô-đun CAN của LPC1778 của NXP), nhưng không có ISR nào được xác định cho ngắt.

Khi xảy ra ngắt như vậy, tôi biết rằng cờ ngắt tương ứng sẽ được đặt, nhưng vì tôi chưa xác định bất kỳ ISR nào, nên sẽ không có bất kỳ địa chỉ bù vector nào được lưu trữ để truyền điều khiển cho một ngắt như vậy và do đó điều khiển sẽ quay trở lại theo thói quen chính và tôi có thể đặt lại cờ ngắt bằng cách bỏ phiếu trong thói quen chính (đây là suy nghĩ của tôi). Sẽ có bất kỳ độ trễ nào khi CPU phát hiện ra rằng không có ISR để nhảy tới?

Bất kỳ giải pháp về những gì có thể xảy ra thực sự có thể giúp tôi.

Cảm ơn.

Cập nhật:

Tôi đã bật CAN Interrupt trên uC của mình nhưng không xác định ISR. Khi tôi thực hiện kiểm tra loopback nội bộ, mã được nhập vào một vòng lặp vô hạn. Dưới đây là mã tháo gỡ của vòng lặp vô hạn đang được thực thi trên LPC1778:

B       .
ENDP

Vì vậy, nếu bạn đang sử dụng ngắt, hãy sử dụng ISR.


3
Bạn không cần phải kích hoạt ngắt để có thể thăm dò các cờ trong chức năng chính của mình. Nếu điều kiện đặt cờ xảy ra, cờ đó sẽ được đặt cho dù bạn có bật ngắt liên quan hay không.
Brhans 28/03/2016

Bạn có nói rằng cờ ngắt Trọng tài xe buýt bị mất sẽ được thiết lập ngay cả khi tôi không bật "ngắt trên Trọng tài xe buýt bị mất" (mặc dù không có thanh ghi trạng thái nào có thể chỉ ra Trọng tài xe buýt bị mất ngoại trừ thanh ghi trạng thái ngắt)?
AlphaGoku 28/03/2016

Đúng. Trong mọi MCU tôi đã làm việc cùng, các cờ ngắt được đặt bất cứ khi nào điều kiện nên đặt chúng xảy ra. Việc kích hoạt ngắt làm cho MCU chuyển sang vectơ cho trình xử lý khi cờ liên kết được đặt và vô hiệu hóa ngắt làm cho nó bỏ qua cờ và không vectơ cho trình xử lý mặc dù cờ được đặt . Dis / en-abling ngắt chỉ ảnh hưởng đến hành vi xử lý chuyển sang ngắt, chứ không ảnh hưởng đến hành vi cài đặt cờ.
Brhans 28/03/2016

Wow. Đó là điều mà tôi không biết. Cảm ơn rất nhiều. Vì vậy, mọi trình điều khiển cũng phải định kỳ kiểm tra các thanh ghi trạng thái ngắt và đặt lại chúng ngay cả khi các ngắt không được kích hoạt :)
AlphaGoku 28/03/2016

@AkshayImmanuelD chỉ khi nó quan trọng. Nếu ngắt luôn bị vô hiệu hóa và không có gì khác quan tâm đến cờ, thì việc nó được đặt hay xóa là không quan trọng.
hobbs 28/03/2016

Câu trả lời:


17

Nếu không có ISR được xác định, vị trí của lệnh nhảy trong vectơ ngắt sẽ là null, nó có thể là một bước nhảy đến một thói quen ngoại lệ, nó có thể nhảy đến đầu chương trình hoặc nó có thể chứa "trở về từ ngắt "(ví dụ RTI).

Dưới đây là sự phân tách một bảng ngắt cho bộ xử lý ATMega 16 cho thấy ba ngắt không được sử dụng được vectơ thành một thói quen xử lý các trường hợp như vậy (nó có thể đi vào một vòng lặp vô hạn) và một vectơ hợp pháp.

  28:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  2c:   0c 94 5c 00     jmp 0xb8    ; 0xb8 <__vector_11>   // <-- ISR
  30:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>
  34:   0c 94 47 00     jmp 0x8e    ; 0x8e <__bad_interrupt>

Phương thức nào được mô tả trước đây khi xử lý ISR ​​bị thiếu sẽ phụ thuộc cả vào kiến ​​trúc của vi điều khiển và trình biên dịch. Trong trường hợp RTI hoặc hướng dẫn tương đương, nó sẽ ngay lập tức trở lại ứng dụng. Tuy nhiên, nếu ngắt được kích hoạt theo cấp độ chứ không phải kích hoạt cạnh, thì điều này có thể sẽ khiến ngắt được kích hoạt lại, do đó bạn kết thúc trong một vòng lặp vô hạn.

Tôi nghĩ rằng nó có thể phụ thuộc vào kiến ​​trúc của chip cho dù các ngắt bên trong (ví dụ: một ký tự được nhận bởi UART) được coi là kích hoạt cấp độ hoặc kích hoạt cạnh. Các ngắt ngoài thường có thể được cấu hình là một hoặc khác.

Ngoài ra còn có một trường hợp khác, đôi khi một số ngắt được nhóm lại với nhau và sử dụng cùng một vectơ. Điều này đặc biệt đúng đối với các bộ xử lý cũ có thể chỉ có một vài gián đoạn. Trong trường hợp đó, nguyên nhân ngắt được xác định bằng cách bỏ phiếu trạng thái của các thanh ghi ngắt, giống như những gì bạn đề xuất.

Nhưng đó là thực tế xấu trong mọi trường hợp có các ngắt trong một hệ thống và không có ISR được xác định. Đừng làm điều đó.


2
...., hoặc nó có thể không được xác định.
Wouter van Ooijen

@WoutervanOoijen đó là những gì tôi muốn nói bởi vectơ ngắt là null.
tcrosley 28/03/2016

1
Các thanh ghi trạng thái không thể chỉ ra một vài lỗi như lỗi tôi đã đề cập ở trên. Nhưng những lỗi như vậy làm gián đoạn. Do đó tôi nghĩ đến việc cho phép ngắt chỉ để xác định lỗi và không sử dụng bất kỳ ISR nào. Trong khi mô phỏng LPC1778 bằng Keil, tôi không nhận được bất kỳ ngoại lệ nào nên tôi đoán
uC

1
Một điều cần chú ý - nếu bạn kích hoạt ngắt, nhưng trình xử lý của bạn không xóa cờ (hoặc không có trình xử lý và hành vi mặc định là trả về đơn giản) thì rất có thể bạn sẽ thấy rằng MCU của bạn sẽ kết thúc mãi mãi bị mắc kẹt trong một vòng lặp ngắt.
Brhans 28/03/2016

1
Các ngắt PIO trên ATSAM3X8E có thể được kích hoạt cạnh, nhưng điều kiện ngắt một khi được đặt sẽ không bị xóa cho đến khi bạn đọc ISR (thanh ghi trạng thái ngắt) trong trình xử lý ngắt - dẫn đến vòng lặp @brhans được đề cập.
Simon Wright

1

Nó phụ thuộc vào MCU, trình biên dịch và phần còn lại của mã.

Từ kinh nghiệm của tôi:

  1. AVR - theo mặc định nếu bạn không chỉ định ISR, thì vectơ ngắt trong flash sẽ là 0x0000, điều đó có nghĩa là ứng dụng của bạn sẽ nhảy vào thiết lập lại bất cứ khi nào sự gián đoạn này xảy ra.

    Nếu bạn thực sự cần ngắt, nhưng không cần trình xử lý (ví dụ: sử dụng chế độ giảm tiếng ồn thấp ADC và chỉ sử dụng ngắt để đánh thức MCU), bạn nên sử dụng macro EMPTY_INTERRUPT

  2. NXP Kinetis (ARM) - tất cả các vectơ theo mặc định trỏ đến một trình xử lý mặc định có điểm dừng, CPU sẽ chỉ dừng lại và báo cho trình gỡ lỗi của bạn.

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.