FreeRTOS记录(一、熟悉开发环境以及CubeMX下FreeRTOS配置)

简介: 熟悉 在 STM32 CubeMX 下面的 FreeRTOS 使用

第一步的记录,用永远的带头大哥“跑马灯”,来熟悉一下开发环境以及操作流程,同时了解下CubeMX下关于 FreeRTOS 的配置方法。

1、STM32CubeMX下配置第一个FreeRTOS工程

话不多说,先跑起来,然后再来一步一步分析,使用STM32CubeMX生成工程(下面的步骤属于STM32CubeMX的基础使用,这里我们不会介绍软件如何使用,只给出相关的操作步骤截图):
1、LED所使用的GPIO
在这里插入图片描述
2、选择时钟源,配置时钟:
在这里插入图片描述
在这里插入图片描述
3、调试模式和基础时钟源
在这里插入图片描述

问题1、为什么不能使用System tick 分析

这里需要知道,使用了FreeRTOS以后,FreeRTOS 会强制使用systick作为自己的心跳,这个os_tick的优先级是最低的,他主要是处理OS任务调度,时间片查询等工作。

在图中这里设置的Timebase是HAL库所使用的基础时钟 hal_tick, 如果设置成也设置成systick,优先级最低,那么
当在高优先级(优先级高于systick)中断服务中调用 HAL_Delay()就会导致错误

当然我们也经常强调不要在中断中使用延时!不要在中断中使用延时!不要在中断中使用延时!

HAL_Delay() 函数在库中是基于所选择的的Timebase时钟来源实现的:
在这里插入图片描述
所以我们设置成其他定时器,当然建议使用基本定时器TIM6 或者 TIM7,他的优先级会默认设置最高,
如下图:
在这里插入图片描述
参考博文:cubemx在使用freertos的时候为何推荐使用除systick以外的timebase

选择其他时钟源后,系统会自动生成一个Callback函数(下图例子是在L051 上选择的TIM22 定时器作为时钟源):
在这里插入图片描述

4、调试串口选择
在这里插入图片描述
5、选择使用FREERTOS以及接口版本
在这里插入图片描述

问题2、为什么选择CMSIS_v1 分析

首先我们得明白,CMSIS是什么?

Cortex微控制器软件接口标准(CMSIS)是独立于供应商的硬件抽象层,用于基于Arm Cortex处理器的微控制器。 CMSIS定义了通用工具接口,并提供一致的设备支持。 CMSIS软件接口简化了软件重用,CMSIS提供了到处理器和外围设备,实时操作系统以及中间件组件的接口。 ------ CMSIS是接口!
所以虽然我们是使用FreeRTOS,但是和以前使用 FreeRTOS 源码移植的方式不同,我理解是CubeMX里面使用的 FreeRTOS 是被 CMSIS 重新封装过提供给用户使用的,通过 CMSIS 标准接口方便在不同平台移植。
如果以前自己用源码移植过,有自己的代码框架,可以在此选项中选择 Disable,通过以前的源码方式自己移植

官方的文档有这么一段:
在这里插入图片描述
V1使得软件能够在不同的RTOS系统下工作,为实时操作系统提供通用的API。
V2是在V1基础上的扩展了一些关于 Armv8-M的支持,动态对象,多核系统相关的东西。
所以说V2对于我们也并没有本质的使用提升,而且一般来说 支持东西越多,代码越大。
综上所述,所以我们选择 CMSIS_v1 版本的接口。

6、创建任务
在这里插入图片描述
7、生成代码

这里我们选择生成Makefile,因为我说过要抛弃MDK的盗版开发环境,开源走起,所以在此之前需要配置好开发环境。
在这里插入图片描述
在这里插入图片描述

  1. 代码生成了确保环境正常,make一下!
    如果不会的朋友可以参考我的博文:在window下使用VScode搭建ARM开发环境——手把手教学详细版
    按照教程把该准备和配置的都设置好。

