🌱 State Machine in Embedded (2)
Ở Post trước mình đã giới thiệu với các bạn về State Machine và một ví dụ cần sử dụng State Machine trong hệ thống nhúng. Ở Post này mình sẽ tiếp tục giải thích về State Machine cũng như ví dụ về cách triển khai nó trong chương trình nhúng.
👉 State Machine
Các bạn nên đọc lại Post trước để nắm được cơ bản về State Machine và bài toán mà mình sẽ triển khai trong bài viết này.
➥ State Machine in Embedded (1)
Trở lại với sơ đồ khối ở Post trước mình đã giới thiệu, một sơ đồ mà chúng ta có 3 ô tròn biểu thị cho 3 trạng thái chính của chương trình:
⓵ 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.
Các mũi tên nối giữa các trạng thái chính là những điều kiện để chuyển trạng thái, cũng như các sự kiện có trong chương trình:
- Khi đang ở trạng thái nhập Pass, nếu nhập pass đúng, chương trình sẽ chuyển sang trạng thái 2 là Xe chạy.
Nếu nhập pass sai thì chương trình vẫn sẽ ở lại trạng thái 1. Nhập Pass.
Còn nếu bấm nút đổi Pass, chương trình sẽ chuyển sang trạng thái đổi Pass. - Khi ở trạng thái 2. Xe chạy, chương trình không thể làm những việc khác như nhập pass hay đổi pass nữa. Lúc này, chỉ khi chương trình bị Reset (tức là Xe tắt máy) thì nó mới trở về trạng thái ban đầu đó là 1. Nhập Pass.
- Khi ở trạng thái đổi Pass, nếu đổi pass thành công hoặc reset, chương trình sẽ quay trở về trạng thái 1. Nhập Pass.
👉 Triển khai State Machine
Sau khi đã có thiết kế sơ đối khối như phần trên, chúng ta cần tìm cách triển khai chúng bằng chương trình code. Các triển khai phổ biến nhất mà mình muốn giới thiệu với các bạn đó là sử dụng một biến trạng thái + Câu lệnh rẽ nhánh Switch-Case để kiểm tra biến trạng thái đó.
Lí do là vòng lặp while(1) sẽ lặp đi lặp lại chương trình, và sẽ liên tục kiểm tra biến trạng thái của chương trình. Tại một thời điểm, biến trạng thái chỉ có một giá trị, vì vậy, chương trình sẽ chỉ sử dụng code của một trạng thái mà bỏ qua phần code của những trạng thái khác, đúng như những yêu cầu ban đầu của bài toán.
Vậy hãy thử triển khai bài toán theo luồng sau:
- Define các trạng thái của chương trình như dưới đây, trạng thái ban đầu của chương trình sẽ là PASSWORD_CHECKING.
- Sử dụng câu lệnh rẽ nhánh Switch-Case để triển khai các trạng thái của chương trình, mình tóm tắt ở dưới đây, tuân theo sơ đồ khối ở trên.
- Trong trường hợp này, việc chuyển đổi sang trạng thái CHANGE_PASSWORD từ trạng thái PASSWORD_CHECKING là cần thực hiện ngay lập tức, vậy nên mình dùng thêm một ngắt ngoài để xử lý trường hợp này.
*** Lưu ý là khi RUN MODE chúng ta không thể chuyển qua trạng thái CHANGE_PASSWORD.
Chi tiết các bạn DOWNLOAD CODE TẠI ĐÂY!
Video mô phỏng kết quả Project trên: