2013-07-16 43 views
5

Tôi phát triển một ứng dụng C với atmega168a-pu và ngắt. Tôi sử dụng các ngắt sau:Lập trình AVR, xử lý ngắt

ISR(TIMER0_COMPA_vect); 
ISR(TIMER0_COMPB_vect); 
ISR (TIMER2_COMPA_vect); 
ISR(SPI_STC_vect); 
ISR(TIMER1_COMPA_vect); 
ISR (PCINT1_vect); 

và mã của tôi trông giống như

int main(void){ 
///initialization etc. 
    sei(); 
    while(1){ 
    ///do some stuff and wait the interrupts 
    } 
return 0; 
} 

tôi muốn chặn tất cả các ngắt khác khi một ngắt xảy ra và cho phép các ngắt ngay trước khi thoát khỏi chức năng ngắt.

Bạn có thể giải thích về đoạn mã mà tôi có thể làm được không?

CHỈNH SỬA: http://www.nongnu.org/avr-libc/user-manual/optimization.html#optim_code_reorder nêu rõ rằng việc sử dụng đó gây ra vấn đề về kích hoạt lại.

function(){ 
    cli(); 
    .. 
    sei(); 
} 

Trả lời

2

Câu trả lời trước tôi đăng ở đây dựa trên câu hỏi ban đầu, không đề cập đến vấn đề sắp xếp lại của avr-gcc. Rõ ràng nó là quá lâu rồi, mà tôi làm việc với AVR nhưng có một chuông chuông liên quan đến việc vô hiệu hóa các ngắt

Revised trả lời cho câu hỏi

Bảo vệ ngắt khỏi bị gián đoạn

Atmel viết về xử lý ngắt trong databook:

Khi ngắt xảy ra, I-bit ngắt kết nối toàn cầu bị xóa và tất cả inte rrupts bị vô hiệu hóa. Phần mềm người dùng có thể viết logic một đến I-bit để bật ngắt lồng nhau. Tất cả các ngắt được kích hoạt sau đó có thể làm gián đoạn quá trình ngắt hiện tại. I-bit được đặt tự động khi một lệnh trả về từ lệnh ngắt - RETI - .

Do đó hành vi bạn yêu cầu đã được triển khai trong phần cứng.

vấn đề Sắp xếp lại

Tôi cũng đã làm một số cuộc điều tra về vấn đề sắp xếp lại này. Rõ ràng có sự bất đồng lớn cho dù đây có phải là lỗi của trình biên dịch hay không. Có vẻ như nguy cơ chính của việc sắp xếp lại là các ngắt bị vô hiệu hóa trong một khoảng thời gian dài hơn chúng được mong đợi. Trong quá trình nghiên cứu của tôi, tôi không tìm thấy giải pháp nào ngoại trừ các giải pháp gây ra nhiều hoạt động tải/lưu trữ hơn mà thực sự không phải là một lựa chọn mà tôi nghĩ.

+0

chính xác làm thế nào để bạn vô hiệu hóa và cho phép ngắt toàn cục mà không gây ra bất kỳ sự cố nào? –

+0

Những người downvoters có thể giải thích cho họ downvote không? Johan đã thêm gợi ý vào mô tả lỗi khoảng 8 phút sau khi tôi đăng bài. – junix

+0

@JohanElmander Tôi đã cập nhật câu trả lời cho câu hỏi đã sửa đổi của bạn. – junix

1

Câu hỏi ở đây hơi lạ vì hành vi ngắt mặc định là các ngắt mới bị vô hiệu hóa (như sẽ không kích hoạt) trong khi ngắt đang được bảo trì.

Liên quan đến mã viết không bị gián đoạn Tôi thường thấy đủ để chỉ sử dụng chức năng nguyên tử trong <util/atomic.h>. Nếu điều này là không đủ và bạn thực sự phải đảm bảo không có sắp xếp lại có lẽ bạn có thể viết các phần quan trọng trong hội đồng.

Có thể bạn có thể sử dụng các rào cản bộ nhớ cùng với việc làm mọi thứ trong phần mã đó dễ bay hơi nhưng đó sẽ là một sự bi quan khá lớn trong nhiều trường hợp. Việc lắp ráp được tạo ra bởi điều này có thể gợi ý những gì bạn sẽ viết nếu bạn đã viết lắp ráp bằng tay.