STM32CUBEMX+FREERTOS使用软件定时器osTimerStart

本文详细介绍了如何在STM32CUBEMX中配置FreeRTOS,包括开启FreeRTOS、配置系统参数如调度内核设置、内存管理和软件定时器等,并探讨了任务创建、定时器和信号量的配置方法,为STM32嵌入式系统开发提供了全面的FreeRTOS配置指南。
摘要由CSDN通过智能技术生成

一、配置STM32CUBEMX

1、开启FreeRTOS

新建一个 CubeMX 工程,在配置好时钟后,点击 Middleware -> 选择 FreeRTOS -> 下拉框选择 V1 版本 CMSIS

2、配置界面

配置项功能
Tasks and Queues任务与队列,用于配置任务体以及消息队列;
Timers and Semaphores软件定时器与信号量,用于配置内核对象 (软件定时器和信号量)
Mutexes互斥量,用于配置内核对象(互斥量)
Events事件,配置内核对象(事件)
FreeRTOS Heap Usage查看用户任务和系统任务的堆占用
Config Parameters系统的参数配置
Include Parameters系统的功能裁剪
Advanced SettingsCubeMX 生成代码预配置项
User Constants用户常量定义

以上各个功能分的很清晰,我们需要配置什么功能就去对应的选项下进行配置,下面根据各个配置项进行详细配置介绍。

3、系统设置

首先我们先了解一下 Config Parameters,他的配置参数如下

在这里插入图片描述
参数功能表:

参数功能
API显示 FreeRTOS API 接口版本
Version显示 FreeRTOS 内核版本显示 CMSIS 版本
Kernel SettingFreeRTOS 调度内核设置
Memory management setting内存管理设置
Hook function related definitions钩子函数有关定义
Run time and task stats gathering related definitions系统运行时的参数收集配置
Co-routine related definitions协程配置
Software timer definitons软件定时器任务配置
Interrupt nesting behaviour configuration中断优先级配置

API 和 Version 不过多解释,显示版本信息

3.1调度内核设置

Kernel Setting 是 FreeRTOS 的调度内核配置,展开后有下面的配置项,使用时一般保持默认,也可以根据需要修改
在这里插入图片描述

  • USE_PREEMPTION

USE_PREEMPTION 是 RTOS 的调度方式选择,为 1 时使用抢占式调度器,为 0 时使用协程,如果使用抢占式调度器的话内核会在每个时钟节拍中断中进行任务切换,当使用协程的话会在如下地方进行任务切换

一个任务调用了函数 taskYIELD()。
一个任务调用了可以使任务进入阻塞态的 API 函数。
应用程序明确定义了在中断中执行上下文切换。

  • CPU_CLOCK_HZ

CPU_CLOCK_HZ 是 CPU 系统时钟频率,默认使用的是晶振通过时钟树后获得的时钟频率

  • TICK_RATE_HZ

TICK_RATE_HZ 是 RTOS 的心跳时钟频率,默认为最大值 1000 ,即心跳时钟 1ms 跳动一次

  • MAX_PRIORITIES

MAX_PRIORITIES 是 RTOS 任务的最高优先级设置,默认56级,一般来说一个优先级表是32位,这里用了两个,对应64位,其中8位用于系统任务的优先级处理

  • MINIMAL_STACK_SIZE

MINIMAL_STACK_SIZE 设置分配给空闲任务的堆栈大小,该值是用字(32位)指定的,而不是字节,默认为128个字,如果修改过空闲任务,则根据实际情况修改

  • MAX_TASK_NAME_LEN

MAX_TASK_NAME_LEN 设置任务名称的最大字符数,默认16位足够

  • USE_16_BIT_TICKS

USE_16_BIT_TICKS 存放 Tick 周期的计数器的数字位宽,默认为 Disable 即 16 位

  • IDLE_SHOULD_YIELD

如果IDLE_SHOULD_YIELD 设置为0,则空闲任务永远不会让位于另一个任务,只在被抢占时才会离开运行状态。如果 IDLE_SHOULD_YIELD 设置为1,那么当有另一个空闲优先级任务处于Ready状态时,空闲任务将不会执行它定义的功能的不止一次迭代,而不会让位于另一个任务,这确保当应用程序任务处于空闲状态时,在空闲任务中花费的时间最少,即同在空闲优先级下,空闲任务优先级更高,不会被抢占,不会以时间片运行

  • USE_MUTEXES、USE_RECURSIVE_MUTEXES、USE_COUNTING_SEMAPHORES

为 1 则开启系统构建过程中的互斥量、递归互斥量和信号量,该值强制为1(ENABLE)

  • QUEUE_REGISTRY_SIZE

