Sola_Ex 2022-01-14 10:02:36 63 收藏 2
版权
vscode
专栏收录该内容
5 篇文章 0 订阅
订阅专栏
vscode+platformIO 开发 STM32
前言
FreeRTOS 的添加
STM32CubeMX 生成 FreeRTOS
移植 FreeRTOS 进入 PIO 工程下
头文件路径
程序移植
demo
前言
在有一个完整的, 可编译, 可下载, 可调试的单片机工程后, 是否还有用到 RTOS 的场景, RTOS 在嵌入式系统中占据重要地位, 太多的应使用裸机 + 状态机的方式, 即使当时能满足需求, 但后面需要修改裸机, 添加功能, 就真的很难了. 之前说过 PIO 本质上可以直接当作一个 makefile, 里面添加的东西几乎无异.
FreeRTOS 的添加
STM32CubeMX 生成 FreeRTOS
在一个 PIO 的工程里面添加 FreeRTOS 并不是一件难事, 更多是因为在 ST 的 Lib 里面有一个中间件, 它已经帮你做好了很多适配, 此处应该需要用到 STM32CubeMX.
FreeRTOS 的配置, 因人而已, 不同的项目有不一样的需求, 配置当然也不一样, 这里自由发挥.
最后选择生成的时候, 选择 makefile 的方式来生成.
移植 FreeRTOS 进入 PIO 工程下
生成好之后, 将 FreeRTOS 的内容复制到你的 PIO 工程下, 在 lib 指定的目录下即可
而我在这里新建了一个文件夹, 为的是存放 FreeRTOSConfig.h,FreeRTOS 几乎可以移植在所有平台上, porttable 里面存在支持很多类型的 MCU 文件, 不同 MCU 环境在 FreeRTOSConfig.h 上的配置也不一样, 这一点和 PIO 的. INI 环境很适配, 也就可以通过不同环境, 加入不同的 FreeRTOSConfig.h 的路径来执行不一样的配置编译.
头文件路径
万事俱备后, 就是在工程下加入头文件路径
程序移植
FreeRTOS 上使用的 Systick, 当然也需要在程序上一起配置, 由于使用了 HAL 库, 还会有 HAL 的 tick.
- void SysTick_Handler(void)
- {
- HAL_IncTick();
- #if (INCLUDE_xTaskGetSchedulerState == 1 )
- if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
- {
- #endif /* INCLUDE_xTaskGetSchedulerState */
- xPortSysTickHandler();
- #if (INCLUDE_xTaskGetSchedulerState == 1 )
- }
- #endif /* INCLUDE_xTaskGetSchedulerState */
- /* USER CODE BEGIN SysTick_IRQn 1 */
- /* USER CODE END SysTick_IRQn 1 */
- }
需要加入相关头文件
- #include "FreeRTOS.h"
- #include "task.h"
- #include "cmsis_os.h"
- demo
最后点灯?
- TaskHandle_t led_task_handler;
- void led_task(void *parg) {
- while(1) {
- hal_led_toggle();
- vTaskDelay(500);
- }
- }
- int main() {
- HAL_Init();
- SYSTEM_INTI(); // System Clock init
- xTaskCreate(led_task, "led", 1024, NULL, 1, &led_task_handler);
- osKernelStart();
- }
来源: https://blog.csdn.net/qq_42312125/article/details/122487239