由于项目需求,需要使用FREERTOS搭载轻量系统,因此写此博客给大家提供一个快速搭建RTOS系统的方法,通过cubemx快速生成。
FreeRTOS 简介
FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。
任务调度机制是嵌入式实时操作系统的一个重要概念,也是其核心技术。对于可剥夺型内核,优先级高的任务一旦就绪就能剥夺优先级较低任务的CPU使用权,提高了系统的实时响应能力。不同于μC/OS-II,FreeRTOS对系统任务的数量没有限制,既支持优先级调度算法也支持轮换调度算法,因此FreeRTOS采用双向链表而不是采用查任务就绪表的方法来进行任务调度。
程序框图
所需要的元器件
- usb线缆
-
STM32F4单片机(本章使用的是Robomaster大疆开发板)
整体思路
- 通过Cubemx配置FreeRTOS系统
- 配置LED灯闪烁外设
- 在keil里编写LED闪烁多任务同时进行的程序
程序运行逻辑:
stm32通过FREERTOS创建2个任务,而每个任务分别控制自己的LED灯闪烁,实现多任务处理。LED灯通过拉高点亮,拉低熄灭,通过程序语句HAL_GPIO_WritePin(GPIOF, LED0_Pin, GPIO_PIN_RESET)与HAL_GPIO_WritePin(GPIOF, LED0_Pin, GPIO_PIN_SET)来控制拉高和拉低。而HAL_Delay() 实现延迟效果,故可以看到灯闪烁。设置两个标志位VALUE1、VALUE2来控制2个LED灯闪烁的间隔,同时分别在两个任务中创建一个按键,通过HAL_GPIO_ReadPin(GPIOE,GPIO_PIN_2)==0,检测按键口电位的高低,改变标志位的值,从而分别使两个灯按照预定延时规律闪烁切换。
接线方式
- stm32的串口通过usb连接到电脑
Cube配置
-
配置RCC和SW口
-
配置FreeRTOS,并创建至3个任务
-
通过查阅Robomaster开发板手册,可以知道用户定义的LED灯接口,我们使用PG1、PG2和PG3
-
配置时钟
-
生成代码,并打开keil
之后生成keil代码,打开并编辑
代码解析
-
在 main.h 内宏定义3个LED的拉高拉低操作
#define led3_off HAL_GPIO_WritePin(GPIOG, LED3_Pin, GPIO_PIN_RESET)
#define led3_on HAL_GPIO_WritePin(GPIOG, LED3_Pin, GPIO_PIN_SET)
#define led2_off HAL_GPIO_WritePin(GPIOG, LED2_Pin, GPIO_PIN_RESET)
#define led2_on HAL_GPIO_WritePin(GPIOG, LED2_Pin, GPIO_PIN_SET)
#define led1_off HAL_GPIO_WritePin(GPIOG, LED1_Pin, GPIO_PIN_RESET)
#define led1_on HAL_GPIO_WritePin(GPIOG, LED1_Pin, GPIO_PIN_SET)
-
在 freertos.c 内进行默认任务的编写,为LED1闪烁
void StartDefaultTask(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200501130250901.jpg?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L01yYWluX0dBR0E=,size_16,color_FFFFFF,t_70)
led1_on;
osDelay(500);
led1_off;
osDelay(500);
}
/* USER CODE END StartDefaultTask */
}
-
第二个任务为LED2闪烁
void StartTask02(void const * argument)
{
/* USER CODE BEGIN StartTask02 */
/* Infinite loop */
for(;;)
{
led2_on;
osDelay(500);
led2_off;
osDelay(500);
}
/* USER CODE END StartTask02 */
}
-
第三个任务为LED3闪烁
void StartTask03(void const * argument)
{
/* USER CODE BEGIN StartTask03 */
/* Infinite loop */
for(;;)
{
led3_on;
osDelay(500);
led3_off;
osDelay(500);
}
/* USER CODE END StartTask03 */
}
最终实验结果
**将代码烧录到stm32单片机上后,每个灯都能独立运行闪烁,实现freertos的多任务处理效果。
总结
使用嵌入式操作系统编程的优缺点:感觉FREERTOS最大的好处是多任务处理,曾经以前做比赛的时候,我们写代码一般都是放在while循环里,常常要多个任务放在一起,因此任务执行有先后顺序,这样效率不高。通过操作系统,可以实现循迹和避障一起执行的效果,所以总体来说效率提升了不少。但是FREERTOS本身也会占用系统内存,因此需要的时候打开就行了。程序设计时,也要考虑设计的效率,若一个办法可以更快的运行,则可以采用这种方法提高运行整体效果。
坚持成就梦想。