STM32CubeIDE(CUBE-MX)----快速移植FreeRTOS实战


前言

FreeRTOS(Real-Time Operating System)是一个开源的实时操作系统内核,专注于嵌入式系统。它提供了一套用于管理任务、调度器、内存管理等的实时操作系统功能,为嵌入式应用程序提供了强大的任务管理和资源管理能力。 CubeMX集成了许多中间件和库,包括FreeRTOS。通过简单的选择,用户可以轻松地启用和配置FreeRTOS,而不需要手动整合和调整。


一、Freertos可视化配置

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
配置外部高速时钟在这里插入图片描述
根据芯片手册配置外部晶振,使用外部晶振作为系统时钟源,频率更准确
在这里插入图片描述在这里插入图片描述
配置FreeRTOS
在这里插入图片描述

生成.c和.h文件对
在这里插入图片描述

生成代码时出现警告,原因是FreeRTOS将systick作为时钟源,因此需要设置另外一个定时器作为HAL库的时钟源在这里插入图片描述
动态创建两个任务
在这里插入图片描述

一些基本参数的设置
在这里插入图片描述

二、生成代码

项目代码框架介绍
在这里插入图片描述

生成的创建进程的代码

const osThreadAttr_t Task_LED0_attributes = {
  .name = "Task_LED0",
  .priority = (osPriority_t) osPriorityNormal,
  .stack_size = 128 * 4
};
/* Definitions for Task_LED1 */
osThreadId_t Task_LED1Handle;
const osThreadAttr_t Task_LED1_attributes = {
  .name = "Task_LED1",
  .priority = (osPriority_t) osPriorityNormal,
  .stack_size = 128 * 4
};
void MX_FREERTOS_Init(void) {
  /* creation of Task_LED0 */
  Task_LED0Handle = osThreadNew(AppTask_LED0, NULL, &Task_LED0_attributes);

  /* creation of Task_LED1 */
  Task_LED1Handle = osThreadNew(AppTask_LED1, NULL, &Task_LED1_attributes);



}

在任务函数中实现让两个LED灯分别每隔500ms和1s进行亮灭的反转

/* USER CODE END Header_AppTask_LED0 */
void AppTask_LED0(void *argument)
{
  /* USER CODE BEGIN AppTask_LED0 */
  /* Infinite loop */
  for(;;)
  {
	  	HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
	    HAL_Delay(500);
  }
  /* USER CODE END AppTask_LED0 */
}

/* USER CODE BEGIN Header_AppTask_LED1 */
/**
* @brief Function implementing the Task_LED1 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_AppTask_LED1 */
void AppTask_LED1(void *argument)
{
  /* USER CODE BEGIN AppTask_LED1 */
  /* Infinite loop */
  for(;;)
  {
	  HAL_GPIO_TogglePin(LED1_GPIO_Port, LED1_Pin);
	  HAL_Delay(1000);
  }
  /* USER CODE END AppTask_LED1 */
}

三、实验现象

具有相同优先级时,利用时间片调度算法,每个任务都能得到CPU的使用权。LED0和LED1轮流执行,LED0和LED1实现不同频率的闪烁。
在这里插入图片描述
当设置LED1任务优先级降低时由于Task_LED0任务优先级大于Task_LED1,HAL_Delay(500)是执行空语句实现的因此不会实现任务的切换。Task_LED0一直占用CPU的使用权。现象如下图所示。
在这里插入图片描述
在这里插入图片描述
当代码HAL_Delay(1000)改为osDelay(1000);两个小灯又可以同时执行任务,因为osDelay(1000)会将任务变为阻塞状态交出CPU的使用权。

void AppTask_LED0(void *argument)
{
  /* USER CODE BEGIN AppTask_LED0 */
  /* Infinite loop */
  for(;;)
  {
	  	HAL_GPIO_TogglePin(LED0_GPIO_Port, LED0_Pin);
	    osDelay(1000);
  }
  /* USER CODE END AppTask_LED0 */
}

在这里插入图片描述

总结

本文介绍了如何利用CUBEMX快速开发FreeRTOS。本文介绍了如何创建任务,并通过实验说明了HAL_Delay()函数和osDelay()函数的区别。如果你在一个裸机环境中,没有使用RTOS,那么使用 HAL_Delay 是合适的。如果你在使用RTOS,那么应该使用RTOS提供的 osDelay 来确保任务调度器正常工作,而不会因为延时而阻塞其他任务。

### STM32CubeIDECubeMX 项目移植教程 #### 工具准备 为了顺利地完成从STM32CubeMXSTM32CubeIDE的项目迁移,需准备好最新的STM32CubeMX版本以及安装好对应目标芯片支持包的STM32CubeIDE。 #### 创建初始项目 在STM32CubeMX中创建一个新的项目并配置所需的外设和其他参数。保存此项目,并导出为适合导入至STM32CubeIDE的形式[^2]。 #### 导入项目到STM32CubeIDE 启动STM32CubeIDE后,在欢迎界面选择“Open Projects from File System”,浏览找到由STM32CubeMX生成的文件夹路径下的`.ioc`文件,将其加载进来。注意这里不是简单地复制粘贴`.ioc`文件的内容而是整个项目的结构和设置都应被正确识别与转换。 #### 配置调整 一旦成功导入之后,可能还需要做一些额外的手动调整来确保一切正常工作。这包括但不限于检查中间件组件的选择(比如FreeRTOS信号量配置)、时钟树设定、中断优先级分配等细节部分以匹配具体应用需求[^1]。 #### 编译验证 最后一步是对新环境中重新构建工程项目进行测试。如果之前已经在Keil环境下完成了初步调试并且可以稳定运行,则此时应该重点对比两者之间的差异之处;确认所有功能均能按照预期表现出来后再考虑进一步优化或扩展[^4]。 ```cpp // 示例:简单的LED闪烁程序用于快速验证硬件连接是否正确无误 #include "main.h" int main(void){ HAL_Init(); MX_GPIO_Init(); // 初始化GPIO while (1){ HAL_Delay(500); HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_5); // 假定PA5接有LED灯 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值