Ứ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, I 2 C… - 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 nhiệ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 com_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 #pragma interrupt_handler Timer8c_ISR 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 void GM682c_RX_ISR() // Hàm ngắt trao đổi dữ liệu với Module GSM 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ữ liệu qua mạng di động) với thời gian đáp ứng phù hợp. ĐT Để 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♦ . 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. 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. Ứ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ệ