Tải bản đầy đủ (.docx) (13 trang)

FreeRTOS STM32CubeMX dùng tạo một tác vụ

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (614.27 KB, 13 trang )

Cuongbab
bo

Tạo project FREERTOS GPIO với Cubemx

Loạt này ghi chú tổng cộng bảy, là nghiên cứu cá nhân của tôi FreeRTOS ghi chú
thực nghiệm. Viết ghi chú trong quá trình học tập có một số lợi thế: Thứ nhất, bạn
có thể hiểu sâu hơn về FreeRTOS, thứ hai là làm cho việc học tập cảm giác hoàn
thành.
Ghi chú có thể được dùng làm bằng chứng về sự tiến bộ và dự trữ tri thức của họ,
tất nhiên, không ai kiểm tra được chìa khoá là họ thực sự có nhiều lợi ích hơn. Khi
tôi bắt đầu học FreeRTOS, tôi đã lên kế hoạch tổ chức các ghi chú của tôi và tải lên
trực tuyến, hy vọng giúp những người mới bắt đầu. Vì
Đối với quá trình học tập của tôi cũng rất phụ thuộc vào tài nguyên mạng.
Trước khi tôi học FreeRTOS, tôi đã học được về μ C / OS II và cũng đã tải lên một
số lưu ý nghiên cứu. Hai hệ thống rất giống nhau, là RTOS mã nguồn mở, nhưng
một là miễn phí, và một là phí.

2.

Nội dung chính của ghi chú là để tìm hiểu các cơ chế giao tiếp FreeRTOS khác
nhau. Cấu trúc của các ghi chú rất đơn giản, nghĩa là, thông qua một ví dụ đơn giản
để chứng minh việc sử dụng các cơ chế truyền thông FreeRTOS khác nhau. Sau khi
nghiên cứu lưu ý này, bạn có thể thực hiện như sau:
1. Hiểu được cấu trúc cơ bản của chương trình FreeRTOS;
Hiểu và áp dụng các semaphores, hàng đợi tin nhắn, hàng đợi mail và các kiến
thức liên quan khác.
Lưu ý đặc biệt:
Chú ý này để STM32 như là một nền tảng, bất kỳ nền tảng STM32 có thể được. Tất
cả các thói quen chỉ sử dụng các tài nguyên phần cứng đơn giản: tài nguyên hệ
thống nhỏ nhất, đầu ra LED, đầu ra UART.


Để dễ phát triển, các thói quen của lưu ý này đều được tạo ra bằng cách sử dụng
cấu hình STM32Cube và chỉ cần thêm mã rất ít. Nếu bạn không quen thuộc với
việc sử dụng STM32Cube, nó không quan trọng. Chỉ cần tải về và cài đặt
STM32CubeMX và gói hỗ trợ chip tương ứng, và sau đó làm theo các bước của các
ghi chú có thể được, ghi chú đã không bỏ qua bất kỳ bước.
Để tìm hiểu STM32Cube, hãy truy cập ST Community Forums
và tìm kiếm
STM32Cube, bạn có thể xem các bài viết có liên quan. Mà chi tiết hơn và toàn diện
được xuất bản bởi các bài viết điện tử vi tuyết.

Tài liệu tham khảo quan trọng:
Hướng dẫn về tiện ích hạt nhân thời gian thực FreeRTOS .pdf (dịch và chia sẻ bởi
Zou Changjun) khuyên người học đọc tài liệu này một cách trực tiếp, do Richard
Barry dịch tác trong năm 2009 của tác giả FreeRTOS.
Tất nhiên, thông tin mới nhất và chi tiết nhất được đăng trên trang web chính thức
www.freertos.org. Do mức độ hạn chế của tôi, những sai lầm là không thể tránh
khỏi, xin vui lòng chính xác tôi, cảm ơn bạn!


FreeRTOS : Tạo một tác vụ
Điều kiện tiên quyết: Mặc định đã được cài đặt MDK V5 và STM32CubeMX, và cài đặt các gói hỗ
trợ STM32F1xx. Phần cứng nền tảng: STM32F1xx series.
Mục đích: Để tìm hiểu việc tạo tác vụ FreeRTOS.
Tạo nhiệm vụ là một bước cần thiết để sử dụng FreeRTOS và bài viết này mô tả bằng ví dụ về
cách sử dụng cấu hình STM32CubeMX để tạo ra
Nhiệm vụ FreeRTOS. Ví dụ trong bài viết này tạo ra hai nhiệm vụ, mỗi trong số đó kiểm soát nhấp
nháy của một đèn LED.
Bước 1. Mở STM32CubeMX, nhấn "New Project", chọn mô hình chip, STM32F103RBTx.

Bước 2. Cấu hình pin đồng hồ。



