之前出过一系列FreeRTOS的公众号,但是FreeRTOS的配置实在是啰嗦麻烦。需要耗费很长很长的时间。

本期利用CubeMX中使用FreeRTOS快速的初始化。

说明:由于CubeMX不支持MDK5.32以上版本,所以如果你是从官网下载的最新MDK的话。

这时候编译版本只能使用Version 6,Version 6的编译速度比5快速很多,但是会导致RTOS的编译出现非常多的错误。


这时候我们需要获取老版本MDK,并且装上Version 5,使用Version 5来进行编译,这样子虽然编译速度会慢很多,但是编译不会出错。

因此如果大家编译出现了大量的错误的话,可以关注一下是不是因为MDK版本的问题。

  • RTOS初始化

首先将系统的时基切换成定时器(FreeRTOS推荐),这里推荐使用基本的定时器。

在创建项目的左边点击展开Middleware and Software Pack...找到FREERTOS。

选择CMSIS_V1为内核,在Include parameters中添加自己需要的头文件,这里我们启用二进制信号量。

在Tasks and Queues中添加任务

优先级修改为低优先级

开启定时器,优先级设置为0(最高)

在Timers and Semaphores添加二进制信号量和定时器。

这里我们添加两个任务用来演示RTOS的并行逻辑。


可以看到,在文件的代码结构中多出来了RTOS的部分源码,这意味着我们可以使用RTOS,其实还有信号量我发现没有包括进去,也可以找到文件自行添加。


void LED0Func(void *argument)
{
  /* USER CODE BEGIN LED0Func */
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END LED0Func */
}

/* USER CODE BEGIN Header_LED1Func */
/**
* @brief Function implementing the LED1 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_LED1Func */
void LED1Func(void *argument)
{
  /* USER CODE BEGIN LED1Func */
  /* Infinite loop */
  for(;;)
  {
    osDelay(1);
  }
  /* USER CODE END LED1Func */
}

在FreeRTOS.c文件中可以看到,系统帮我们定义好了我们的两个任务函数,不需要像RTOS裸机开发一样使用大量繁琐的配置和初始化。


void LED0Func(void *argument)
{
  /* USER CODE BEGIN LED0Func */
  /* Infinite loop */
  for(;;)
  {
    HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_10);//LED0反转
    osDelay(500);
  }
  /* USER CODE END LED0Func */
}

/* USER CODE BEGIN Header_LED1Func */
/**
* @brief Function implementing the LED1 thread.
* @param argument: Not used
* @retval None
*/
/* USER CODE END Header_LED1Func */
void LED1Func(void *argument)
{
  /* USER CODE BEGIN LED1Func */
  /* Infinite loop */
  for(;;)
  {
    HAL_GPIO_TogglePin(GPIOF,GPIO_PIN_9);//LED1反转
    osDelay(500);
  }
  /* USER CODE END LED1Func */
}

我们配置两个任务分别是控制两盏灯0.5s反转一次。

在main函数中不关调用了FREERTOS初始化也调用了任务调度器,因此我们只需要填充我们的任务函数。

嘉立创PCB

还没有评论,抢个沙发!