在这里插入图片描述
9、跑马灯跑起来
在 freertos.c 文件中我们能看到我们创建的任务函数:
void Start_Led_toggle(void const * argument)
我们需要在任务函数中写跑马灯程序:

/* USER CODE END Header_Start_Led_toggle */
void Start_Led_toggle(void const * argument)
{
  /* USER CODE BEGIN Start_Led_toggle */
  /* Infinite loop */
  for(;;)
  {  
    osDelay(500);
    HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);
    // printf("this is a test!\r\n");   
    osDelay(500);
    HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);
    osDelay(500);
  }
  /* USER CODE END Start_Led_toggle */
}

然后编译下载 ,可以观察到板子上的LED灯安装程序跑起来了,至此,我们的FreeRTOS就用起来了(好的开始,宣告学会了一半 = =!)。

2、STM32CubeMX中 FreeRTOS 的配置说明

2.1 Config Parameters 内核参数配置

内核配置

系统工作模式

在这里插入图片描述

系统时钟节拍

FreeRTOS的时钟Tick的频率,也就是FreeRTOS用到的定时中断的产生频率,这个频率越高则定时的精度越高。但是系统消负担越大,
在这里插入图片描述

配置最大优先级数量

在这里插入图片描述

define configMAX_PRIORITIES ( 5 )

定义可供用户使用的最大优先级数,如果这个定义的是 5,那么用户可以使用的优先级号是 0,1,2,3,4,
不包含 5,对于这一点,初学者要特别的注意

IDLE TASK所占的空间

在这里插入图片描述

任务描述信息长度

在这里插入图片描述

任务在空闲优先级中的行为

在这里插入图片描述

互斥量和信号量

在这里插入图片描述

队列和信号量的数量

在这里插入图片描述

任务的 ‘tag’ 值

在这里插入图片描述

版本兼容

在这里插入图片描述

低功耗模式

在这里插入图片描述

任务通知

在这里插入图片描述

任务的TCB

在这里插入图片描述

内存管理相关设置

内存分配

在这里插入图片描述

最大使用大小

在这里插入图片描述

内存管理方案

在这里插入图片描述

钩子函数相关设置

在这里插入图片描述

时间统计和任务可视化调试

在这里插入图片描述

协同程序

在这里插入图片描述

软件定时器

在这里插入图片描述

中断配置

SysTick中断和PendSV中断的优先级

LIBRARY_LOWEST_INTERRUPT_PRIORITY

此宏定义是用来配置 FreeRTOS的最低优先级,SysTick中断和 PendSV 默认在这个优先级。

在 NVIC分组设置为4的情况下,此宏定义的范围就是 0-15 ,即专门配置抢占优先级。这里 即专门配置抢占优先级。这里 配置 为了 15,即 SysTick和 PendSV 都配配置为了最低优先级,实际项目中也建议配置为最低优先级。

在这里插入图片描述

FreeRTOS管理的最高优先级中断

LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

这是针对硬件芯片的中断优先级来说的,不要与 FreeRTOS 任务优先级搞混了!

此选项定义了受FreeRTOS管理的最高优先级中断。

利用BASEPRI寄存器来选择屏蔽低于特定优先级的异常或中断,进入临界区后会屏蔽的中断等级就是由这里设置

简单的说就是允许用户在这个中断服务程序里面调用FreeRTOS的API的最高优先级。
在这里插入图片描述设置NVIC的优先级分组为4的情况下(全部配置为抢占式优先级。又因为STM32的优先级设置仅使用CM内核8bit中的高4bit,即只能区分2^4 = 16种优先级。因此当优先级分组设置为4的时候可供用户选择抢占式优先级为0到15,共16个优先级,配置为0表示最高优先级,配置为15表示最低优先级,不存在子优先级。),配置
configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 为 0x01此配置可以在抢占式优先级为1到15的中断里面调用FreeRTOS的API函数,抢占式优先级为0的中断里面是不允许调用的。
在这里插入图片描述
比如 configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 为 0x01 表示用户可以在抢占式优先级为 1 到 15 的中断里面调用 FreeRTOS 的 API 函数,抢占式优先级为 0 的中断里面是不允许调用的。即抢占式优先级为 1 到 15的中断,均受FreeRTOS管理,0是最高优先级不受FreeRTOS管理。
 

