🌱 State Machine in Embedded (1)
👉 ĐẶT VẤN ĐỀ
Mình sẽ bắt đầu với một bài toán ứng dụng của mình với đề bài như sau: Bộ khóa xe máy bằng mật khẩu, với các tính năng sau:
- Có tính năng nhập password, nhập sai thì báo sai, nhập lại, và nhập sai quá 3 lần thì có cảnh báo và không cho nhập mật khẩu nữa.
- Khi nhập mật khẩu đúng thì chúng ta có thể sử dụng các nút bấm để điều khiển xe, đèn passing, còi, ...
- Bộ khóa xe có chức năng thay đổi mật khẩu.
Vậy với bài toán trên, theo cách thông thường chúng ta có thể triển khai theo cách nào? Mình xin đưa ra một ví dụ về cách triển khai thông thường như sau:
- Đầu tiên chúng ta sẽ kiểm tra mật khẩu xem có đúng hay không? Nếu sai thì báo nhập lại, nếu sai quá 3 lần thì cảnh báo và không cho nhập mật khẩu nữa.
- Nếu nhập mật khẩu đúng thì chúng ta có thể bắt đầu các nút bấm để chạy xe, passing, còi, ...
- Khi bấm nút đổi mật khẩu thì chúng ta có thể đổi và lưu mật khẩu mới vào trong eeprom.
- Trước khi nhập mật khẩu đúng, chương trình không được phép kiểm tra các nút bấm để điều khiển các thiết bị.
- Khi mà nhập mật khẩu đúng rồi, thì chúng ta không được phép nhập mật khẩu hay đổi mật khẩu nữa! Tất nhiên rồi, vì việc xe đang chạy không thể bị gián đoạn bởi những công việc khác.
- Khi bấm nút đổi mật khẩu xong thì chúng ta sẽ phải chuyển về trạng thái nhập mật khẩu.
Nhìn chung là có một điểm chung giữa các vấn đề trên, đó là việc chương trình được chia làm 3 trạng thái chính riêng biệt:
⓵ Trạng thái nhập mật khẩu,
⓶ Trạng thái xe chạy sau khi nhập mật khẩu đúng,
⓷ Trạng thái đổi mật khẩu.
➤ Kết luận: Và khi ở trạng thái này chúng ta sẽ không cần dùng đến phần code của những trạng thái khác. Cũng như có một số điều kiện để chuyển từ trạng thái này sang trạng thái khác. Nếu như theo cách viết code thông thường, chúng ta sẽ cần rất nhiều Conditional Statement (chẳng hạn câu lệnh if-else) để rào các trạng thái lại, không để phần code này chạy khi đang ở trạng thái khác!
Việc đó có thể mất đến 2 câu lệnh if ở mỗi trạng thái và tổng cộng có thể lên đến 6 câu lệnh if-else! Và như thế là quá nhiều!
Từ đó, để quản lý các trạng thái hoạt động của chương trình, người ta sinh ra khái niệm State Machine - Máy trạng thái.
👉 State Machine - Máy trạng thái là gì?
Chúng ta sẽ đi search thử một khác niệm chung về State Machine tại đây:
"Máy trạng thái là mô hình toán học dùng trong thiết kế máy tính và các mạch tuần tự. Máy trạng thái bao gồm nhiều trạng thái có liên quan với nhau, và tại một thời điểm, máy sẽ ở trong một trạng thái duy nhất. Trạng thái mà máy đang ở, trong bất kỳ thời điểm nào gọi là trạng thái hiện tại (current state), trạng thái mà máy sẽ chuyển đến kế tiếp tính từ thời điểm hiện tại gọi là trạng thái kế tiếp."
Đối với các ứng dụng nhúng, state machine cũng được định nghĩa giống như với chương trình code, tại một thời điểm, chương trình sẽ ở một trạng thái duy nhất như đã nêu ở phần trên, và có những điều kiện chuyên tiếp từ trạng thái này sang trạng thái khác. Chúng ta có thể thiết kế một sơ đồ khối như dưới đây:
Chi tiết về sơ đồ State Machine ở trên và cách triển khai State Machine bằng code C nhúng sẽ được giới thiệu ở bài sau!
0 Nhận xét