Vấn đề xử lý ngắt trong lập trình C - Đề tài môn Lập trình hệ thống và ghép nối thiết bị
Trang 1Bài tập lớn môn: Lập trình hệ thống
và ghép nối thiết bị
Đề tài: Xử Lý Ngắt Trong Lập Trình C
Nhóm 14:
I) CÁC KHÁI NIỆM:
1, Mỗi khi một thiết bị phần cứng hay một chương trình cần đến sự giúp đỡ của CPU nó gửi đi một tín hiệu hoặc lệnh gọi là ngắt đến bộ vi xử lý chỉ định một công việc cụ thể nào đó mà nó cần CPU thực hiện Khi bộ vi xử lý nhận được tín hiệu ngắt nó thường tạm ngưng tất cả các hoạt động khác và kích hoạt một chương trình con đang có trong bộ nhớ gọi là chương trình xử lý ngắt tương ứng với từng số liệu ngắt cụ thể Sau khi chương trình xử lý ngắt làm xong nhiệm vụ, các hoạt động của máy tính sẽ tiếp tục lại từ nơi đã
bị tạm dừng lúc xảy ra ngắt
- Ngắt (interrupt) là quá trình dừng chương trình chính đang chạy để ưu tiên thực hiện một chương trình khác, chương trình này được gọi là chương trình phục vụ ngắt (ISR – Interrupt Service Routine)
-Ngắt trong trương trình có mức độ ưu tiên cao nhất
2, Trong các quá trình ngắt, ta phân biệt thành 2 loại: ngắt cứng và ngắt mềm
Ngắt mềm là ngắt được gọi bằng một lệnh trong chương trình ngôn ngữ máy
Khác với ngắt mềm, ngắt cứng không được khởi động bên trong máy tính mà do các linh kiện điện tử tác đông lên hệ thống
3, hoạt động: Khi thực hiện lệnh gọi ngắt, CPU sẽ tìm kiếm trong bảng vector ngắt địa chỉ của chương trình phục vụ ngắt Người sử dụng cũng có thể xây dựng môt chương trình cơ sở như các chương trình xử lý ngắt Sau đó, các chương trình khác có thể gọi ngắt ra để sử dụng Một chương trình có thể gọi chương trình con loại này mà không cần biết địa chỉ của
Trang 2II) CƠ CHẾ SỦ LÝ NGẮT TRONG C:
Trong C hỗ trợ thư viện khá hoàn hảo, để sử dụng ngắt trong chương trình C cấu trúc ngắt trong C cần include file “interrupt.h” nằm trong thư mục con “avr” File header interrupt.h chứa định nghĩa các hàm và các phương thức phục vụ cho viết chương trình
Trang 3phục vụ ngắt , các vector ngắt không được định nghĩa trong file này mà là trong file iom8.h
Trong đoạn code trên sử dụng 1 biến tạm 8bit, có dấu để lưu giá trị đếm, tên biến val, mỗi khi có ngắt tăng val 1 đơn vị và ngược lại khi có ngắt trên INT1 giảm val đi 1 đó là nội dung của 2 trình phục vụ ngắt Trong đoạn chương trình trên trước hết chúng ta thực hiện việc xác lập hoạt động cho 2 ngắt sau đó chương trình vào 1 vòng lặp vô tận while, PORTC được đùng để kiểm tra rằng chương trình trong vòng lặp vô tận vẫn đang hoạt động
Câu lệnh MCUCR│=(1<<ISC11) │(1<<ISC01) nghĩa là dịch số 1 sang trái ISC11 vị trí, và (1<<ISC01) là dịch số 1 sang trái ISC01 vị trí ISC11 và ISC01 Trong include file “io.h” thì file “iom8.h” được chèn vào, và trong file này chứa địa chỉ các thanh ghi của chip atmega8, các tên bit được khai báo sẵn trong file này :
Đây là định nghĩa các bit trong thanh ghi MCUCR
Trang 4Ngắt 21h :
+ Đối với ngắt thì thường có đầu ra và đầu vào
+ Đối với ngắt này vào AH và ra ở AL > các hàm của ngắt 21h ở AH
+ AH , AL thuộc AX : là thanh ghi : gồm 16bits = 2byte -> AH , AL mỗi thứ 1 byte = 8bits và AL là 8 bits thấp AH là 8 bits cao
+ Ngoài AX còn có BX , CX , DX nó cũng như AX
-Gán giá trị AH=1 tức là gán hàm thứ nhất của ngắt 12h, sau đó gọi ngắt
Ví dụ:
#include<stdio.h>
#include<conio.h>
#include<dos.h>
int input()
{
int x;
union REGS regs;
// Gán AH = 1 tức là báo với nó là ta sử dụng hàm 1 trong ngắt 21h
regs.h ah = 1 ;
// Sau đó gọi hàm ngắt
int86( 0x21 ,®s,®s) ;
//Hàm trên thực thi thì xuất hiện dấu nhắc cho ta nhập 1 ký tự
// -> Tống giá trị nhập AL -> Lấy ra
x = regs.h al ;//Tống giá trị mình nhập vào AL
x = x – 0x30 ;//Lấy ra
return x
III) ĐỀ MÔ TRƯƠNG TRÌNH
Nhập vào từ bàn phím một chuỗi cái số, dùng ngắt để in ra màn hình
#include<stdio.h>
#include<conio.h>
#include<dos.h>
int nhap ();
void xuat ( int x );
void main ()
{
int x ;
printf ("\n Moi ban nhap mot so tu 0->9:");
x nhap ();
xuat ( );
getch ();
}
int nhap ()
{
union REGS regs ;
int x = ;
int temp ;
do
{
regs ah = ; // Gán hàm 1 của ngắt 21
Trang 5int86 ( 0x21 ,& regs ,& regs ); //Gọi ngắt
temp = regs al ; // dùng biến tạm để lưu các biến được nhập
if( temp == 0x0D ) // nếu nhập enter thì thoát
goto EXIT;
temp -= 0x30 ; /* nếu không nhập enter thì tiếp tục thực hiện vòng lặp, temp -0x30 để ra số nhập vào */
x x 10 + temp ; // chuyển nó thành giá trị cần nhập
EXIT:
}while( temp != 13 ); // mã hex của phím enter=0x0D: 13
return x ;
}
void xuat ( int x )
{
union REGS regs ;
regs ah = ;
x += 0x30 ;
regs dl = ;
int86 ( 0x21 ,& regs ,& regs );
}