Chuyển đến nội dung chính

Chap 1: Task management (Quản lý Task).

Bài trước: Bắt đầu với FreeRTOS (Bài 2)
1 tháng rồi bận bịu quá nà.
Bài này sẽ tổng hợp lại những thứ cần chú ý ở trong Chap 1 cuốn "Using the freertos real time kernel"

Câu 1: Task là gì? và được tạo ra thế nào?
Task được hiểu nôm na như là 1 chương trình thực hiện 1 nhiệm vụ nào đó.
1 Task gồm có: tên, chức năng, giá trị ưu tiên, độ sâu stack, task handle (như kiểu cái móc để tác động ấy), biến tác động vào task.
Để tạo task thì đầu tiên phải định nghĩa chức năng của nó trước, cấu trúc hàm cơ bản như sau:

void ATaskFunction(void *pvParameters)
{
// Khởi tạo biến ở đây
for( ; ; )
{
// Chức năng thực hiện ở đây
}
}

Ví dụ:

void vTask1(void *pvParameters)
{
               const char *pcTaskName = "This is Task 1 \r\n";
               for ( ; ; )
{
vPrintString(pcTaskName);
}
}

Sau đó phải dùng hàm xTaskCreate() để khởi tạo Task; Khi gọi hàm này thì Task mới thực sự được tạo ra.

xTaskCreate(pvTaskCode, pcName, usStackDepth, pvParameters, uxPriority, pxCreatedTask);
pvTaskCode: là cái tên hàm chức năng của task được định nghĩa ở trên đó.
pcName: là tên ta đặt cho task.
usStackDepth: là giá trị số thanh gi Stack được cấp cho Task. Ví dụ: Stack 32 bit, ta đặt usStackDepth = 100 thì không gian Stack dành cho nó là 100*4 bytes.
pvParameters: Biến được truyền vào Task.
uxPriority: giá trị ưu tiên của Task.
pxCreatedTask: Như kiểu là cái tên định danh để ta có thể task động vào task. vd như khi thay đổi Priority của Task.
Ví dụ khởi tạo 1 Task:

xTaskCreate( vTask1, "Task1", 1000, NULL, 1, NULL);
Và có thể khởi tạo 1 Task trong 1 Task khác.

Câu 2: Task được hoạt động thế nào?

Trong 1 chương trình có nhiều Task thì tại 1 thời điểm, task nào có ưu tiên (Priority) cao hơn thì Task đó được hoạt động. mức ưu tiên cực đại là giá trị configMAX_PRIORITIES được định nghĩa trong file FreeRTOSConfig.h.
Task có 2 trạng thái chính là: Running và Not Running  ( chắc là ko phải giải thích cũng hiểu :D )
Not Running bao gồm các trạng thái: Ready (sẵn sàng chạy); Blocked (bị khóa); Suspended (lơ lửng: trạng thái này ít dùng).
Thời gian hoạt động (running) của 1 Task: được định nghĩa trong file FreeRTOSConfig.h và bằng
1/configTICK_RATE_HZ  (s). Thực ra thì đây là thời gian nếu Task hoạt động mà không bị dừng bởi các hàm như vTaskDelay(); vTaskDelayUntil(); vTaskDelete()...còn nếu gặp các hàm này thì Task sẽ bị dừng ngay lập tức.
Idle Task là 1 task mặc định được tạo ra khi gọi hàm vTaskStartScheduler(); Task này luôn có Priority bằng không và chỉ được gọi tới khi không có Task nào Running. Ta có thể thiết lập Task này để đưa trạng thái của hệ thống về dạng tiết kiệm năng lượng chẳng hạn.

Câu 3: các hàm đặc biệt và cần chú ý?

vTaskDelay( portTickType xTicksToDelay ); 
Hàm chuyển từ trạng thái Running sang Blocking
biến số xTicksToDelay: là số lượng Tick cần thiết để Task có thể chuyển sang trạng thái Ready. Thường thì đơn vị người ta cần tính toán là ms nên ta thường để biến số là  t/portTICK_RATE_MS với t là thời gian blocking tính theo mili giây. ( Xem thêm ở example004)

vTaskDelayUntil( portTickType * pxPreviousWakeTime, portTickType xTimeInCrement);
Cái này tương tự với hàm bên trên nhưng mà có tính chuẩn xác hơn (nói chung là mình chưa thấy khác nhau ở đâu cả, để nghiên cứu tiếp vậy ). pxPreviousWakeTime: là số Tick bắt đầu còn xTimeInCrement là số Tick để thoát khỏi block, và chúng ta dùng hàm xTaskGetTickCount(); để lấy số Tick hiện tại. (Xem thêm ở example005).