2.2 Include Parameters

系统API配置,使能或者不使能API,不用的API可以不使能以减小系统大小。对应与移植时的Config文件。
在这里插入图片描述

2.3 Advanced setting

高级设置,这个是新版本加的:
在这里插入图片描述
如果configUSE_NEWLIB_REENTRANT设置为1,那么将为每个创建的任务分配一个newlib rent结构。注意,Newlib支持已经被普遍的需求所包含,但是FreeRTOS维护者自己并没有使用。FreeRTOS不负责生成的newlib操作。用户必须熟悉newlib,并且必须提供必要存根的系统范围实现。请注意(在编写本文时)当前的newlib设计实现了一个必须提供锁的系统范围的malloc()。
如果在不使用newlib的情况下启用,CubeMx项目编译将失败(“无法打开源代码文件”reent.h”)
在这里插入图片描述

2.4 User Constants

用户常量,定义一些宏定义,一般不用
在这里插入图片描述

2.5 Tasks and Queues

用于添加任务和队列(系统已经默认添加了一个任务):
在这里插入图片描述

2.6 Timers and Semaphores

软件定时器和信号量的一些配置:
在这里插入图片描述

2.7 Mutexes

互斥量的配置:
在这里插入图片描述

2.8 Events

事件标志组有关的选项,但是在有些型号上会没有这个栏目

2.9 FreeRTOS Heap Usage

FreeRTOS堆使用情况:
在这里插入图片描述

相关文章
|
API
FreeRTOS学习笔记—FreeRTOS移植
本文学习了如何移植FreeRTOS到自己的STM32工程。最后,根据正点原子提供的测试main函数,测试了移植效果。
582 0
FreeRTOS学习笔记—FreeRTOS移植
|
芯片
STM32-FreeRTOS源码下载及移植步骤(基于Keil)
STM32-FreeRTOS源码下载及移植步骤(基于Keil)
937 0
STM32-FreeRTOS源码下载及移植步骤(基于Keil)
|
7月前
|
中间件 编译器 调度
STM32cubemx对FreeRTOS的适配(工程模板配置)
STM32cubemx对FreeRTOS的适配(工程模板配置)
430 0
|
7月前
|
消息中间件 调度
FreeRTOS入门教程(任务状态)
FreeRTOS入门教程(任务状态)
286 0
|
6月前
|
消息中间件 算法 编译器
【FreeRTOS(一)】FreeRTOS新手入门——初识FreeRTOS
【FreeRTOS(一)】FreeRTOS新手入门——初识FreeRTOS
|
6月前
|
传感器 物联网 调度
从0入门FreeRTOS之第一节 什么是FreeRTOS?
FreeRTOS(Free Real-Time Operating System)是一款开源的实时操作系统(RTOS),专为嵌入式系统设计。由Real Time Engineers Ltd.开发和维护,FreeRTOS以其小巧、高效、易于使用的特点广受欢迎。FreeRTOS支持多种微控制器和微处理器平台,提供丰富的实时操作系统功能,使开发者能够轻松构建高效、实时响应的应用程序。
395 0
|
6月前
|
存储 安全 算法
从0入门FreeRTOS之第二节FreeRTOS的体系结构
FreeRTOS的体系结构设计精巧且高效,专为嵌入式系统量身打造。理解FreeRTOS的体系结构对开发高效、稳定的嵌入式应用至关重要。下面,我们详细介绍FreeRTOS的核心组件、内核机制、中断管理和内存管理等内容。
229 0
|
7月前
|
API
FreeRTOS软件定时器的原理以及使用实例
FreeRTOS软件定时器的原理以及使用实例
164 0
|
7月前
|
消息中间件 资源调度 算法
FreeRTOS最全教程(目录)
FreeRTOS最全教程(目录)
745 1