FreeRTOS Counting Semaphore

Giống như binary semaphore có thể được coi là các hàng đợi (queue) có độ dài bằng một, counting semaphore có thể được coi là các queue có độ dài lớn hơn một. Nhắc lại rằng, người dùng semaphore không quan tâm đến dữ liệu lưu trữ trong queue mà chỉ muốn biết queue có trống (empty) hay không.

Counting semaphore thường được sử dụng cho hai mục đích là đếm sự kiện (counting events) và quản lý tài nguyên (resource management).

Đếm sự kiện

Trong kịch bản sử dụng này, trình xử lý sự kiện (event handler) sẽ ‘give’ một semaphore mỗi khi một sự kiện xảy ra (tăng giá trị đếm semaphore) và tác vụ xử lý (handler task) sẽ ‘take’ một semaphore mỗi khi nó xử lý một sự kiện (giảm giá trị đếm semaphore). Do đó, giá trị đếm là chênh lệch giữa số sự kiện đã xảy ra và số sự kiện đã được xử lý. Trong trường hợp này, giá trị đếm cần bằng 0 khi semaphore được tạo ra.

Quản lý nguồn tài nguyên

Trong kịch bản sử dụng này, giá trị đếm chỉ thị số lượng tài nguyên có sẵn. Để có được quyền điều khiển một tài nguyên (resource), trước tiên một task phải lấy được một semaphore – giảm giá trị đếm semaphore. Khi giá trị đếm về 0 thì không có tài nguyên nào tự do (free). Khi một task có tài nguyên kết thúc, nó sẽ ‘give’ semaphore – tăng giá trị đếm semaphore. Trong trường hợp này, người ta cần giá trị đếm bằng giá trị đếm tối đa khi semaphore được tạo.

Hãy xem phần Semaphore/Mutex trong tài liệu người dùng để biết danh sách các hàm API liên quan đến semaphore. Tìm kiếm các file trong folder FreeRTOS/Demo/Common/Minimal sẽ tiết lộ nhiều ví dụ về cách sử dụng. Lưu ý rằng interrupt KHÔNG được sử dụng các hàm API không kết thúc bằng “FromISR”.

Icons made by Freepik from www.flaticon.com