Chào các bác, hồi trước em có học 8051 mà không đến nơi đến chốn, nay có vài điểm rất thắc mắc mong các cao thủ giải đáp hộ:
Em đọc sách thấy nói là nếu nhiều ngắt xảy ra đồng thời thì ngắt nào ưu tiên cao nhất (giả sử là i1) sẽ được xử lý, các ngắt còn lại bị lưu lại (giả sử là i2 bị lưu lại). Ngắt i1 củgn phải kiểm tra xem có ngắt nào đang thực thi không, nếu ngắt đang thực thi (gọi là i3) ưu tiên thấp hơn thì bị i1 ngắt lồng, còn nếu ưu tiên cao hơn thì i3 tiếp tục và i1 sẽ bị lưu lại. Em muốn hỏi là nếu sau khi ISR của ngắt i3 kết thúc mà lại vừa vặn có ngắt khác (i4) thì cái nào được ưu tiên: i1,i2,i4 ???
Một cái nữa là bình thường nếu không sửa IP thì ngắt ngoài 0 ưu tiên cao hơn ngắt ngoài 1, nhưng em test thử trên proteus với code KeilC như sau:
Thì khi chạy nó lại ra 0x0f,
như vậy thì Proteus sai hay em hiểu sai???
Em đọc sách thấy nói là nếu nhiều ngắt xảy ra đồng thời thì ngắt nào ưu tiên cao nhất (giả sử là i1) sẽ được xử lý, các ngắt còn lại bị lưu lại (giả sử là i2 bị lưu lại). Ngắt i1 củgn phải kiểm tra xem có ngắt nào đang thực thi không, nếu ngắt đang thực thi (gọi là i3) ưu tiên thấp hơn thì bị i1 ngắt lồng, còn nếu ưu tiên cao hơn thì i3 tiếp tục và i1 sẽ bị lưu lại. Em muốn hỏi là nếu sau khi ISR của ngắt i3 kết thúc mà lại vừa vặn có ngắt khác (i4) thì cái nào được ưu tiên: i1,i2,i4 ???
Một cái nữa là bình thường nếu không sửa IP thì ngắt ngoài 0 ưu tiên cao hơn ngắt ngoài 1, nhưng em test thử trên proteus với code KeilC như sau:
Code:
#include "regx51.h" void f0() interrupt 0//ngắt ngoài 0 { P1=0xff; } void f1() interrupt 2//ngắt ngoài 1 { P1=0x0f; } void main() { EA=1,EX1=1,EX0=1; IT1=1,IT0=1; P1=0x00; while(1); }
như vậy thì Proteus sai hay em hiểu sai???
Comment