之前出过一系列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初始化也调用了任务调度器,因此我们只需要填充我们的任务函数。
可以看到,两个灯表现的方式是并行闪烁的,代表着任务的同步进行。