void vApplicationIdleHook( void );
Cái này để mình định nghĩa chức năng của Idle Task. khi mình cho công việc gì trong này thì khi mà Task Idle được gọi là nó sẽ thực hiện. Để sử dụng được chức năng này thì mình phải set giá trị configUSE_IDLE_HOOK bằng 1 trong file FreeRTOSConfig.h  (Xem thêm ở example007).

void vTaskPrioritySet ();
Set lại mức ưu tiên của 1 Task đã được tạo ra.
void uxTaskPriorityGet(); 
Lấy ra mức ưu tiên hiện tại của 1 Task nào đó. (Xem thêm ở example008)

void vTaskDelete();
Xóa 1 Task (Xem ở example009)

Câu 4: mẹo miếc gì không?

Khi tạo ra các Task thì chúng ta thường tạo ra các mức ưu tiên cho nó theo quy luật.
Task nào có tần suất xuất hiện nhiều thì có mức ưu tiên càng cao và ngược lại.
À mà có 1 lưu ý nhỏ: Khi các Task đang chạy mà gặp hàm delay 1 thời gian nào đó thì nó sẽ bị Block, sau khi hết thời gian Block nó sẽ tiếp tục chạy từ cái chỗ mà nó bị block chứ không phải chạy lại task đó từ đầu.

Có bấy nhiêu thôi :)) giờ ngâm cứu tiếp chap2 nào. TRY!


Bài tiếp: Chapter 2: Queue Management (Quản lý hàng đợi).

Nhận xét

  1. Cho mình hỏi chút là mấy cái (xem thêm ở example4, example5...) ở chỗ nào sao mình tìm từng bài mà chả có vậy, có example13 mà trước lại ko có

    Trả lờiXóa

Đăng nhận xét

Bài đăng phổ biến từ blog này

Bắt đầu với FreeRTOS (Bài 1)

NOTE: 1 vài tài liệu mình sử dụng trong bài này là mình sưu tầm được, có thể không có bản quyền, nếu tác giả không muốn đăng lên thì mình sẽ xóa. Trước khi tìm hiểu mọi người có thể biên dịch thử 1 chương trình để lấy khí thế tại  đây. FreeRTOS là 1 hệ điều hành nhúng phù hợp cho các ứng dụng có yêu cầu về thời gian thực 1 cách chặt chẽ. Và vì nó miễn phí, nhỏ gọn và có thể nhúng vào các dòng vi điều khiển thông thường như PIC, AVR, MSP430, ARM...nên mình làm hướng dẫn này cho những ai muốn bắt đầu tìm hiểu về FreeRTOS. Trang chủ của nó  http://www.freertos.org/ Đầu tiên là phải tải FreeRTOS về đã: vào  http://sourceforge.net/projects/freertos/files/   Click vào  Download FreeRTOSV7.5.2.exe (9.3 MB) (thời điểm này bản mới nhất là 7.5.2) để tải về. Sau khi tải về bạn click đúp vào file .exe ấy để giải nén. Ta được 1 folder FreeRTOSV7.5.2. Xong Bước 1  Tiếp theo là nên đọc 1 tài liệu để hiểu sơ qua xem RTOS nó là cái gì và nó hoạt động như thế nào: Các bạn lấy tài l

Chapter 3: Interrupt management (quản lý ngắt).

Bài trước: Chapter 2: Queue Management (Quản lý hàng đợi). Nối tiếp chương 2 về quản lý hàng đợi, hôm nay chúng ta sẽ tìm hiểu về quản lý ngắt. Ngắt là 1 thành phần cực kỳ quan trọng trong lập trình nhúng, nếu bạn đã học qua về vi điều khiển thì chắc không phải nói nhiều về cái này làm gì. Còn nếu chưa thì hiểu nôm na Ngắt là 1 sự kiện mà nó luôn được ưu tiên cao nhất, tức là khi sự kiện ngắt xảy ra thì tất cả mọi sự kiên khác đều phải dừng lại để ngắt thực hiện công việc của mình. Nhưng có 1 sự khác nhau ở ngắt trong FreeRTOS và ngắt thông thường ở chỗ: Khi ngắt thông thường xảy ra nó sẽ nhảy vào hàm ngắt và các công việc cần phải làm đều đặt trong hàm ngắt. Còn ở FreeRTOS thì khi ngắt xảy ra nó sẽ nhảy vào hàm thủ tục ngắt, hàm thủ tục ngắt lại phát đi 1 "tín hiệu" để hàm thực hiện chức năng của ngắt Unblocking và hàm này có Priority cao hơn tất cả các task khác nên nó sẽ thực hiện ngay lập tức. Tín hiệu ở đây chính là Semaphore, có 2 loại Semaphore là Binary Semaph