[hal库]使用 CubeMX 快速生成 FreeRTOS 系统并实现多任务处理

  • Post author:
  • Post category:其他


由于项目需求,需要使用FREERTOS搭载轻量系统,因此写此博客给大家提供一个快速搭建RTOS系统的方法,通过cubemx快速生成。



FreeRTOS 简介

FreeRTOS是一个迷你的实时操作系统内核。作为一个轻量级的操作系统,功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能、软件定时器、协程等,可基本满足较小系统的需要。

任务调度机制是嵌入式实时操作系统的一个重要概念,也是其核心技术。对于可剥夺型内核,优先级高的任务一旦就绪就能剥夺优先级较低任务的CPU使用权,提高了系统的实时响应能力。不同于μC/OS-II,FreeRTOS对系统任务的数量没有限制,既支持优先级调度算法也支持轮换调度算法,因此FreeRTOS采用双向链表而不是采用查任务就绪表的方法来进行任务调度。



程序框图

在这里插入图片描述



所需要的元器件

  • usb线缆
  • STM32F4单片机(本章使用的是Robomaster大疆开发板)

    -



整体思路

  1. 通过Cubemx配置FreeRTOS系统
  2. 配置LED灯闪烁外设
  3. 在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配置

  1. 配置RCC和SW口

    在这里插入图片描述

  2. 配置FreeRTOS,并创建至3个任务

    在这里插入图片描述

  3. 通过查阅Robomaster开发板手册,可以知道用户定义的LED灯接口,我们使用PG1、PG2和PG3
    在这里插入图片描述

    在这里插入图片描述

  4. 配置时钟

    在这里插入图片描述

  5. 生成代码,并打开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本身也会占用系统内存,因此需要的时候打开就行了。程序设计时,也要考虑设计的效率,若一个办法可以更快的运行,则可以采用这种方法提高运行整体效果。

坚持成就梦想。