FreeRTOSFreeRTOS学习笔记— 使用STM32CubeMX对F407ZGT6移植FreeRTOS(CMSIS API)
Posted 果果小师弟
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FreeRTOSFreeRTOS学习笔记— 使用STM32CubeMX对F407ZGT6移植FreeRTOS(CMSIS API)相关的知识,希望对你有一定的参考价值。
如果我们自己移植代码就是使用的是FreeRTOS的原生API接口,如果使用STM32CubeMX来配置工程就是使用的CMSIS API接口,是对FreeRTOS的原生API接口进行了封装。
为什么学习CMSIS 的 RTOS 接口?
目前使用的是FreeRTOS,我们可以直接介绍FreeRTOS的原生接口(原生API),源码移植就是使用的是原生API接口。我们这里选择介绍CMSIS接口,实际上CMSIS接口和原生接口都是类似的,因此学会了CMSIS 的RTOS接口之后,大家自己也能自学对应的原生接口,当然毕竟还是有区别的,因此还是需要花时间去熟悉的。
学会了CMSIS的最大好处就是,只要其它RTOS有提供CMSIS接口,我们就可以直接使用 CMSIS接口,而不需要再花时间去了解原生接口。比如我们在学习UCOS时,发现UCOS的API和FreeRTOS的API不同,是因为我们学的都是他们原生的API,就是我们下载源码后在keil中移植的那种。但是如果我们学会了CMSIS API,那么不管以后学习哪一个OS,只要这个OS提供了CMSIS的接口,我们就直接可以用CMSIS的API来调用学习,而不需要再花时间去了解原生接口。
CubeMX在提供FreeRTOS时也提供了CMSIS接口,后面具体举例时就可以看到封装的.c
文件,总之ST对FreeRTOS封装出了CMSIS接口。
1、原理图分析
本文使用的硬件开发环境是STM32F407、
2、新建工程
3、外部晶振
4、下载器
5、打开FreeRTOS
Include paramters
这一个与 freeRtos 的原生接口有关,大家凡是看到 v 打头、x 打头的函数,都是 freeRtos 的原生函数,我们现在要使用的是对原生接口封装后的 CMSIS API,通过 Include paramters 的配置可以决定哪些原生接口被使用,哪些不被使用,不过有关 Include paramters 中的内容,一般情况下使用默认设置即可。
User Constant
在该这栏目中可以添加宏定义,添加后就会在代码中自动生成宏定义的代码,但是我们一般不会这样添加,我们需要定义什么宏定义,我们一般都是直接在代码中编写。
Task and Queues(任务和队列)
在这一个栏目中,我们可以添加任务(线程),自动生成代码时就会生成创建任务(线程)的代码,一般会有一个默认任务,如果需要的话我们可以额外添加一个任务,当然我们也可以自己去写这些创建任务的代码。
添加一个任务(线程),默认任务+添加的任务,目前我们有两个任务,创建工程时会自动生成创建这两个任务的代码。
添加之前
添加之后
Timers and Semaphores(定时器和信号量)
通过该栏目可以添加软件定时器、互斥锁和信号量,然后就可以自动生成软件定时器、互斥锁和信号量的代码,但是一般情况是在写代码时我们自己添加相应的代码,而不是自动生成能,所以这个栏目不配置。
我们目前不添加定时器、互斥锁和信号量,编程时在代码中添加。
FreeRTOS Heap Usage(堆设置)
6、时钟配置
Fvco:VCO频率
SYSCLK:系统时钟频率
Fusb:USB,SDIO,RNG等的时钟频率
Fs:PLL输入时钟频率,可以是HSI,HSE等.
plln:主PLL倍频系数(PLL倍频),取值范围:64~432.
pllm:主PLL和音频PLL分频系数(PLL之前的分频),取值范围:2~63.
pllp:系统时钟的主PLL分频系数(PLL之后的分频),取值范围:2,4,6,8.(仅限这4个值!)
pllq:USB/SDIO/随机数产生器等的主PLL分频系数(PLL之后的分频),取值范围:2~15.
外部晶振为8M的时候,推荐值:plln=336,pllm=8,pllp=2
7、工程设置
生成代码
建议勾选上分文件管理。
我们在生成代码的时候,出现了如下提示,我们这里需要解决这个警告,否者会出问题。
我们前面介绍FreeRTOS
时说过,FreeRTOS线程切换的本质就是定时器定一个时间,定的时间到了就切换运行其它线程,在默认情况下会使用Systick
来作为RTOS
的时间片定时器,这里不凑巧的是HAL 库代码已经使用了 Systick,所以上面警告就是告诉你冲突了,我们需要解决这个冲突。
如何解决冲突?
先点击“否”,将 sys 中的 Systick 换成其它定时器,比如 tim1,RTOS 就使用 tim1 来做自己的 Systick。
做了以上设置后在生成代码时就不会再出现前面所提到的警告。
FreeRTOSConfig.h(配置头文件)
在生成的工程项目中的头文件目录下有一个FreeRTOSConfig.h
,如果是源码移植的话,我们应该修改这一个.h
来设置我们需要的配置,但是CubeMx
提供了图形化的配置界面,也就是我们前面所介绍的内容,我们进行了前面的配置后,关键配置信息就会记录到这个.h
中,最后 FreeRTOS
在工作时就会使用到.h 中的相关配置。
工程文件介绍
8、CMSIS RTOS API 概述
有关 API 概述的更多内容,大家可以查看CMSIS网页中的Function Overview的介绍。
RTOS API 分类
1、内核信息和控制 API
2、线程管理 API
3、延时 API
4、软件定时器 API
5、线程间通信 API
API 简介
1、内核信息和控制 API
osKernelInitialize : 初始化 RTOS
osKernelStart : 启动 RTOS
osKernelRunning : 检测 RTOS 是否正在运行
osKernelSysTick : 获取 Systick 定时器的当前计数值
2、线程管理 API
osThreadCreate : 创建一个线程,创建的线程处理 READY 状态,等待任务管理调度执行
osThreadTerminate : 终止线程
osThreadYield :主动让出 CPU,让其它线程运行如果不主动让出的话,要么时间片到切换,或者被其它高优先级线程抢占,也就是说,对于同等优先级的线程来说:靠时间片切换
对于不同优先级的线程来说:高的会抢占低的
osThreadGetId : 获取线程 ID
osThreadSetPriority : 修改线程的优先级
osThreadGetPriority : 获取线程的优先级
3、延时 API
osDelay : 延时函数
4、软件定时器 API
osTimerCreate :创建一个软件定时器
软件定时器的底层实际上用的要是硬件定时,但是会通过软件来管理,有关软件定时器后面
还会讲到。
osTimerStart : 开始定时计数,或者重新开始定时计数
osTimerStop : 让软件定时器停止计数
osTimerDelete : 删除软件定时器
5、线程间通信 API
信号、消息队列、邮箱队列是真正的通信,而互斥锁、信号量是借助通信来实现资源保护的手段,至于内存池,其实即是 malloc 的替代品。
5.1、信号
osSignalSet :发送信号
osSignalClear : 清除信号
osSignalWait : 接收信号
5.2、Message Queue
osMessageCreate : 创建一个消息队列
osMessagePut : 发送一个消息到消息队列中
osMessageGet : 从消息队列获取消息
5.3、Memory Pool
osPoolCreate : 创建一个内存池
osPoolAlloc : 通过内存池开辟空间
osPoolCAlloc :作用与 osPoolAlloc 一样,只不过会将空间清零
osPoolFree : 释放开辟的空间
5.4、Mail Queue
osMailCreate : 创建一个邮箱队列
osMailAlloc : 开辟空间
osMailCAlloc : 作用与 osMailAlloc 一样,只不过会将空间清零
osMailPut : 将空间指针发送给对方线程
osMailGet :接收空间指针
osMailFree : 释放开辟的空间
5.5、互斥锁
osMutexCreate : 创建一个互斥锁
osMutexWait : 加锁
osMutexRelease : 释放锁
osMutexDelete : 删除互斥锁,或者叫销毁互斥锁
5.6、信号量
osSemaphoreCreate : 创建一个信号量
osSemaphoreWait :等待资源
osSemaphoreRelease :释放资源
osSemaphoreDelete : 删除信号量
现在已经使用stm32cubemx生成了freertos的代码,接下来就是创建两个任务了。
以上是关于FreeRTOSFreeRTOS学习笔记— 使用STM32CubeMX对F407ZGT6移植FreeRTOS(CMSIS API)的主要内容,如果未能解决你的问题,请参考以下文章
FreeRTOSFreeRTOS学习笔记— 学习FreeRTOS的编程风格和本质
FreeRTOSFreeRTOS学习笔记(14)— FreeRTOS的消息队列(原生API)
FreeRTOSFreeRTOS学习笔记(13)— FreeRTOS创建任务和任务管理(原生API)
FreeRTOSFreeRTOS学习笔记— 中断+临界区的保护
FreeRTOSFreeRTOS学习笔记— 手写FreeRTOS双向链表/源码分析
FreeRTOSFreeRTOS学习笔记— 使用STM32CubeMX对F407ZGT6移植FreeRTOS(CMSIS API)