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

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

以下内容包括:

    • FreeRTOS 简介
  • 程序框图
  • 所需要的元器件
    • 整体思路
    • 程序运行逻辑:
    • 接线方式
    • Cube配置
    • 代码解析
      • 最终实验结果
      • 总结

FreeRTOS 简介

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

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

程序框图

[hal库]使用 CubeMX 快速生成 FreeRTOS 系统并实现多任务处理_第1张图片

所需要的元器件

  • usb线缆
  • STM32F4单片机(本章使用的是Robomaster大疆开发板)
    [hal库]使用 CubeMX 快速生成 FreeRTOS 系统并实现多任务处理_第2张图片

整体思路

  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口
    [hal库]使用 CubeMX 快速生成 FreeRTOS 系统并实现多任务处理_第3张图片

  2. 配置FreeRTOS,并创建至3个任务
    [hal库]使用 CubeMX 快速生成 FreeRTOS 系统并实现多任务处理_第4张图片

  3. 通过查阅Robomaster开发板手册,可以知道用户定义的LED灯接口,我们使用PG1、PG2和PG3[hal库]使用 CubeMX 快速生成 FreeRTOS 系统并实现多任务处理_第5张图片
    [hal库]使用 CubeMX 快速生成 FreeRTOS 系统并实现多任务处理_第6张图片

  4. 配置时钟
    [hal库]使用 CubeMX 快速生成 FreeRTOS 系统并实现多任务处理_第7张图片

  5. 生成代码,并打开keil[hal库]使用 CubeMX 快速生成 FreeRTOS 系统并实现多任务处理_第8张图片

之后生成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的多任务处理效果。
[hal库]使用 CubeMX 快速生成 FreeRTOS 系统并实现多任务处理_第9张图片

总结

使用嵌入式操作系统编程的优缺点:感觉FREERTOS最大的好处是多任务处理,曾经以前做比赛的时候,我们写代码一般都是放在while循环里,常常要多个任务放在一起,因此任务执行有先后顺序,这样效率不高。通过操作系统,可以实现循迹和避障一起执行的效果,所以总体来说效率提升了不少。但是FREERTOS本身也会占用系统内存,因此需要的时候打开就行了。程序设计时,也要考虑设计的效率,若一个办法可以更快的运行,则可以采用这种方法提高运行整体效果。

坚持成就梦想。

你可能感兴趣的:(stm32,嵌入式,操作系统,keil,mdk,单片机,stm32)