Professional Documents
Culture Documents
E.G:
xTaskCreate(vBlueLedControlerTask,
"Blue Led Controller",
100,
NULL,
1,
NULL;
NOTE: Các task có nhiệm vụ giống nhau thì chỉ cần thay đổi cái
Parameter truyền vào khi gọi hàm xTaskCreate.
E.G:
void vLedControlerTask(void* pvParameters)
{
while (1)
{
.....
}
}
xTaskCreate(vLedControlerTask,
"Blue Led Controller",
100,
(void*)Blue,
1,
NULL;
xTaskCreate(vLedControlerTask,
"Green Led Controller",
100,
(void*)Green,
1,
NULL;
...
while (1)
{
countBlue++;
vTaskDelayUntil(&xLastWakeTime, xPeriod); /*xLastWakeTime
sẽ được cập nhật ở đây nên đảm bảo Task thực hiện định kỳ
đúng 500ms*/
}
}
- Idle là Task được tạo tự động, không cần tự tạo lại như các Task khác.
void vApplicationIdleHook(void)
{
while (1)
{
countIdle++; /*Code trong đây*/
}
}
B. Queue and Queueset Management (include “queue.h”)
Trong đó:
uxQueueLength: là độ dài của hàng đợi, tức là số lượng phần tử mà hàng
đợi có thể chứa. Tham số này không phải là kích thước dữ liệu mà hàng
đợi sẽ chứa, mà là số lượng phần tử.
uxItemSize: là kích thước của mỗi phần tử trong hàng đợi, tính bằng
byte. Tham số này xác định kích thước của dữ liệu mà mỗi phần tử trong
hàng đợi có thể chứa.
Hàm xQueueCreate() trả về một con trỏ kiểu `QueueHandle_t` đến hàng đợi
được tạo.
E.G:
QueueHandle_t xQueue;
xQueue = xQueueCreate(10, sizeof(uint32_t));
5. xQueueAddToSet()
Hàm `xQueueAddToSet()` được sử dụng để thêm một hàng đợi hoặc semaphore vào
một tập hợp hàng đợi trước đó đã được tạo bằng cách gọi hàm
`xQueueCreateSet()`.
Nguyên mẫu:
BaseType_t xQueueAddToSet(QueueSetMemberHandle_t xQueueOrSemaphore,
QueueSetHandle_t xQueueSet);
Mô tả:
xQueueOrSemaphore: là handle của hàng đợi hoặc semaphore mà bạn muốn
thêm vào tập hợp hàng đợi. Đối số này được chuyển đổi sang kiểu
`QueueSetMemberHandle_t`.
xQueueSet: là handle của tập hợp hàng đợi mà bạn muốn thêm hàng đợi
hoặc semaphore vào.
Hàm `xQueueAddToSet()` trả về `pdPASS` nếu hàng đợi hoặc semaphore được
thêm vào tập hợp hàng đợi thành công. Trong trường hợp hàng đợi đã là thành
viên của một tập hợp hàng đợi khác, hàm trả về `pdFAIL`.
Lưu ý: Để sử dụng được hàm `xQueueAddToSet()`, cần phải thiết lập
`configUSE_QUEUE_SETS` thành 1 trong tệp `FreeRTOSConfig.h`.
E.G:
/*Add two queues to queue set*/
xQueueAddToSet (xQueue1,xQueueSet); /*Add xQueue1 to queue set*/
xQueueAddToSet (xQueue2,xQueueSet); /*Add xQueue2 to queue set*/
6. xQueueSelectFromSet()
Hàm `xQueueSelectFromSet()` trong FreeRTOS có tác dụng chờ đợi và lựa chọn
một hoặc nhiều queues hoặc semaphores từ một set (Queue Set) đã được chỉ
định.
Cụ thể, hàm này thường được sử dụng trong các tác vụ (tasks) để chờ đợi
trên một nhóm queues hoặc semaphores. Khi một trong các queues hoặc
semaphores trong set trở thành sẵn sàng (ví dụ như có dữ liệu mới được gửi
vào queue), hàm `xQueueSelectFromSet()` sẽ trả về một handle (tham chiếu)
tới queue hoặc semaphore đó, cho phép tác vụ tiếp tục xử lý dữ liệu từ đó.
Điểm quan trọng là hàm này cho phép tác vụ chờ đợi trên nhiều nguồn (queues
hoặc semaphores) một cách hiệu quả, không cần phải sử dụng nhiều hàm chờ
đợi riêng lẻ.
QueueHandle_t xQueueSelectFromSet(QueueSetHandle_t xQueueSet,
TickType_t xTicksToWait);
xQueueSet: Đây là handle của Queue Set mà bạn muốn chờ đợi và lựa chọn
các queues hoặc semaphores từ đó.
xTicksToWait: Đây là thời gian mà tác vụ sẽ chờ đợi trước khi hủy bỏ
hoạt động chờ đợi. Bạn có thể sử dụng `portMAX_DELAY` để chờ đợi vô
thời hạn.
Hàm này trả về handle của queue hoặc semaphore đầu tiên trong set mà đã sẵn
sàng, hoặc NULL nếu đã hết thời gian chờ đợi mà không có queue hoặc
semaphore nào sẵn sàng.
E.G:
QueueHandle_t xQueueThatContainsData;
xQueueThatContainsData = xQueueSelectFromSet(xQueueSet,portMAX_DELAY);
xQueueReceive(xQueueThatContainsData,&pcReceivedString,0);
NOTE: Khi sử dụng hàm này, bạn cần kiểm tra kết quả trả về xem semaphore đã
được tạo thành công hay không, bằng cách kiểm tra xem giá trị trả về có là
NULL hay không.
2. xSemaphoreGive
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );
- Hàm này được sử dụng để "give" (trả lại) một semaphore, tăng giá trị
của semaphore đó. Nếu có các task đang chờ semaphore, nó sẽ cho phép
task đầu tiên trong hàng đợi tiếp tục thực hiện, và semaphore sẽ được
giảm đi một.
- Trong ngữ cảnh của semaphore nhị phân, việc gọi hàm này sẽ đặt
semaphore về giá trị 1, cho phép một task khác đang chờ (nếu có) thực
hiện tiếp.
- Giá trị trả về của hàm là pdTRUE nếu semaphore đã được "give", và
pdFALSE nếu không thể "give" semaphore (thường xảy ra khi semaphore
không tồn tại hoặc không hợp lệ).
- Cần gọi hàm xSemaphoreGive() đầu tiên trong 1 Task nào đó (Viết ngoài
while) do mặc định ban đầu Semaphone có giá trị = 0.
3. xSemaphoreGiveFromISR
BaseType_t xSemaphoreGiveFromISR(
SemaphoreHandle_t xSemaphore,
BaseType_t *pxHigherPriorityTaskWoken
);
Trong đó:
- xSemaphore: Semaphore handle, được tạo và trả về bởi hàm
`xSemaphoreCreateBinary()` hoặc `xSemaphoreCreateCounting()`.
- pxHigherPriorityTaskWoken: Con trỏ tới một biến kiểu `BaseType_t` được
sử dụng để đánh dấu xem một task với mức độ ưu tiên cao hơn đã được thức
tỉnh trong ISR hay không. Nếu một task với mức độ ưu tiên cao hơn cần được
thức tỉnh, biến này sẽ được đặt thành `pdTRUE`; ngược lại, nếu không có
task nào cần được thức tỉnh, biến này sẽ được đặt thành `pdFALSE`.
Return:
- pdPASS: Nếu Semaphore đã được trả lại thành công từ một ISR.
- errQUEUE_FULL: Nếu Semaphore đã đạt đến giá trị tối đa và không thể
được trả lại.
III. MUTEX
- Enable: configUSE_MUTEXES in FreeRTOSConfig.h
1. xSemaphoreCreateMutex
SemaphoreHandle_t xSemaphoreCreateMutex(void);
Return:
- Semaphore handle: Thành công.
- NULL: Nếu không thể tạo Semaphore.
Hàm `xSemaphoreCreateMutex` được sử dụng để tạo một Semaphore kiểu mutex
(mutex Semaphore) trong FreeRTOS. Mutex Semaphore là một loại Semaphore đặc
biệt được sử dụng để đảm bảo đồng bộ hóa truy cập vào tài nguyên chia sẻ
giữa các task. Semaphore kiểu mutex chỉ cho phép một task có quyền truy cập
vào tài nguyên vào một thời điểm. Nếu một task đã lấy Semaphore mutex, thì
task khác cần phải chờ đến khi Semaphore được trả lại hoặc giải phóng trước
khi nó có thể lấy Semaphore được.