Hình 4.1.1 : Queue
Là một máy giao tiếp dữ liệu giữa các Task. Một message Queue là một đối tượng tương tự như Buffer ( bộ nhớ đệm) thông qua Task hoặc ISR để gửi và nhận dữ “tin nhắn” (message) để giao tiếp và đồng bộ dữ liệu. Nó giữ tạm thời tin nhắn từ bên gửi ( sender) cho đến khi bên nhận được định trước ( intended receiver) sẵn sàng đọc dữ liệu.
Khi một message Queue được tạo ra lần đầu tiên, nó đượck gán đến một khối quản lý Queue( Queue control Block( QCB)), tên message Queue, ID duy nhất, bộ nhớ đệm ( buffer), chiều dài Queue, độ dài tôi đa mỗi tin nhắn, và môt hay nhiều danh sách các task đang chờ.
Một Message Queue có 2 danh sách các task đang chờ có liên quan. Một danh sách các task chờ nhận dữ liệu bao gồm các Task đang chờ khi Queue rỗng( không có dữ liệu). Danh sách các task đang chờ gửi gồm những task đang chở trong khi Queue đang đầy ( full) dữ liệu.
4.2Các trạng thái của Queue:
Hình 4.2.1: Trạng thái Của Queue
Khi một Message Queue được tạo lần đầu tiên, Queue sẽ ở trạng thái rỗng
Nếu một Task cố gắng nhận nhận messages từ message queue trong khi queue đang rỗng , task sẽ bị khóa và được lưu lại trong danh sách các task đang chờ.
Nếu như một task khác gửi một message đến message queue, message này sẽ được chuyển trực tiếp đên Task bị khóa . Task bị khóa đó sẽ được xóa khỏi danh sách các task đang chờ và chuyển sang trạng thái sẵn sàng thực thi hoặc là đang thực thi.
Nuế như một task nào đó gửi một message đến cùng một message queue nhưng không có task nào chờ nhận trong danh sách các task chờ thì message queue sẽ trở nên không còn rỗng nữa.
Khi có thêm những message đến queue thì queue sẽ dần dần được lấp đầy và dẫn đến không còn không gian rỗi để nhận message nữa. Lúc này nếu như có một message nào khác gửi đến nữa thì sẽ không thành công trừ khi có một Task yêu cầu nhận dữ liệu từ Queue, vì nó sẽ giải phóng một thành phần của Queue.
Trong hiện thực một số Kernel, khi Task cố gắng gửi dữ liệu đi mà queue bị đầy thì hàm gửi đi sẽ trả về mã lỗi ( error code) cho Task đó. Một số Kernel khác lạu cho phép Task bị khóa và chuyển đến danh sách các task chờ gửi, danh sách này tách biệt với danh sách Task chờ nhận.
4.3Các điều khiển liên qua đên Message Queue: Tạo một Queue:
Khởi tạo các tham số: chiều dài queue, kích thước tối đa mỗi message, thứ tự chờ..
Xóa một Queue:
Tự động mở khóa các task đang ở trạng thái chờ
Hình 4.3.1: Gửi message đến Queue
Khi gửi message, Kernel sẽ đưa điền vào message queue theo thứ tự từ “đầu đến cuối” ( head to tail) trong FIFO
Các kiểu gửi message:
Không khóa ( noneblocking) từ task hoặc ISRs
Bên gửi sẽ không bị khóa nếu như Queue đầy mà sẽ trả về error code. Là cách duy nhất dùng cho việc gửi message từ ISRs vì ISRs không thể khóa được.
Khóa với thời gian timeout ( chỉ dành cho Task) Ngược lại so với None blocking
Khóa vĩnh viễn ( chỉ dùng cho Task).
Hình 4.3.2: Ứng xử với Task chờ Messsage
Nhận message:
Quá trình này diển ra tương tự như quá trinh gửi nhưng trình tự sẽ ngược lại.
Kiểu nhận message: None blocking
Blocking vĩnh viễn.
Kiều đọc dữ liệu tử Queue: Đọc với tái cấu trúc dữ liệu
Đọc nhưng không tái cấu trúc lại dữ liệu.
Đọc thông tin một Queue:
Có thể lấy các thông tin liên quan đến Queue
Có thể đọc được danh sách các Task đang trạng thái chờ.