1、准备材料
STM32CubeMX软件(Version 6.10.0)
Keil µVision5 IDE(MDK-Arm)
2、学习目标
了解 FreeRTOS 相关知识,并熟悉使用 STM32CubeMX 软件配置 FreeRTOS 工程的流程
3、前提知识
读者须知:本系列教程中关于 FreeRTOS 的学习重点为应用,不会剖析源码内容,利用 STM32CubeMX 软件生成的 FreeRTOS 工程源代码中一般不会直接调用 FreeRTOS 的 API 函数,而是调用了 CMSIS-RTOS 封装好的上层API函数,但此系列教程主要介绍属于 FreeRTOS 的各类 API 函数及其应用,对于 CMSIS-RTOS 的 API 函数仅简单描述,读者需自行理解,另外对于常见硬件原理不再详细说明,感兴趣读者可阅读笔者的 “STM32CubeMX+STM32F4系列教程”
3.1、FreeRTOS简介
FreeRTOS是一个完全免费且开源的嵌入式实时操作系统(Real-Time Operating System,简称RTOS) ,其一般将任务称为线程,以下列表为FreeRTOS的一些特点,笔者认为学习FreeRTOS的应用正是掌握和理解下列各个特性
- 抢占式(pre-emptive)或合作式(co-operative)任务调度方式
- 非常灵活的优先级管理
- 灵活、快速且轻量化的任务通知机制(task notification)
- 消息队列(Queue)
- 二值信号量(Binary Semaphores)
- 计数信号量(Counting Semaphores)
- 互斥量(Mutex)
- 递归互斥量(Recursive Mutex)
- 软件定时器(Timers)
- 事件组(Events)
- 时间节拍钩子函数
- 空闲任务钩子函数
- 栈溢出检测
- 任务运行时间统计收集
- 完整的中断嵌套模型
- 用于低功耗的无节拍(Tickless)特性
RTOS主要应用于对实时性有要求的嵌入式系统,所谓实时性就是任务完成的时间是确定的,实时性又分为软实时和硬实时
软实时指任务完成时间是确定的,但是如果任务超时了也不会对整个系统产生破坏性影响;硬实时是指任务完成时间是确定的,但是如果任务超时未完成则会对整个系统产生灾难性影响,基于FreeRTOS开发的系统可以完成硬实时的要求
3.2、源码函数命名规律
FreeRTOS源码中函数命名规律:FreeRTOS源码中各个函数并非随机命名,而是有规律的命名,这样方便使用者看到名字就能获得该函数更多的信息,其函数名一般由 ① 函数返回值类型简写,② 函数所在文件 和 ③ 函数作用名称这三部分组成
① 函数返回值类型简写主要有:
- 'u'表示'unsigned'
- 'c'表示'char'
- 's'表示'int16_t(short)'
- 'l'表示'int32_t(long)'
- 'p'表示指针类型变量
- 'x'表示'BaseType_t'结构体和其他非标准类型的变量名
- 'uc'表示'UBaseType_t'结构体
- 'v'表示'void'
- 'prv'表示私有函数无返回值
这些简写可以自由组合在一起,例如 'pc' 表示 'char *' 类型,'uc' 表示 'unsigned char' 类型
② 函数所在文件:
- 'CoRoutine'表示该函数定义在'coroutine.c'文件中的
- 'EventGroup'表示该函数定义在'event_groups.c'文件中的
- 'List'表示该函数定义在'list.c'文件中的
- 'Queue'表示该函数定义在'queue.c'文件中的
- 'StreamBuffer'表示该函数定义在'stream_buffer.c'文件中的
- 'Task'表示该函数定义在'tasks.c'文件中的
- 'Timer'表示该函数定义在'timers.c'文件中的
- 'Port'表示该函数定义在'port.c'或'heap_x.c'文件中的
举几个例子:
- xTaskCreate 表示函数返回值为 BaseType_t 结构体类型,函数被定义在 'tasks.c' 文件中,函数作用为“创建”
- vTaskSuspend 表示函数返回值为 void 类型,函数被定义在 'tasks.c' 文件中,函数作用为“挂起”
- prvTaskIsTaskSuspended 表示该函数为私有函数,仅能在 'tasks.c' 文件中使用,函数作用为“判断任务是否被挂起”
4、动手创建一个FreeRTOS空工程
4.1、CubeMX相关配置
4.1.1、工程基本配置
打开STM32CubeMX软件,单击ACCESS TO MCU SELECTOR选择开发板MCU(选择你使用开发板的主控MCU型号),选中MCU型号后单击页面右上角Start Project开始工程,具体如下图所示
开始工程之后在配置主页面System Core/RCC中配置HSE/LSE晶振,在System Core/SYS中配置Debug模式,因为系统滴答定时器SysTick要被FreeRTOS所使用,所以需要配置HAL库的时基源为除系统滴答定时器SysTick外的选项,笔者这里选择了基本定时器TIM6,这两个时基源均为1ms,具体配置如下图所示
4.1.2、时钟树配置
系统时钟使用8MHz外部高速时钟HSE,HCLK、PCLK1和PCLK2均设置为STM32F407能达到的最高时钟频率,具体如下图所示
4.1.3、外设参数配置
单击Pinout & Configuration页面左边功能分类栏目Middleware and SoftwarePacks中的FREERTOS,在模式配置栏中将其接口设置为CMSIS_V2(CMSIS_V2只是对CMSIS_V1的某些功能进行了扩展)
下方的Configuration配置页面中可以对9个选项卡关于FreeRTOS的所有参数做配置,目前均保持默认即可,具体配置如下图所示
以下列表为对上图所示这9个配置选项卡及其包含的参数做简单的介绍
- Tasks and Queues:任务和队列管理
- Timers and Semaphores :定时器和信号量管理