
ỨNG DỤNG HÀM NGẮT TRONG LẬP TRÌNH
CHO HỆ XỬ LÝ NHÚNG
TS. NGUYỄN THANH HẢI
Bộ môn Kỹ thuật điện tử viễn thông
Khoa Điện – Điện tử
Trường Đại học Giao thông Vận tải
Tóm tắt: Hệ xử lý nhúng được sử dụng trong hầu hết các thiết bị điện – điện tử, việc lập
trình cho hệ này có những đặc trưng khác với lập trình cho PC thông thường. Trong bài báo
này xây dựng và phân tích cấu trúc của một chương trình cho hệ nhúng trên cơ sở ứng dụng
hàm ngắt.
Summary: Every year, millions of microprocessors and microcontroller chips are sold
as CPUs for electronic devices (embedded systems), programming for this system differs for
common PCs. The paper analizes some structured of programs for embedded system using
interrupt function.
I. YÊU CẦU CƠ BẢN ĐỐI VỚI HỆ XỬ LÝ NHÚNG
Một hệ thống thông thường thể hiện mối quan hệ giữa các đầu vào biết trước và đầu ra
cần đáp ứng. Với hệ thống điều khiển số các đầu vào là các tín hiệu mang dữ liệu số hoặc dữ
liệu từ đầu đo, còn đầu ra là dữ liệu hiển thị hoặc các tín hiệu điều khiển như hình dưới đây:
ĐT
Hiển thị
Dữ liệu vào
HỆ XỬ LÝ
NHÚNG
Sensor1
Sensor2
Sensor n Điều khiển n
Điều khiển 2
Điều khiển 1
Xét về yếu tố đáp ứng yếu tố thời gian thực, hệ xử lý nhúng được xây dựng trên cơ sở xử lý
các sự kiện. Mỗi một sự kiện là một bài toán mà hệ thống này cần phải giải quyết, thời gian tính
từ thời điểm có một tác động của sự kiện đầu vào đến thời điểm đưa ra đầu ra là thời gian đáp
ứng của hệ thống. Hệ thống thời gian thực là hệ thống luôn đảm bảo thời gian đáp ứng đúng
theo yêu cầu của bài toán, tức là các giá trị điều khiển và hiển thị được đưa ra kịp thời đúng theo
chu trình. Tính chất thời gian thực là đặc điểm khác cơ bản giữa hệ thống điều khiển số và hệ

