Có nhiều cách để thiết kế luồng thực hiện chương trình cho hệ thống nhúng như: Polling, Interrupt, DMA, RTOS hoặc kết hợp các phương pháp trên lại với nhau. Bài viết này sẽ giúp các bạn làm quen với các kỹ thuật thiết kế trên và nắm được các ưu điểm, nhược điểm của mỗi kỹ thuật để có thể lựa chọn được phương pháp phù hợp cho hệ thống của mình.
[HỌC ONLINE: LẬP TRÌNH VI ĐIỀU KHIỂN STM32, VI XỬ LÝ ARM CORTEX – M]
I. Phương pháp Polling:
Đây là phương pháp phổ biến nhất mà ai cũng sử dụng được khi lập trình nhúng từ những bài tập đầu tiên như nhấp nháy LED hay kiểm tra trạng thái nút nhấn để điều khiển LED. Với polling mọi câu lệnh đều được viết trong hàm main() và các vòng lặp vô hạn như while(1) hay for(;;) hay loop() đối với Arduino. Các khối lệnh đảm nhận một chức năng của một hệ thống sẽ được thực thi một cách tuần tự bằng cách kiểm tra các biến trạng thái, điều kiện. CPU liên tục thực thi các lệnh kiểm tra. Phương pháp này phù hợp cho các ứng dụng đơn giản không có sự phân biệt về mức độ ưu tiên giữa các nhiệm vụ trong ứng dụng đó.
– Ưu điểm của Polling:
+ Dễ code, đơn giản cho những ứng dụng đơn giản
+ Dễ debug, tìm lỗi, giám sát quá trình thực hiện của chương trình
+ Các hoạt động trong chương trình có thể dễ dàng dự đoán được
+ Các tài nguyên được sử dụng, chia sẻ giữa chức năng rõ ràng.
– Nhược điểm:
+ Khó phát triển cho những chương trình phức tạp
+ Đáp ứng chậm với các sự kiện
+ Luôn luôn tiêu thụ năng lượng ở mức cao nhất
+ Lãng phí tài nguyên, khả năng của vi điều khiển.
II. Phương pháp Interrupt
Với Interrupt, phần cứng sẽ thông báo cho CPU biết về một yêu cầu dịch vụ (yêu cầu ngắt – IRQ). Chương trình nền đang thực hiện sẽ được tạm ngưng để thực thi chương trình phục vụ ngắt (ISR) tương ứng với yêu cầu đấy. Sau khi thực thi xong ISR thì chương trình sẽ quay về thực thi tiếp chương trình nền. Phương pháp Interrupt thường được kết hợp với phương pháp polling để vi điều khiển có thể làm những việc khác ngoài ISR hoặc có thể kết hợp với các chế độ năng lượng thấp để tiết kiệm năng lượng cho hệ thống. Ngắt phù hợp cho những ứng dụng, chức năng yêu cầu đáp ứng nhanh về mặt thời gian, có độ ưu tiên thực thi cao.
Một số ví dụ đơn giản với ngắt là các bạn có thể phát hiện người dùng nhấn nút mà không cần phải liên tục kiểm tra trạng thái logic của chân gắn với nút nhấn, hay các bạn có thể nhấp nháy LED 1 giây bằng cách sử dụng ngắt timer thay vì các hàm delay thông thường.
– Ưu điểm của ngắt:
+ Tốc độ đáp ứng nhanh hơn so với polling
+ Có thể sử dụng chế độ năng lượng thấp và ngắt sẽ đánh thức CPU
+ Hỗ trợ Nested Interrupt (ngắt có ưu tiên cao hơn sẽ được thực hiện và tạm ngưng thực thi ngắt có ưu tiên thấp hơn).
– Khuyết điểm:
+ Debug phức tạp hơn
+ Các tài nguyên có thể được sử dụng bất ngờ.
III. Phương pháp DMA
DMA là một kỹ thuật truyền dữ liệu mà không cần sự tham gia của CPU, dữ liệu có thể được truyền giữa các ngoại vi, giữa ngoại vi với bộ nhớ và bộ nhớ với bộ nhớ với các kích cỡ có thể cấu hình được như byte, half-word, word. DMA có thể thông báo cho CPU biết đã thực hiện được 1 nữa quá trình truyền hoặc hoàn thành quá trình truyền bằng yêu cầu ngắt. Với chế độ circular của DMA cho phép dữ liệu được cập nhật tại 1 vị trí bộ nhớ hoặc một vùng nhớ nhất định. Các đường truyền DMA có thể được cấu hình các mức ưu tiên khác nhau.
– Ưu điểm của phương pháp DMA:
+ Truyền dữ liệu nhanh hơn so với sử dụng CPU.
+ CPU có thể thực thi các việc khác trong khi dữ liệu được truyền, tăng tốc độ chung của hệ thống.
+ Có khả năng tự động tăng địa chỉ ở ngoại vi hoặc bộ nhớ để lưu trữ.
Nhược điểm:
+ Không phải dòng vi điều khiển nào cũng hỗ trợ DMA.
IV. Sử dụng RTOS
Không nhất thiết phải sử dụng RTOS cho các ứng dụng vừa và nhỏ, nhưng sử dụng RTOS sẽ làm đơn giản hóa hữu ích cho những chương trình phức tạp, giúp chương trình có tổ chức hơn. Các task của RTOS sẽ chia thời gian và chiếm dụng CPU và thực thi một cách đồng thời (nhìn về mặt các task thì là đồng thời, tuy nhiên các bạn lưu ý rằng, trong 1 thời điểm thì 1 CPU chỉ có thể thực thi được 1 lệnh). Có nhiều bản miễn phí có thể sử dụng trên nhiều dòng Vi điều khiển như FreeRTOS.
– Ưu điểm của RTOS:
+ Đơn giản hóa các chương trình thức tạp
+ Hỗ trợ tốt cho các ứng dụng multitasking
+ Cố định được bộ nhớ sử dụng cho từng task.
– Nhược điểm:
+ Tốn thêm bộ nhớ cho RTOS
V. Kết hợp các phương pháp trên
Thường thì các chương trình sẽ kết hợp nhiều phương pháp lại với nhau như Polling + Interrupt, DMA hay RTOS + Interrupt để khai thác được tối đa vi điều khiển và xây dựng được chương trình, hệ thống một cách tốt nhất.
Chúc các bạn thành công!
Nhóm TAPIT R&D