Bước 3. Cấu hình PA8 và PD2 như Output, và thay đổi nhãn người dùng thành LED0 và LED1 tương
ứng


Step4. cho phép FreeRTOS。

Bước 5. Cấu hình cây đồng hồ. Khi 8M là đầu vào, có được đồng hồ nội bộ 72M qua PLL。

Bước 6: Cấu hìnhFreeRTOS。

Config tab tham số là các thông số cấu hình, trong đó liệt kê các tham số cấu hình FreeRTOS, tương ứng với
FreeRTOSConfig.h
Các tham số cấu hình trong tệp tin。


Các thông số của thẻ Include parameters được sử dụng để cấu hình FreeRTOS trên cây trồng。


Công việc và Hàng đợi để thêm nhiệm vụ và hàng đợi.
Cấu hình mặc định của một tác vụ được gọi là defaultTask, mức độ ưu tiên của nó là bình thường,
kích thước stack tác vụ là 128 từ, tên hàm nhiệm vụ
StartDefaultTask.

Nhấp đúp vào khu vực màu xanh dương, hộp thoại bật lên, tên tác vụ được sửa đổi thành
Task_LED0, tên chức năng tác vụ được sửa đổi thành Func_LED0。

Nhấp vào nút Thêm để thêm một nhiệm vụ Task_LED1, mức độ ưu tiên được đặt thành Bình
thường, tên chức năng là Func_LED1

Cần lưu ý rằng, STM32Cube FreeRTOS đã thực hiện một số thay đổi, chẳng hạn như ưu tiên chỉ
có bảy, như được hiển thị bên dưới.



bộ đếm thời gian và Semaphores là các tùy chọn để thêm phần mềm hẹn giờ và semaphores.
Lưu ý: Trong bước này, ngoại trừ thêm công việc, các mục khác sử dụng các thông số mặc định.

Bước 7. Tạo mã.
Điều này sẽ bật lên một cảnh báo. Lý do là FreeRTSO sử dụng Systick làm tick đồng hồ, và thư
viện HAL cũng sử dụng Systick làm tham chiếu đồng hồ cho HAL_Delay () và thời gian chờ
khác nhau. Vì vậy, bạn cần phải thay đổi tham chiếu đồng hồ của HAL với TIMER khác. Nói
chung
sử
dụng
một
bộ
đếm
thời
gian

bản.


Nhấp vào nút "Không", sau đó chọn nguồn của TIM4 trong trang Cài đặt Pinout

Nhấp vào nút tạo mã nữa, và mở dự án trực tiếp sau khi kết thúc.

Cấu trúc cơ bản của dự án như được hiển thị dưới đây, mà những người dùng có thể sửa đổi các tệp Nhóm
Ứng dụng / Người dùng và các nhóm khác của tệp nói chung không bị sửa đổi.



Bước 8. Phân tích cấu trúc chương trình.
Trước khi nhập hàm chính, chúng ta định nghĩa hai biến và khai báo một số hàm

Nhìn vào chức năng chính. Sắp xếp các chức năng chính, xóa rất nhiều ý kiến, nhận được các nội dung
hiển thị dưới đây.

Phần thứ nhất là cấu hình phần cứng, phần thứ hai, tạo ra hai chủ đề (hoặc nhiệm vụ), phần thứ ba, bắt
đầu lên lịch. Đây là cấu trúc cơ bản của chương trình.
Sau khi bắt đầu lên lịch, chương trình được quản lý bởi bộ lập lịch FreeRTOS và sẽ thực hiện hai nhiệm
vụ đã được tạo ra
Func_LED0 và Func_LED1, phần sau trong khi (1) sẽ không được thực hiện.
Bước 9. Thêm mã.
Trong tệp main.c, tìm cấu hình trước để thêm hai hàm nhiệm vụ, Func_LED0 và Func_LED1, và sau đó
thêm mã điều khiển LED0 và LED1 bên trong


Cuongba
bbo

Bước 10. Biên dịch và tải về chạy. LED0 và LED1 nhấp nháy tương ứng, chu kỳ nhấp nháy LED0 là 1 giây và chu
kỳ LED1 là 2 giây.
Chương trình Phân tích:
1. Phân tích các tuyên bố: osThreadDef (Task_LED0, Func_LED0, osPriorityNormal, 0, 128),
osThreadDef (...) không phải là một chức năng, nhưng một vĩ mô.
Định nghĩa của nó trong tập tin cmsis_os.h, vai trò là để xác định một cấu trúc
osThreadDef_t

Trong tệp cmsis_os.h, cấu trúc osThreadDef_t được định nghĩa như sau:


