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í.
Trang 1Tạ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í.
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;
2 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
http://www.stmcu.org/module/forum/forum.php 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!
Cuongbab
bo
Trang 2FreeRTOS : 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ồ。
Trang 3Bướ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
Trang 4Step4 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。
Trang 5Các thông số của thẻ Include parameters được sử dụng để cấu hình FreeRTOS trên cây trồng。
Trang 6Cô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.
Trang 8bộ đế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
Trang 9Nhấ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
Trang 10Bướ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
Trang 11bbo
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 ()
Trang 12Xem 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"
Cuongbab
bo
Trang 13a) 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