View Single Post
Old 10-10-2008, 06:18 PM   #3
namqn
Trưởng lão PIC bang
 
Tham gia ngày: Feb 2006
Nơi Cư Ngụ: Tp. HCM, Việt Nam
Bài gửi: 3,025
:
Send a message via Yahoo to namqn
Trích:
Nguyên văn bởi mbk View Post
Tìm trên dientuvietnam.net thấy có bài nói về cái này của bác CHIBANG nhưng đọc mà vẫn chưa hiểu:
http://dientuvietnam.net/forums/show...p?t=831&page=3
Cho 3 ngắt 1,2,3; làm thế nào để nếu đang thực hiện ngắt i mà có ngắt j <i xẩy ra thì phải phục vụ ngắt j ngay, CHIBANG cho đáp án là:
Trong hàm ngắt, viết như sau:
Ngắt_1()
{
//Chèn mã lệnh: disable ngắt 1,2,3 tại đây
GIE=1;
//Chèn mã lệnh trình phục vụ ngắt 1
}

Ngắt_2()
{
//Chèn mã lệnh: disable ngắt 2,3 tại đây
GIE=1;
//Chèn mã lệnh trình phục vụ ngắt 2
}

Ngắt_3()
{
//Chèn mã lệnh: disable ngắt 3 tại đây
GIE=1;
//Chèn mã lệnh trình phục vụ ngắt 3
}

Như ở trong ngắt 1, đầu tiên cấm ngắt 1,2,3; sau đó cho phép tất cả các ngắt (GIE = 1), rồi thực hiện ngắt 1. Nếu đang thực hiện ngắt 1 mà có ngắt 2 hoặc 3 nhảy vào thì điều j sẽ xảy ra???
Mong các cao thủ chỉ cho con đường sáng!
Lưu ý là áp dụng cho Pic16 mọi người nhé!
Vì đã cấm ngắt 1, 2, 3 nên khi ngắt 2 hoặc ngắt 3 xảy ra thì ngắt 1 vẫn được tiếp tục xử lý. Sau khi trở về từ ngắt 1 thì trình xử lý ngắt lại được kích hoạt, vì có ngắt 2 hoặc ngắt 3 đang chờ xử lý. Do đó, ngắt đang chờ xử lý này sẽ được phục vụ.

Tất nhiên là kỹ thuật này được đưa ra để giải quyết vấn đề ưu tiên ngắt cho các PIC 8-bit (kể cả PIC18, vì chúng cũng chỉ có 2 mức ưu tiên, nên vẫn xảy ra trường hợp có nhiều ngắt cùng mức cần được phân biệt xử lý).

Thân,
__________________
Biển học mênh mông, sức người có hạn.

Đang gặp vấn đề cần được giúp đỡ? Hãy dành ra vài phút đọc luồng sau:
http://www.picvietnam.com/forum/showthread.php?t=1263
namqn vẫn chưa có mặt trong diễn đàn   Trả Lời Với Trích Dẫn