FreeRTOS 记录(一、熟悉开发环境以及 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,他的优先级会默认设置最高,如下图:
选择其他时钟源后,系统会自动生成一个 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 的盗版开发环境,开源走起,所以在此之前需要配置好开发环境。
8. 代码生成了确保环境正常,make 一下! 如果不会的朋友可以参考我的博文:在window下使用VScode搭建ARM开发环境——手把手教学详细版 按照教程把该准备和配置的都设置好。
9、跑马灯跑起来在 freertos.c 文件中我们能看到我们创建的任务函数:void Start_Led_toggle(void const * argument)
我们需要在任务函数中写跑马灯程序:
然后编译下载 ,可以观察到板子上的 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 堆使用情况:
版权声明: 本文为 InfoQ 作者【矜辰所致】的原创文章。
原文链接:【http://xie.infoq.cn/article/e82c7e10af242105b509bee2e】。文章转载请联系作者。
评论