智果芯
服务于百万大学生和电子工程师!

使用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的代码,接下来就是创建两个任务了。

赞(1) 打赏
未经允许不得转载:智果芯 » 使用STM32CubeMX对F407ZGT6移植FreeRTOS(CMSIS API)

评论 抢沙发

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续给力更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫打赏

微信扫一扫打赏