Hướng dẫn về SEI của AVR


13

Hướng dẫn AVR SEI ( http://www.atmel.com/webdoc/avrassembler/avrassembler.wb_SEI.html ) đợi lệnh tiếp theo kết thúc trước khi bật ngắt.

Nếu tôi sử dụng một lệnh khác để đặt cờ I trong SREG, điều này cũng sẽ đợi 1 hướng dẫn chứ?

Nói cách khác: Chờ đợi là một tính năng của lệnh SEI hoặc thanh ghi trạng thái?

Nếu đó là một tính năng của lệnh SEI, thì tại thời điểm nào cờ thực sự được đặt, trong chu kỳ thực thi SEI hoặc với lệnh tiếp theo?


Đây là một câu hỏi hay, nhưng không quá khó để kiểm tra và chắc chắn.
Vorac

1
@Vorac Bạn có thể cho tôi một ví dụ về cách kiểm tra cái này không? Đó sẽ là câu trả lời được chấp nhận của tôi cho chắc chắn.
jayjay

1
Nó có thể là một tính năng của việc triển khai kiến ​​trúc AVR và nơi có thể xử lý các ngắt. IIRC, kiến ​​trúc AVR đã sử dụng đường ống 3 giai đoạn. Vì vậy, hướng dẫn tiếp theo có thể đã là 'trong chuyến bay' (nghĩa là trong giai đoạn đường ống một hoặc xa hơn) trước khi thay đổi cờ I có thể được sử dụng để kiểm tra các ngắt. Tôi đã không tìm kiếm trong một thời gian dài, nhưng tôi không nghĩ rằng các nhà thiết kế kiến ​​trúc AVR sẽ bị hạn chế quá mức. Vì vậy, việc kiểm tra ngắt cho một lệnh trong giai đoạn 1 của đường ống, chứ không phải trước lệnh tiếp theo (trong giai đoạn 2) mang lại cho họ sự linh hoạt.
xe cứu thương

Câu trả lời:


8

Kết quả thực nghiệm!

Trong khi các câu trả lời khác là chu đáo và lý luận tốt, tất cả chúng đều không đầy đủ hoặc chỉ là phỏng đoán. Trường hợp tài liệu không rõ ràng, chúng tôi phải thử nghiệm và chúng tôi phải kiểm tra mọi trường hợp.

Câu hỏi này xứng đáng có câu trả lời kết luận, vì vậy, hãy rút ra một AVR và bắt đầu thiết lập một số bit!

Thủ tục

Để kiểm tra, tôi đã tạo ra một chương trình Arduino (ATMEGA328P) nhỏ có thể ...

  1. thiết lập ISR sẽ không bao giờ quay lại ( while (1))
  2. đã gán ISR cho một nguồn mà tôi có thể kích hoạt trong phần mềm ( INT0sắp hết)
  3. ngắt vô hiệu hóa
  4. kích hoạt và kích hoạt ngắt để nó sẽ chờ xử lý

Tôi đã sử dụng một giường thử nghiệm sẽ bật đèn LED trong một hướng dẫn sau khi ngắt được bật. Bằng cách thử các cách khác nhau để kích hoạt các ngắt trên giường thử nghiệm và kiểm tra đèn LED, tôi có thể biết liệu lệnh sau khi lệnh kích hoạt có được thực thi hay không.

Nếu đèn LED không sáng, thì tôi biết rằng ISR đã thực thi (và bị khóa) ngay lập tức sau khi ngắt được bật.

Nếu đèn LED bật sáng, thì tôi biết rằng lệnh tiếp theo được phép thực thi trước khi ISR ​​được gọi.

Các kết quả

SEI hướng dẫn (trường hợp cơ sở)

Mã số:

sei

Kết quả: LED bật. Thực hiện theo hướng dẫn.

OUT chỉ dẫn

Mã số:

in  r16,0x3f   // Get SREG
ori r16,128    // Set I bit 
out 0x3f,r16   // Save back to SREG

Kết quả:

Đèn LED bật. Thực hiện theo hướng dẫn.

ST chỉ dẫn

Mã số:

   clr r29        // Clear Y high byte
   ldi r28,0x5f   // Set Y low byte to point to SREG
   ld r16, Y      // Get SREG
   ori r16,128    // Set I bit 
   st Y,r16       // Put SREG

Kết quả:

Đèn LED bật. Thực hiện theo hướng dẫn.

Phần kết luận!

Q: Chờ đợi là một tính năng của hướng dẫn SEI hoặc thanh ghi trạng thái?

Trả lời: Có vẻ như việc thay đổi Ibit trong SREGlà từ a 0sang a 1sẽ cho phép lệnh sau thực hiện tiếp theo ngay cả khi có một ngắt đang chờ xử lý, bất kể lệnh nào được sử dụng để đặt bit.

Ghi chú

Điều này thực sự biến thành một câu hỏi rất thú vị với nhiều biến chứng. Nếu bạn quan tâm đến anh ấy chi tiết, hãy xem ...

http://wp.josh.com/2016/01/05/different-ways-to-set-i-bit-in-avr-sreg-besides-sei/


2
Khi đặc tả không rõ ràng, có một vấn đề với "kết quả thực nghiệm". Đơn giản là vì phần cứng cụ thể mà bạn đã thử nghiệm hoạt động theo một cách cụ thể, không có nghĩa là các phần khác sẽ hoạt động theo cách đó. Atmel có quyền tự do thay đổi việc triển khai với điều kiện nó không thay đổi đặc điểm kỹ thuật. Vì vậy, "Trường hợp tài liệu không rõ ràng, ..." thì vẫn chính xác là như vậy, sau khi thử nghiệm và thử nghiệm, nó vẫn còn mơ hồ.
xe cứu thương

@gbulmer Mình đồng ý 100%. Người sử dụng các tính năng không có giấy tờ trong sản xuất chắc chắn sẽ buồn. Vẫn là một câu hỏi thực nghiệm thú vị (và câu trả lời), và có lẽ ok để phụ thuộc vào một dự án cá nhân một lần.
bigjosh

Vâng, bạn đã làm một cuộc điều tra hấp dẫn.
xe cứu thương

4

Theo hiểu biết của tôi từ tài liệu này, việc thực hiện seihướng dẫn không khác gì việc viết trực tiếp từ 1 đến bit I của SREG. Ưu điểm của hướng dẫn là trước tiên bạn không cần tải một giá trị 1<<Ivào một thanh ghi hoạt động để thay đổi SREG, do đó nó giúp tiết kiệm thời gian.

Để xây dựng, sử dụng sei:

sei ; One cycle

Cài đặt bit bằng cách sử dụng sbi(sẽ chỉ hoạt động nếu SREG nằm trong 32 byte thấp hơn của bản đồ đăng ký, nhưng dường như trên hầu hết nếu không phải là tất cả thì không.)

sbi SREG,7 ; Two cycles

Viết cho tôi bit trực tiếp trong SREG:

in  r24,SREG ;
ori r24,0x80 ;
out SREG,r24 ; Three cycles

Các Ibit nên được thiết lập trong SREG càng sớm càng các seihướng dẫn (hay sbihay out) hoàn tất. Tuy nhiên, mọi ngắt đang chờ xử lý sẽ không được xử lý cho đến khi lệnh tiếp theo hoàn thành - bit sẽ được đặt, nhưng phải mất thêm một chu kỳ để các ngắt được kích hoạt. Bởi vì một ngắt không thể được xử lý giữa lệnh và một số lệnh mất nhiều hơn một chu kỳ để thực thi, chúng chỉ định thời gian cần thiết để được bật như một lệnh. Đây phải là trường hợp cho tất cả các phiên bản của mã - tức là mỗi phiên bản trên sẽ gây ra sự chậm trễ của một lệnh.


Sau một chút tìm kiếm, tôi tìm thấy chủ đề này trên diễn đàn Arduino, trong đó một số thử nghiệm khác nhau đã được thực hiện để xác minh hành vi. Có vẻ như đồng ý với những gì tôi nói ở trên.

Hơn nữa, theo luồng đó, nếu Icờ đã được đặt, thì sẽ không có phản hồi chậm của ngắt gây ra bởi seingụ ý rằng phản hồi chậm được gây ra không phải do chính lệnh, mà là trong phần cứng bên trong được điều khiển bởi Icờ - vì vậy bất kỳ hoạt động làm thay đổi cờ trong SREG, có thể là seihay outhoặc stssẽ có chính xác hành vi tương tự.


Vì vậy, không có khía cạnh nào của việc trì hoãn hoạt động, cụ thể đối với SEI nhưng không phải là OUT, cho phép hoàn thành hướng dẫn sau đây?
Brian Drumond

Trong trường hợp ví dụ thứ hai của bạn, khi nào thì một ngắt đang chờ xử lý? Có một sự chậm trễ chu kỳ như trong lần đầu tiên?
jayjay

@jayjay xem cập nhật của tôi.
Tom Carpenter

1
Lưu ý rằng SBIkhông thể được sử dụng để đặt Ibit vào SREGvì vậy bất kỳ mã nào có khả năng này không thực sự được thử nghiệm trong cuộc sống thực bởi vì nó thậm chí sẽ không được lắp ráp. SBIchỉ có thể hoạt động trên 32 thanh ghi thấp hơn và SREG nằm ở vị trí 63.
bigjosh

@bigjosh ví dụ SBI là ví dụ tôi nghĩ đến sau này - outlà ví dụ tôi đã sử dụng ban đầu. Tôi nghĩ rằng tôi đã bắt gặp một AVR (có thể là ATTiny) có SREG trong 32 thanh ghi thấp hơn, nhưng tôi có thể tưởng tượng nó.
Tom Carpenter

1

IMHO không ghi vào SREG vẫn trì hoãn 1 lệnh có thể được kiểm tra như thế này (mã giả):

ISR() { PORTA = 0; while(1); }
main() 
{
    cli();
    DDRA = 0xff;
    configure_isr_for_level_interrupt_that_will_trigger_immediately();
    SREG = 0xff;
    cli();
    PORTA = 0xff;
    while(1);
}

Thật không may, tôi thiếu thời gian để làm điều đó :(


0

Đó không phải là những gì nó nói. Các tài liệu nói

Hướng dẫn sau SEI sẽ được thực thi trước khi có bất kỳ gián đoạn chờ xử lý nào.

không phải là nó chờ chỉ dẫn tiếp theo Tôi đọc điều này vì cờ được đặt ngay lập tức nhưng ngay cả khi được bật, sẽ không có ngắt nào được xử lý cho đến khi lệnh tiếp theo được thực thi.


Điều này hoàn toàn đúng, nhưng câu hỏi của tôi là: Hành vi này có đặc trưng cho SEI không?
jayjay

@jayjay Tôi nghi ngờ điều này là do độ dài đường ống chỉ dẫn
crasic
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.