[其他ST产品] vscode+platformIO开发STM32

[复制链接]
972|7
 楼主| 狗啃模拟 发表于 2023-1-31 12:08 | 显示全部楼层 |阅读模式
前言
在有一个完整的、可编译、可下载、可调试的单片机工程后,是否还有用到RTOS的场景,RTOS在嵌入式系统中占据重要地位,太多的应使用裸机+状态机的方式,即使当时能满足需求,但后面需要修改裸机、添加功能,就真的很难了。之前说过PIO本质上可以直接当作一个makefile,里面添加的东西几乎无异。

FreeRTOS的添加
STM32CubeMX生成FreeRTOS
在一个PIO的工程里面添加FreeRTOS并不是一件难事,更多是因为在ST的Lib里面有一个中间件,它已经帮你做好了很多适配,此处应该需要用到STM32CubeMX。 4308463d89435e47e4.png

 楼主| 狗啃模拟 发表于 2023-1-31 12:12 | 显示全部楼层
FreeRTOS的配置,因人而已,不同的项目有不一样的需求,配置当然也不一样,这里自由发挥。 4177063d8950b53201.png 最后选择生成的时候,选择makefile的方式来生成。
 楼主| 狗啃模拟 发表于 2023-1-31 12:20 | 显示全部楼层
移植FreeRTOS进入PIO工程下
生成好之后,将FreeRTOS的内容复制到你的PIO工程下,在lib指定的目录下即可
5620863d897260da91.png
 楼主| 狗啃模拟 发表于 2023-1-31 12:21 | 显示全部楼层
而我在这里新建了一个文件夹,为的是存放FreeRTOSConfig.h,FreeRTOS几乎可以移植在所有平台上,porttable里面存在支持很多类型的MCU文件,不同MCU环境在FreeRTOSConfig.h上的配置也不一样,这一点和PIO的.ini环境很适配,也就可以通过不同环境,加入不同的FreeRTOSConfig.h的路径来执行不一样的配置编译。
4128263d89734ec730.png
 楼主| 狗啃模拟 发表于 2023-1-31 12:21 | 显示全部楼层
头文件路径
万事俱备后,就是在工程下加入头文件路径
2789563d8974f93c26.png
 楼主| 狗啃模拟 发表于 2023-1-31 12:22 | 显示全部楼层
程序移植
FreeRTOS上使用的Systick,当然也需要在程序上一起配置,由于使用了HAL库,还会有HAL的tick。
  1. void SysTick_Handler(void)
  2. {
  3.     HAL_IncTick();

  4. #if (INCLUDE_xTaskGetSchedulerState == 1 )
  5.   if (xTaskGetSchedulerState() != taskSCHEDULER_NOT_STARTED)
  6.   {
  7. #endif /* INCLUDE_xTaskGetSchedulerState */
  8.   xPortSysTickHandler();
  9. #if (INCLUDE_xTaskGetSchedulerState == 1 )
  10.   }
  11. #endif /* INCLUDE_xTaskGetSchedulerState */
  12.   /* USER CODE BEGIN SysTick_IRQn 1 */

  13.   /* USER CODE END SysTick_IRQn 1 */
  14. }
 楼主| 狗啃模拟 发表于 2023-1-31 15:46 | 显示全部楼层
需要加入相关头文件
  1. #include "FreeRTOS.h"
  2. #include "task.h"
  3. #include "cmsis_os.h"
 楼主| 狗啃模拟 发表于 2023-1-31 15:47 | 显示全部楼层
demo
最后点灯?
  1. TaskHandle_t led_task_handler;

  2. void led_task(void *parg) {

  3.     while(1) {
  4.       hal_led_toggle();
  5.       vTaskDelay(500);
  6.     }
  7. }

  8. int main() {

  9.         HAL_Init();

  10.     SYSTEM_INTI(); // System Clock init
  11.        
  12.         xTaskCreate(led_task, "led", 1024, NULL, 1, &led_task_handler);
  13.        
  14.         osKernelStart();
  15. }
您需要登录后才可以回帖 登录 | 注册

本版积分规则

68

主题

1054

帖子

2

粉丝
快速回复 在线客服 返回列表 返回顶部