Sử Dụng RTOS (phần 2) - Lẩu Bugs
Trong phần trước, chúng ta đã tìm hiểu RTOS là gì, phần này chúng ta sẽ cùng tìm hiểu sử dụng FreeRTOS như thế nào nhé! Cụ thể bài này sẽ thực hiện cụ thể với keil C – stm32f4.
Trước tiên các bạn cần tải thư viện RTOS từ trang chủ RTOS: https://www.freertos.org/
Sau khi tải về và giải nén sẽ được như Hình 1

Thư mục FreeRTOS là thư mục chứ thư viện FreeRTOS cơ bản cho gần như mọi loại chip.Thư mục FreeRTOS – Plus là thư mục chứa thư viện FreeRTOS nâng cao như UDP/IP, FAT cũng hỗ trợ hầu hết cho mọi loại chip.
Bên trong thư mục FreeRTOS như sau:

Thư mục Demo là thư mục chứa các ví dụ mẫu về RTOS dành cho hầu hết mọi loại chip từ PIC, AVR, STM8/32, MSP430 .v..v..Thư mục Source là thư mục chứa các file lõi để chạy RTOS, Sau đây tôi sẽ hướng dẫn cách sử dụng các file lõi của RTOS qua ví dụ về RTOS trên chip STM32 với trình biên dịch Keil C V5.