队列注册表的大小,可以用于管理队列名称和队列实体,方便运行中进行查看与管理,默认为8

  • USE_APPLICATION_TASK_TAG

使能时会给任务一个 TAG 标签,便于用户进行使用

  • ENABLE_BACKWARD_COMPATIBILITY

一个兼容性使能,使能后, FreeRTOS 8.0.0 之后的版本可以通过宏定义使用 8.0.0 版本之前的函数接口,默认使能

  • USE_PORT_OPTIMISED_TASK_SELECTION

查找下一个任务方式的选择,查找下一个就绪任务就是查找优先级表,对优先级表进行导0算法,分为通用切换或者针对性切换,一般默认不使能,使用通用切换,通用切换使用C编写,执行效率低,兼容性高;针对性切换使用处理器自带的导0指令,使用汇编编写,切换效率高,但兼容性差

  • USE_TICKLESS_IDLE

使能后会生成的两个空函数PreSleepProcessing和PostSleepProcessing,用户可以编写代码进入低功耗模式,生成函数如下图
在这里插入图片描述

  • USE_TASK_NOTIFICATIONS

任务通知使能,每个RTOS任务都有一个32位的通知值,RTOS任务通知是一个直接发送给任务的事件,它可以解除接收任务的阻塞,并可选地更新接收任务的通知值,为1开启,为0关闭,关闭可以为每个任务节省8个字节的内存空间

  • RECORD_STACK_HIGH_ADDRESS

记录任务的堆栈入口地址到TCB,为1使能,为0关闭

3.2内存管理设置

内存管理可以看到3个配置参数

在这里插入图片描述

  • Memory Allocation

内存分配方式,此处默认动态和静态都可以

  • TOTAL_HEAP_SIZE

内存堆的分配大小,堆本质上就是一个数组,此处是设置堆数组的大小,设置时要考虑最小要满足所有任务的使用要求,最大不要超过系统的分配上限

  • Memory Management scheme

内存分配方式,有heap_1.c, heap_2.c, heap_3.c, heap_4.c and heap5.c 5种,其中1、2、4、5都是先建立一个堆数组,从数组中申请,用完再释放,与C语言中molloc和free使用链表的方式不同,该方式在 MCU 中更安全稳定,此处默认使用的方式4,具体申请释放方式可以在heap4。

3.3 软件定时器配置

在这里插入图片描述
这四个配置项主要与软件定时器处理任务有关,软件定时器任务属于系统任务(守护线程),开启软件定时器后用于维护软件定时器

  • USE_TIMERS

默认开启软件定时器任务

  • TIMER_TASK_PRIORITY

软件定时器任务优先级。

  • TIMER_QUEUE_LENGTH

定时器任务队列长度,FreeRTOS 是通过队列来发送控制命令给定时器任务,叫做定时器命令队列,此处设置队列长度

  • TIMER_TASK_STACK_DEPTH

软件定时器任务堆栈大小

3.4中断优先级配置

  • LIBRARY_LOWEST_INTERRUPT_PRIORITY

此宏是用来设置最低优先级,FreeRTOS 使用的4位优先级,对应16位优先级,对应的最低优先级为15

  • LIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

设置FreeRTOS 系统可管理的最大优先级,也就是设置阈值优先级,这个大家可以自由设置,这里设置为5,也就是高于5 的优先级(优先级数小于5)不归 FreeRTOS 管理

4、内核裁剪

Include Parameters 下的选项应用于内核裁剪,裁剪不必要的功能,精简系统功能,减少资源占用,主要有以下几个选项:
在这里插入图片描述

5、创建任务

任务(线程)是操作系统运行的基本单元,也是资源分配的基本单元, CubeMX 任务的创建基本以图形化进行,配置方式如下

进入Tashs and Queues 配置,点击 Add 添加新任务
在这里插入图片描述
设置完成后点击OK,配置就完成了,之后生成代码,使用 MDK 进一步配置任务的具体信息

在生成的代码中,我们打开 freertos.c 文件可以在代码中看到任务的配置信息
在这里插入图片描述
在 freertos.c 文件的末尾部分,我们可以看到生成的任务实体
在这里插入图片描述

6、创建定时器和信号量

软件定时器本质上就是设置一段时间,当设置的时间到达之后就执行指定的功能函数,调用的这个函数叫做回调函数。回调函数的两次执行间隔叫做定时器的定时周期,简而言之,当定时器的定时周期到了以后就会执行回调函数,下面介绍一下 CubeMX 中开启定时器的方法:

在 CubeMX 里面按下面步骤添加定时器
在这里插入图片描述
参数配置完成后,生成代码,我们可以在 freertos.c 文件里面看到定时器创建后获得的句柄,以及生成的回调函数:
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值