thống xử lý thông thường.
Khi thiết kế và chế tạo một thiết bị sử dụng hệ xử lý nhúng cần phải xét đến các yếu tố sau:
- Số cổng vào ra cần thiết, số cổng này bao gồm cổng vào ra số (Digital) và cổng vào ra
tương tự (Analog).
- Các module ghép nối với thiết bị ngoại vi, được chia thành các loại sau:
+ Module phục vụ chuyển đổi tín hiệu gồm bộ biến đổi ADC, DAC, khối điều chế độ
rộng xung PWM.
+ Module truyền thông theo chuẩn UART, SPI, I2C…
- Dung lượng RAM đỏi hỏi, phụ thuộc vào từng bài toán cụ thể mà ta có thể lựa chọn RAM
cho phù hợp. Bộ nhớ bên trong có thể từ 256 byte đến vài KB, bộ nhớ ngoài từ vài chục KB đến
vài MB.
- Dung lượng FLASH hoặc ROM: Đây là nơi lưu giữ mã chương trình.
- Số lượng đòi hỏi ngắt làm việc theo sự kiện.
- Tốc độ vi xử lý, đảm bảo thời gian xử lý ngắt và thực hiện hàm theo vòng lặp chính.
- Thời gian đáp ứng cần thiết, đáp ứng khả năng thực hiện theo hệ thống thời gian thực.
- Các yêu cầu về nguồn cấp và năng lượng tiêu thụ.
- Hệ phát triển phục vụ lập trình và gỡ rối.
ĐT
- Chi phí chế tạo bao gồm chi phí phần cứng, chi phí cho hệ phát triển, chi phí lập trình và
hoàn thiện hệ thống.
II. CẤU TRÚC CHUNG MỘT CHƯƠNG TRÌNH
1. Vòng lặp chính
Chương trình của một hệ thống nhúng, trong trường hợp không sử dụng hệ điều hành, có
cấu trúc như sau:
void Event_1()
{
Command_1(); Delay5s(); // Hàm đợi 5s
Command_2();
}
int main (void)
{
Init_Parameter(); // Hàm khởi tạo biến
while (1)
{
Read_Input(); // Hàm đọc các giá trị cổng vào

Event_1(); // Hàm xử lý sự kiện 1
Event_2(); // Hàm xử lý sự kiện 2
……
Event_n(); // Hàm xử lý sự kiện n
Write_Output(); // Hàm điều khiển các cổng ra
}
}
Trong đó hàm khởi tạo có nhiệm vụ nạp các giá trị ban đầu cho biến, khởi tạo các khối
phần cứng như Timer, Counter, ADC, UART … làm việc theo yêu cầu của từng bài toán.
Hàm Read_Input cho phép xác định trạng thái hoặc giá trị của các cổng đầu vào vi xử lý,
giá trị này có thể là mức logic (cổng vào Digital) hoặc một con số tương ứng với mức điện áp
vào (cổng vào Analog).
Hàm Write_Output điều khiển các cổng ra, cũng có thể là mức logic hoặc giá trị điện áp ra
(quan bộ biến đổi DAC, PWM).
Các hàm Event_1() đến Event_n() xử lý theo các sự kiện, đây là các hàm thực hiện thuật
toán của chương trình.
Do đặc tính của lệnh While(1), ta thấy sau khi thực hiện xong hàm Write_Ouput() chương
trình sẽ thực hiện lại hàm Read_Input(). Thời gian từ hàm Read_Input() đến Write_Ouput() là
chu kỳ quét chính của chương trình và vòng lặp while(1) được gọi là vòng lặp chính (Super
Loop).
ĐT
Phương pháp xây dựng chương trình trên vòng lặp chính là phương pháp phổ biến nhất khi
lập trình với hệ nhúng.
2. Thời gian đáp ứng các sự kiện
Theo cấu trúc như trên ta thấy một vấn đề là việc xử lý các sự kiện theo nguyên tắc tuần tự,
các sự kiện sau phải chờ sự kiện phía trước xử lý xong. Trong nhiều trường hợp thời gian xử lý
các sự kiện cuối sẽ quá lớn và không đáp ứng được yêu cầu bài toán.
Thông thường với nhiều sự kiện đòi hỏi cần hàm trễ để đợi giá trị tác động đầu vào hoặc
chờ đến chu trình hoạt động tiếp theo, lúc này CPU chỉ thực hiện vòng đợi thời gian trong khi
cần xử lý sự kiện tiếp theo. Như vậy ta không lợi dụng được hiệu năng của CPU với vai trò thực
hiện thuận toán, để khắc phục hiện tượng này có thể dùng giải pháp sau: thiết lập trạng thái đợi
vào một cờ nhớ, tương ứng với trạng thái này với mỗi vòng quét ta kiểm tra đã hết thời gian đợi
chưa. Nếu hết thời gian sẽ xóa cờ nhớ và tiếp tục thực hiện trạng thái tiếp theo của sự kiện đợi,
trong trường hợp chưa hết thời gian đợi ta có thể thực hiện hàm xử lý sự kiện tiếp theo.
Tương ứng với vòng quét chính trên ta thay thế hàm Event_1() như sau:
void Event_1()
{
switch (trang_thai)

{
case 0:
Command_1(); trang_thai=1;
break;
case 1:
if(Het_5s) //Kiểm tra đã đủ 5 s
{
Command_2(); trang_thai=0;
}
}
Khi các sự kiện làm việc phụ thuộc vào các yếu tố bên ngoài như các khối cứng Timer,
ADC, PWM hay xung tác động từ ngoài vi xử lý thì chương trình phải đáp ứng các sự kiện này
thông qua hai phương pháp: hoặc là thực hiện vòng lặp để kiểm tra cờ trạng thái sự kiện hoặc
chức năng điều khiển ngắt. Thực hiện chức năng điều kiển ngắt có lợi thế là khả năng đám ứng
tức thời và cấu trúc của chương trình mạch lạc, dễ kiểm soạt.
Khi có một đòi hỏi ngắt từ các khối này, chương trình thực hiện vòng quét chính sẽ tạm
ngừng và thực hiện hàm ngắt trong vùng nhớ vector ngắt tương ứng. Sau khi hàm ngắt thực
hiện xong chương trình sẽ tự động trở về vị trí trong vòng quét chính lúc gọi hàm ngắt.
Với một hệ xử lý nhúng luôn luôn sử dụng chức năng ngắt để đảm bảo yếu tố thời gian
thực.
3. Hệ điều hành thời gian thực (RTOS)
ĐT
Cùng với sự phát triển mạnh mẽ của hệ xử lý nhúng, đòi hỏi phát triển một hệ điều hành
chuyên dụng cho các ứng dụng điều hành thời gian thực (RTOS – RealTime Operating System).
Hệ điều hành thời gian thực cho phép lập trình các ứng dụng có đáp ứng thời gian thực đơn giản
và dễ dàng, nó làm việc dưa trên sự phân chia giữa các chuỗi sự kiện. Cấu trúc của lõi của hệ
điều hành này như sau:
Trong sơ đồ cấu trúc của hệ điều hành thời gian thực (RTOS) điều khiển đóng vai trò
đặc biệt quan trọng với vai trò đồng bộ và phân bổ thời gian thực hiện của các Thẻ tiến trình

(Task). Khi sử dụng hệ điều hành, ta có thể sử dụng các hàm chuẩn điều hành và cơ chế sử dụng
vòng quét chính không tồn tại. Nguyên tắc làm việc của các Thẻ tiến trình theo trạng thái sau:
Hoạt động
Khóa Sẵn sàng
- Trạng thái hoạt động: Vi xử lý thực hiện các thuật toán phục vụ cho Thẻ tiến trình này,
tại một thời điểm với vi xử lý đơn chỉ cho phép thực hiện một Thẻ tiến trình.
- Trạng thái sẵn sàng: Vi xử lý đang thực hiện một tiến trình khác, tuy nhiên Thẻ tiến trình
này sẵn sàng hoạt động khi kết thúc tiến trình trước đó.
- Trạng thái khóa: Thẻ tiến trình không thực hiện nhiệm vụ gì tại thời điểm hiện tại, nó ở
trạng thái chờ một sự kiện bên ngoài tác động vào để kích hoạt.
III. XÂY DỰNG HÀM NGẮT
Để xây dựng một hàm ngắt trước tiên cần khởi tạo các thanh ghi cấu hình cho ngắt đó làm
việc. Thông số của các thanh ghi này phụ thuộc vào từng loại vi xử lý, cầu trúc của khối phần
cứng đòi hỏi ngắt, các thông số này bao gồm: lựa chọn chế độ làm việc, các tham số ban đầu,
mức độ ưu tiên ngắt và cho phép đòi hỏi ngắt làm việc. Ví dụ đối với khối biến đổi ADC ta cần
khai báo để thực hiện yêu cầu sau: tốc độ biến đổi 10 chuyển đổi/giây, dạng dữ liệu 12bit, biến
đổi liên tục và cho phép thực hiện hàm ngắt.
ĐT
Bước tiếp theo là xác định chính xác địa chỉ tuyệt đối của hàm ngắt trong bảng Vector ngắt
đã được quy định sẵn. Khi có một đòi hỏi ngắt đến vi xử lý, con trỏ chương trình sẽ chỉ đến địa
chỉ trong bảng Vector ngắt và tại địa chỉ này sẽ có lệnh gọi hàm ngắt tương ứng. Ví dụ hàm ngắt
bộ ADC nằm ở địa chỉ OCB03.
Cuối cùng ta cần xây dựng hàm ngắt để xử lý sự kiện mà ngắt đòi hỏi, vi dụ đối với bộ
biến đổi ADC hàm ngắt sẽ được gọi sau khi thực hiện phép biến đổi xong. Trong hàm này cần
thực hiện các nhiệm vụ sau:
- Chuyển dữ liệu vừa biến đổi xong trong thanh ghi dữ liệu 16 bit vào biến trung gian.
- Xóa các cờ bên trong khối biến đổi
- Ra lệnh thực hiện chuyển đổi tiếp theo
IV. ỨNG DỤNG HÀM NGẮT TRONG CHẾ TẠO THIẾT BỊ GIÁM SÁT HÀNH TRÌNH
VÀ TỐC ĐỘ CHO PHƯƠNG TIỆN VẬN TẢI
1. Xác định các sự kiện đòi hỏi ngắt
Để giám sát tốc độ và hành trình phương tiện vận tải, thiết bị chế tạo cần thực hiện các

