You are on page 1of 5

1.

QUEUE

Queue là tập hợp First In – First Out (FIFO), được triển khai trong FreeRTOS với cấu trúc dữ liệu tuyến
tính trong đó phần tử được thêm đầu tiên sẽ là phần tử đầu tiên bị loại bỏ.

Khi một phần tử được thêm vào hàng đợi được cho là được xếp vào hàng đợi, trong khi khi phần tử bị
xóa được cho là được xếp ra khỏi hàng đợi.

Hình 1. Task Producers gửi dữ liệu và task consumers nhận dữ liệu.

Queue được sử dụng rộng rãi trong lập trình đồng thời, đặc biệt khi dữ liệu cần được trao đổi giữa một
số luồng có thời gian phản hồi khác nhau đối với các sự kiện. Ví dụ, chúng ta thường có hai luồng, một
luồng đóng vai trò là producers và một là consumers, chia sẻ một vùng đệm chung. Công việc của
producers là tạo một phần dữ liệu, đưa nó vào bộ đệm và tiếp tục tạo. Đồng thời, công việc của
consumers bao gồm tháo nó ra khỏi bộ đệm từng miếng một.
Hình 2. Ví dụ về trình tự ghi và đọc từ một Queue

2. SỬ DỤNG QUEUE
2.1 Blocking khi chờ nhận dữ liệu từ queue

Mức độ ưu tiên của các tác vụ gửi đến hàng đợi thấp hơn độ ưu tiên của tác vụ nhận được từ
hàng đợi. Điều này có nghĩa là hàng đợi không bao giờ được chứa nhiều hơn một mục bởi vì,
ngay khi dữ liệu được gửi đến hàng đợi, tác vụ nhận sẽ bỏ chặn, bỏ chặn trước gửi tác vụ và xóa
dữ liệu — để lại hàng đợi trống một lần nữa.

Thực hiện tác vụ ghi vào hàng đợi. Hai phiên bản của tác vụ này được tạo ra, một phiên bản ghi
liên tục giá trị 100 vào hàng đợi và một phiên bản khác ghi liên tục giá trị 200 vào cùng một hàng
đợi.

Trình tự thực hiện như hình bên dưới:


Kết quả:

2.2 Nhận dữ liệu từ nhiều nguồn khác nhau

Một hàng đợi được tạo để chứa các cấu trúc kiểu Data_t. Các thành viên cấu trúc cho phép cả giá trị dữ
liệu và kiểu liệt kê cho biết dữ liệu có nghĩa là gì để được gửi đến hàng đợi trong một thông báo.
T1 : Task sender1 thực thi gửi đi 3 dữ liệu

T2 : Queue đã đầy nên Task sender1 block, Task sender2 có ưu tiên cao nhất nên được thực thi

T3 : Task sender2 thấy Queue đã đầy nên Task sender2 block, Task receiver thực thi lấy 1 dữ liệu

T4 : Task sender1 và Task sender2 cùng mức ưu tiên nhưng Task sender1 đợi lâu hơn nên được thực thi
trước gửi 1 dữ liệu và block vì Queue đã đầy

T5 : Task receiver có mức ưu tiên cao nhất nên được thực thi và block.

T6 : Task sender1 và Task sender2 cùng mức ưu tiên nhưng Task sender2 đợi lâu hơn nên được thực thi
trước gửi 1 dữ liệu và block vì Queue đã đầy

T7 : Task receiver có mức ưu tiên cao nhất nên được thực thi và block.
Kết quả:

You might also like