Vì vậy, osThreadDef (Task_LED0, Func_LED0, osPriorityNormal, 0,
128), kết quả là const osThreadDef_t os_thread_def_Task_LED0 =
{Task_LED0, (Func_LED0), (osPriorityNormal), (0), (128)};
Nghĩa là, một cấu trúc osThreadDef_t có tên
os_thread_def_Task_LED0 được định nghĩa và gán cho mỗi biến thành
viên.
Phân tích câu: Task_LED0Handle = osThreadCreate (osThread (Task_LED0), NULL);
Tương tự, osThread (...) là một định nghĩa macro có thể được
tìm thấy trong tệp cmsis_os.h

Kết quả của việc mở rộng osThread (Task_LED0) là & os_thread_def_ Task_LED0. Vì vậy,
Task_LED0Handle = osThreadCreate (osThread (Task_LED0), NULL); Mở rộng
Kết quả là Task_LED0Handle = osThreadCreate (&
os_thread_def_Task_LED0, NULL);
Vì vậy, phân tích trên của hai câu, quá trình là để xác định một biến cấu trúc, và sau đó vượt qua cấu trúc
như một tham số
osThreadCreate () để tạo ra một tác vụ.

3. Phân tích hàm osThreadCreate ().


Cuongbab
bo

Xem nguồn, bạn có thể thấy rằng chức năng này thực sự gọi hàm xTaskCreate (), đây là API FreeRTOS bản địa
Chức năng.
STM32CubeMX kỹ sư dựa trên giao diện CMSIC tiêu chuẩn API FreeRTOS API của gói thứ hai, do đó người
dùng phát triển dễ dàng hơn. Giao diện chức năng đóng gói được đặt trong tệp cmsis_os.h.
Trong thực tế, trong quá trình phát triển, bạn không cần phải mở rộng chức năng hoặc định nghĩa macro để phân

tích chi tiết như quy trình phân tích ở trên. Chúng ta biết ý nghĩa của mỗi tham số giao diện, và sẽ sử dụng giao diện
trên đường dây.

Nội dung bổ sung: Chiến lược lập kế hoạch nhiệm vụ FreeRTOS
Trong trường hợp của chúng tôi, hai chức năng nhiệm vụ là Func_LED0 và Func_LED1 mất rất ít thời gian để thực
sự tiêu thụ CPU. Sau khi gọi hàm osDelay (), chúng bị chặn và họ đang đợi sự kiện "Timing to". Trong nhiệm vụ
của người dùng vào trạng thái bị chặn, hoạt động là nhàn rỗi công việc. Các tác vụ nhàn rỗi được tạo tự động khi
chương trình lập lịch được bắt đầu.
Trong trường hợp này, ưu tiên của cả hai nhiệm vụ là như nhau, cả hai osPriorityNormal. Tuy nhiên, do chức năng
gọi hàm osDelay (), chúng thoát ra khỏi CPU khi chúng vào trạng thái bị chặn. Vì vậy, cả hai nhiệm vụ xuất hiện để
được thực hiện song song.
Nếu ưu tiên của một trong các nhiệm vụ được thiết lập để osPriorityLow hoặc osPriorityHigh, do đó các ưu tiên của
hai nhiệm vụ là khác nhau, điều gì sẽ xảy ra? Kết quả là nó chạy tương tự như nó song song.
Chúng ta đều biết rằng nếu hai nhiệm vụ đã sẵn sàng có những ưu tiên khác nhau thì các nhiệm vụ ưu tiên cao nhất
sẽ được chạy. Vì vậy, nếu hai nhiệm vụ đã sẵn sàng có cùng mức độ ưu tiên và luôn sẵn sàng, nó hoạt động như thế
nào trong FreeRTOS? Sau đây sẽ kiểm tra hoạt động của nó bằng thử nghiệm.
Viết một chức năng trì hoãn thực hiện cho vòng lặp。

Sau đó, thay thế các osDelay () chức năng chức năng ban đầu trong công việc của bạn. Theo cách này, cả hai nhiệm
vụ sẽ luôn hoạt động vì họ "luôn có điều gì đó để làm".


a) Nếu hai nhiệm vụ có những ưu tiên khác nhau, kết quả là: Chỉ các nhiệm vụ ưu tiên cao mới được
chạy. b) Nếu hai nhiệm vụ có cùng mức độ ưu tiên, kết quả là: Cả hai tác vụ đều được chạy, nhưng đèn
LED nhấp nháy thường xuyên hơn
Thấp khi chạy một mình. Theo mã trên, cả hai nhiệm vụ gọi my_delay (500), kết quả là tần số flicker
LED giảm xuống một nửa, tương đương với my_delay (1000) của một thời gian chạy tác vụ đơn.
Từ b), FreeRTOS phân bổ thời gian CPU tương tự cho các nhiệm vụ có cùng mức độ ưu tiên của nhiệm
vụ, nghĩa là các nhiệm vụ lần lượt thực hiện cùng một slice thời gian.




×