概述
一、配置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 Settings | CubeMX 生成代码预配置项 |
User Constants | 用户常量定义 |
以上各个功能分的很清晰,我们需要配置什么功能就去对应的选项下进行配置,下面根据各个配置项进行详细配置介绍。
3、系统设置
首先我们先了解一下 Config Parameters,他的配置参数如下
参数功能表:
参数 | 功能 |
---|---|
API | 显示 FreeRTOS API 接口版本 |
Version | 显示 FreeRTOS 内核版本显示 CMSIS 版本 |
Kernel Setting | FreeRTOS 调度内核设置 |
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 文件里面看到定时器创建后获得的句柄,以及生成的回调函数:
最后
以上就是正直糖豆为你收集整理的STM32CUBEMX+FREERTOS使用软件定时器osTimerStart一、配置STM32CUBEMX的全部内容,希望文章能够帮你解决STM32CUBEMX+FREERTOS使用软件定时器osTimerStart一、配置STM32CUBEMX所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复