Có thực sự cần thiết để xóa thủ công cờ ngắt tràn bộ đếm thời gian XMEGA không?


8

Như một số bạn có thể biết, Atmel cung cấp một khung phần mềm (chủ yếu là một phần của Atmel Studio) cung cấp trình điều khiển và ví dụ và được cập nhật thường xuyên hơn hoặc ít hơn.

Trong một bản cập nhật gần đây, họ chỉ ra một cách rõ ràng rằng điều quan trọng là phải xóa thủ công cờ ngắt trong chức năng gọi lại ngắt.

 // * \subsection xmega_tc_qs_ovf_setup_code Example code
 // *
 // * Add a callback function that will be executed when the overflow interrupt
 // * trigger.
 // * \code
 static void my_callback(void)
 {
    // User code to execute when the overflow occurs here

    // THIS WAS ADDED IN LAST UPDATE
    // Important to clear Interrupt Flag
    tc_clear_overflow(&TCC0);
    // THIS WAS ADDED IN LAST UPDATE

 }
 //\endcode

Theo bảng dữ liệu XMEGAA:

OVFIF sẽ tự động bị xóa khi vectơ ngắt tương ứng được thực thi. Cờ cũng có thể được xóa bằng cách viết một đến vị trí bit của nó.

Có một kịch bản / lý do mà việc xóa cờ thủ công có thể được yêu cầu không?


Nghe có vẻ như câu trả lời là nếu bạn không ngắt thì bạn cần xóa thủ công. về cơ bản nếu / khi bỏ phiếu thay vì sử dụng ngắt. bạn có thể chỉ cần đọc thanh ghi trong ngắt và bằng cách nào đó hiển thị nó để xem nếu nó thực sự được thiết lập. tương tự, hãy thử bỏ phiếu mà không kích hoạt ngắt và xem nếu nó được đặt và nếu bạn có thể xóa nó. xác nhận tài liệu là hoặc không chính xác.
old_timer

1
Đó sẽ không phải là trường hợp đầu tiên tôi thấy trong các sản phẩm của Atmel, nơi một ngắt "tự động bị xóa" dường như không thực sự bị xóa khi trình xử lý kích hoạt.
Sói Connor

1
@ConnorWolf: Thật sao? Bạn có nhớ bộ điều khiển và ngắt? Chúng tôi làm việc rất im lặng với các bộ điều khiển Atmel và đây có thể là một cạm bẫy tiềm năng.
Rev1.0

3
@ Rev1.0 - Một ví dụ tôi đang làm việc với ngay bây giờ: SAM4SD32C- Bộ ngắt thời gian ( TC0_Handler, v.v ...) không bị xóa khi nhập ISR trừ khi tôi đọc rõ ràng TC0->TC_SR. Đào sâu hơn, trong trường hợp này, đó là do ngắt được kích hoạt từ RCbit khớp thanh ghi so sánh và điều đó không bị xóa cho đến khi bạn đọc rõ ràng TC_SR. IOW, tôi không chính xác về nguyên nhân thực tế (nó không phải là chút ISR trực tiếp), nhưng kết quả cuối cùng là như nhau: Bạn phải tự xóa các ISR nguyên nhân , nếu không phải là ISR cờ .
Sói Connor

1
Có lẽ có một lỗi?
Abbeyatcu

Câu trả lời:


1

Có một kịch bản / lý do mà việc xóa cờ thủ công có thể được yêu cầu không?

Không chắc chắn về ASF, nhưng có những trường hợp bạn cần hủy bất kỳ ngắt đang chờ xử lý. Chẳng hạn, khi (tái) cấu hình bộ hẹn giờ, bạn có thể muốn tắt ngắt, sửa đổi bộ hẹn giờ và hủy mọi ngắt thời gian có thể xảy ra trong thời gian trung bình, trước khi bật lại ngắt.

Nếu bạn thậm chí không có ISR tràn, bạn vẫn có thể thăm dò OVIF để phát hiện tràn và đặt lại cờ để xử lý nó cho lần tràn tiếp theo.


1

Nói chung, tôi luôn xóa các cờ ngắt ngay trước khi bật một ngắt nhất định, trong trường hợp có thứ gì đó đặt cờ trong quá khứ. Có vẻ như bảo hiểm giá rẻ.

Tôi không biết về bất kỳ kịch bản nào mà bạn cần xóa cờ theo cách thủ công trừ khi bạn không sử dụng ngắt và bạn đang xem cờ với thói quen thực hiện định kỳ để kiểm tra cờ được đặt.

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.