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.. 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ố
Trang 1Ứ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
Đ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ệ
Trang 2thố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
} 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
Trang 3Event_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)
Trang 4{ 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
Trang 5(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
- 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
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
Trang 6nhiệm vụ chính như xác định tọa độ hiện tại (kinh độ, vĩ độ), tốc độ (km/h), thời gian (giờ/phút/giây – ngày /tháng/năm), ghi dữ liệu vào bộ nhớ an toàn, truyền dữ liệu về trung tâm qua đường truyền RF/GSM
Trên cơ sở yêu cầu trên cần lựa chọn và thiết kế các phần cứng ghép nối với vi xử lý trung tâm như sau:
- Thiết bị thu định vị vệ tinh toàn cầu GPS, cho phép xác định các thông tin như tọa độ, tốc
độ và thời gian hiện tại của phương tiện Việc truyền dữ liệu thông qua đường truyền theo chuẩn UART
- Bộ nhớ dung lượng lớn dạng SDCard/MMC có thể lưu trữ với dung lượng 2GB Để đọc
và ghi dữ liệu sử dụng kênh truyền SPI
- Truyền dữ liệu về trung tâm sử dụng Module XE1205 với khoảng cách truyền đạt 400m Giao tiếp với vi xử lý qua kênh truyền SPI và ngắt ngoài
ĐT
- Truyền dữ liệu về trung tâm sử dụng mạng di động GSM với giao thức HTTP với khoảng cách truyền không hạn chế Giao tiếp với vi xử lý theo đường truyền chuẩn UART
Ngoài ra để đồng bộ và phân chia thời gian làm cho các khối Module phần cứng, phần mềm sử dụng bộ định thời Timer
Như vậy ta có 6 nguồn tác động vào ngắt sau: bộ định thời gồm 1 ngắt Timer_ISR, bộ truyền RF XE1205 gồm 2 ngắt (ngắt ngoài Rf_ISR, ngắt SPI chế độ Master SPIM_ISR),bộ thu định vị tọa độ gồm 1 ngắt GPS_ISR, bộ SDCard/MMC gồm 1 ngắt SPI Sdcard_ISR, bộ GSM gồm 1 ngắt GSM_ISR
Để chế tạo thiết bị giám sát hành trình ta sử dụng vi xử lý nhúng họ PsoC với tính năng có thể thiết kế Module phần cứng bên trong, các tài nguyên sử dụng là 1 khối Timer 8 bit, 1 khối Counter 8 bit tạo tốc độ truyền 9600 b/s cho các khối UART GSM, 1 khối Counter 8 bit tạo tốc
độ truyền 4800b/s cho khối UART GPS, 2 khối TX và RX trao đổi dữ liệu với Module GSM, 1 khối RX nhận dữ liệu từ GPS, 1 khối truyền dữ liệu SPI với SDCard, 2 khối truyền dữ liệu SPI với Module XE1205
2 Xây dựng hàm khởi tạo và hàm ngắt
Các hàm khởi tạo ngắt:
Setup7msPulse(); // Khởi tạo hàm ngắt Timer
Trang 7com_initialize (); //Khởi tạo hàm ngắt truyền qua cổng UART
SDCard_Start();
sd_initialization(); // Khởi tạo đọc ghi SDCard
Config_RF(); //Khởi tạo hàm điều khiển module XE1205
Start_GM682(); //Khởi tạo hàm điều khiển ngắt cho Module GSM
Các hàm ngắt:
#pragma interrupt_handler GPSc_ISR
void GPSc_ISR() // Hàm nhận từ GPS
void Timer8c_ISR() // Hàm ngắt Timer
#pragma interrupt_handler Iqr_Rf_ISR
void Iqr_Rf_ISR() // Hàm ngắt ngoài từ XE1205
#pragma interrupt_handler SPIS1_ISR
void SPIS1_ISR() // Hàm ngắt nhận và truyền dữ liệu qua XE1205
#pragma interrupt_handler SPIM1_ISR
void SPIM1_ISR() // Hàm ngắt nạp tham số cho XE1205
#pragma interrupt_handler GM682c_RX_ISR
V KẾT LUẬN
Sử dụng hàm ngắt khi lập trình cho hệ nhúng cho phép xử lý đồng thời nhiều sự kiện (nhận
dữ liệu từ GPS, ghi/đọc dữ liệu vào SDCard, truyền dữ liệu với khoảng cách gần RF, truyền dữ
Để làm việc với hàm ngắt trước tiên phải xem xét đến thứ tự ưu tiên ngắt, sau đó cần khởi tạo
và cho phép hàm ngắt tích cực và cuối cùng là xây dựng thuật toán xử lý của bản thân hàm ngắt
Vòng quét chính của chương trình có nhiệm vụ đồng bộ và điều phối thứ tự thự hiện các sự kiện
Thiết bị giám sát hành trình và tốc độ phương tiện vận tải đã được sử dụng để xác định số
chuyến và cung đường vận chuyển tại Công ty cổ phần than Đèo nai, đã mang lại những hiệu
quả Đồng thời cũng đang được lắp đặt thử nghiệm kiểm soát tốc độ xe khách đường dài tuyến
Hà nội – Đà nẵng
Thiết bị giám sát hành trình:
• Kiểm soát số chuyến theo từng cung đường
• Truyền dữ liệu RF
• Dung lượng bộ nhớ 256MB
• Nguồn cấp 12-24VDC
• Độ chính xác định vị <5m
Tài liệu tham khảo
[1] Nguyễn Thanh Hải, Lựa chọn Chip cho bài toán đo lường và điều khiển Hội nghị đo lường lần thứ 5, 2005
[2] Dr Jürgen Sauermann, Melanie Thelen Realtime Operating Systems♦