Để sử dụng được FreeRTOS cần thêm vào project các file sau:1). croutine.c2). list.c3). queue.c4). task.c5). timers.c6). port.c7). heap1/2/3/4/5.c (trong thư mục ..\Source\portable\MemMang)
Trong đó có 2 file đặc biệt đó là file port.c và file heap_x.c+ File port.c là file liên lạc giữa phần cứng và freeRTOS, đồng nghĩa rằng với mỗi loại chip khác nhau sẽ sử dụng những file port khác nhau. Để lấy được file port tương ứng với loại chip mình cần thì vào thư mục ..\Source\portable và tìm kiếm thư mục tương ứng với dòng chip của bạn. Trường hợp này tôi sử dụng stm32F4 với trình biên dịch keilC thì tôi vào thư mục ..\Source\portable\RVDS\ARM_CM4F\.+ File heap_x.c: Đây là file tổ chức bộ nhớ heap của hệ thống, trong hệ điều hành rtos sẽ có nhiều task hoạt động song song, mỗi task có 1 vùng nhớ riêng và đều được quản lý bởi file heap_x.c, có tổng cộng 5 file heap_x, từ heap_1.c đến heap_5.c, Việc chọn đúng file heap_x rất quan trọng vì chọn sai có thể dẫn đến ứng dụng của bạn không chạy được.1). heap_1.c : File này quản lý bộ nhớ ở dạng rất đơn giản và nhẹ, nhưng việc cấp phát bộ nhớ sẽ không thể giải phóng được.2). heap_2.c : File này quản lý bộ nhớ dạng phức tạp hơn 1 chút, các biến được cấp phát có thể free(giải phóng) được. Tuy nhiên các vùng nhớ sau khi giải phóng sẽ tạo ra các vùng trống (vùng phân mảnh) trong bộ nhớ và file này không hỗ trợ việc dồn các vùng nhớ lại liền kề nhau (chống phân mảnh vùng nhớ).3). heap_3.c: File này quản lý bộ nhớ và cho phép malloc() và free(). [heap_1.c và heap_2.c] không hỗ trợ malloc() và free().4). heap_4.c: File này quản lý bộ nhớ, cho phép chống phân mảnh vùng nhớ, Cho phép cấp phát bộ nhớ theo địa chỉ tương đối.5). heap_5. File này cũng giống heap_4. Nhưng cho phép cấp phát vùng nhớ theo các địa chỉ không liền kề.Nếu không có việc cấp phát động bộ nhớ thì chỉ cần sử dụng heap_1.c là ok, nếu có sử dụng cấp phát động với số ít lần thì nên sử dụng heap_2.c, và nếu phải cấp phát động nhiều thì nên dùng heap_3.c trở lên.
Bắt đầu cấu hình RTOS
Việc cấu hình RTOS được thực hiện lần lượt như sau:+ Mở vào file FreeRTOSConfig.h-> Kiểm tra define configCPU_CLOCK_HZ, nếu chưa có gì thì thêm vào ( SystemCoreClock ). Đây là định nghĩa tần số chip hoạt động.-> define configTOTAL_HEAP_SIZE: Đây là heap size của rtos, bạn muốn to hay nhỏ thì đặt vào 1 số tùy ý bạn.-> Kiểm tra nếu chưa có đoạn #define như dưới này thì thêm vào #define vPortSVCHandler SVC_Handler#define xPortPendSVHandler PendSV_Handler#define xPortSysTickHandler SysTick_HandlerBa #define bên trên là define 3 ngắt của stm32 để phục việc chạy nhân RTOS.
Học qua ví dụ
Tôi có 1 ví dụ như sau, tôi có 2 led gọi là led1 và led2. Tôi cần nháy 2 led này với tần số khác nhau, Led1 cứ 500ms thì đảo trạng thái 1 lần, còn Led2 cứ 300ms thì đảo trạng thái 1 lần. Do đó tôi tạo ra 2 Task chạy song song, Task1 là TaskBlinkLed1, và Task2 là TaskBlinkLed2. Code sẽ như bên dưới.
// RTOS include "FreeRTOS.h" include "task.h" include "FreeRTOSConfig.h" include "semphr.h" include "Timers.h" /* -----------------------START OF MAIN FUNCTION ------------------------------------*/ static void TaskBlinkLed1(void *pvParameters); static void TaskBlinkLed2(void *pvParameters); int main() { xTaskCreate(TaskBlinkLed1, (signed char)"TaskModbusPoll", 2000, NULL, 4, NULL)); xTaskCreate(TaskBlinkLed2, (signed char)"TaskModbusPoll", 2000, NULL, 4, NULL)); vTaskStartScheduler(); } static void TaskBlinkLed1(void *pvParameters) { for(;;) { Led1Toggle(); vTaskDelay(500); } } // static void TaskBlinkLed2(void *pvParameters) { for(;;) { Led2Toggle(); vTaskDelay(300); } } //Hàm xTaskCreate dùng để khởi tạo 1 Task+ Tham số đầu tiên là tên Task (tên hàm) muốn chạy, tham số thứ 2 là tên do người dùng đặt cho cái task đấy.+ Tham số thứ 3 là size hay gọi là Depth của Task, Đơn vị của nó không phải là 1 byte mà là 4byte. tức nếu mình đặt là 1000 thì sẽ tương ứng với Task size = 4000 byte. Tham số này sẽ khác nếu sử dụng chip khác. + Tham số thứ 4 là 1 con trỏ dùng để chứa các tham số của Task khi task còn hoạt động, Tôi thường để NULL.+ Tham số thứ 5: là độ ưu tiên của task này, số càng lớn thì độ ưu tiên càng lớn.+ Tham số thứ 6: là 1 con trỏ đại diện Task, dùng để điểu khiển task từ 1 task khác, ví dụ xóa task này từ 1 task đang chạy khác.
Hàm vTaskStartScheduler() dùng để yêu cầu nhân (kernel) của RTOS bắt đầu chạy RTOS. Lúc này hệ thống mới thực sự chạy.
Hàm static void TaskBlinkLed1/2(void *pvParameters), trong hàm này có 1 vòng lặp vô hạn, và việc Blink led diễn ra trong đó. Hai hàm blink led1 và blink led 2 không hề có kết nối gì với nhau và lặp vòng kín vô tận nhưng do dùng RTOS nên vẫn hoạt động bình thường và song song.
Trong vòng lặp vô hạn của RTOS lúc nào cũng phải có hàm vTaskDelay(). Hàm này dùng để delay theo đơn vị millis. Tuy là delay nhưng rất quan trọng và không thể thiếu. Nếu 1 Task lặp vô tận mà không có delay thì các task khác sẽ không thể chạy được. Vì chính lúc delay đó thì chính là thời điểm để các task khác chạy. 😀
See, sử dụng RTOS rất là đơn giản thôi !Mình có code mẫu RTOS của stm32F4 ở link này
Trong các phần sau mình sẽ hướng dẫn sử dụng cấp phát động, ngắt ngoại vi, tuần tự trong RTOS.
Cảm ơn mọi người đã theo giỏi, thấy hay thì không ngại share nhé !
Phần 1 Phần 3 Phần 4 Phần 5Đánh giá:
Chia sẻ:
- X
Có liên quan
Từ khóa » Học Rtos
-
Học RTOS Cơ Bản | Học ARM
-
RTOS Cơ Bản Phần 1 | Học ARM
-
Tổng Quan Về RTOS - DevIOT
-
[Khóa Học Lập Trình RTOS Với STM32] - Bài 1 - YouTube
-
Tổng Quan Về Hệ điều Hành Thời Gian Thực RTOS - Khuê Nguyễn
-
Hệ điều Hành RTOS - TAPIT
-
Học ARM - RTOS, FreeRTOS, RTOS đi Khắp Muôn Nơi :D Trong...
-
What Is Azure RTOS ThreadX? | Microsoft Docs
-
Systematically Testing A Real-time Operating System - IEEE Xplore
-
Học FreeRTOS, P1 - Tamgiang
-
Hệ điều Hành RTOS Là Gì? Có Gì Nổi Bật? RTOS Hỗ Trợ Trên Thiết Bị ...
-
RTOS BASED SECURE SHORTEST PATH ROUTING ALGORITHM ...