电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
文章
操作系统RTOS为什么要搞两种API?
分 享
扫描二维码分享
操作系统RTOS为什么要搞两种API?
RTOS
操作系统
果果小师弟
关注
发布时间: 2021-09-28
丨
阅读: 5197
**摘要**:研究生没有假期,所以今天继续更新RTOS系列文章。本文以FreeRTOS为例,如果我们自己在官网下载源码然后手动移植代码就是使用FreeRTOS的原生API接口,如果我们使用STM32CubeMX来配置工程就是使用的CMSIS-API接口,是对FreeRTOS的原生API接口进行了封装。 # 一、RTOS为什么要搞两种API? CMSIS-RTOS API是ARM公司为RTOS内核制定的一套通用接口协议,它提供了一套「标准的API接口」,可以移植到各种各样的RTOS上,使得上层的软件、中间件、库以及其他组件在不同的RTOS之上都可以正常工作。 **简单的说就是**:
STM32是ARM内核的,这大家都知道。FreeRTOS是一种免费的开源的嵌入式操作系统。那它肯定就不属于ARM公司的对不对?这也很好理解。现在你要在我ARM内核上面使用不是我的RTOS产品,那么我ARM公司就要把你这个RTOS给打包一遍,封装成属于我的适合我的API接口协议类型的CMSIS-RTOS API。这样解释应该好一点
。 ![ ](https://img-blog.csdnimg.cn/8f247e25979148e9985ef4602587acd7.png) 在STM32上使用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来调用学习,而不需要再花时间去了解原生接口。 `STM32CubeMX`在提供FreeRTOS时也提供了CMSIS接口,后面具体举例时就可以看到封装的`.c `文件,总之ST对FreeRTOS封装出了CMSIS接口。 # 二、使用CubeMX配置FreeRTOS 以STM32F407ZGT6芯片为例,使用CubeMX配置FreeRTOS。 ## 1、新建工程 ![ ](https://img-blog.csdnimg.cn/20210413124429560.png) ## 2、外部晶振 选择外部晶振 ![ ](https://img-blog.csdnimg.cn/9c5e9b982d604cea963c9f0ebe443ea5.png) ## 4、下载器 选择四线的SWD接口下载器。 ![ ](https://img-blog.csdnimg.cn/b07060a32af449a69bfd921c4709bfc4.png) ## 5、打开FreeRTOS 这里可以看到STM32CubeMX只提供了一种RTOS就是FreeRTOS,并且提供的是CMSIS接口API,并没有提供原生的API,所以如果你想学习原生API就必须学会手动移植源码,使用STM32CubeMX来创建工程就必须使用ARM公司的CMSIS API ![](https://img-blog.csdnimg.cn/dd542288b45f474da8e5584fde2f7c2a.png) ![ ](https://img-blog.csdnimg.cn/a810a132d55e4a1b8462c26644d71087.png) ### Include paramters 这一个与`FreeRTOS`的原生接口有关,大家凡是看到`v`打头、`x`打头的函数,都是`FreeRTOS`的原生函数,我们现在要使用的是对原生接口封装后的CMSIS API,通过`Include paramter`的配置可以决定哪些原生接口被使用,哪些不被使用,不过有关`Include paramters`中的内容,一般情况下使用默认设置即可。 ![ ](https://img-blog.csdnimg.cn/eb0bd276db3b49b49211b8a79c20858b.png) ### User Constant 在该这栏目中可以添加宏定义,添加后就会在代码中自动生成宏定义的代码,但是我们一般不会这样添加,我们需要定义什么宏定义,我们一般都是直接在代码中编写。 ![](https://img-blog.csdnimg.cn/de7763ae03214cd992e9d33a200ef136.png) ### Task and Queues 在这一个栏目中,我们可以添加任务(线程),自动生成代码时就会生成创建任务(线程)的代码,一般会有一个默认任务,如果需要的话我们可以额外添加一个任务,当然我们也可以自己去写这些创建任务的代码。 添加一个任务(线程),默认任务+添加的任务,目前我们有两个任务,创建工程时会自动生成创建这两个任务的代码。 添加之前 ![添加之前](https://img-blog.csdnimg.cn/7e9106135ded48558f7bcdd86648d91f.png) 添加之后 ![添加之后](https://img-blog.csdnimg.cn/4f637a99d33847f49c0e178157788d6b.png) ### Timers and Semaphores 通过该栏目可以添加软件定时器、互斥锁和信号量,然后就可以自动生成软件定时器、互斥锁和信号量的代码,但是一般情况是在写代码时我们自己添加相应的代码,而不是自动生成能,所以这个栏目不配置。 ![ ](https://img-blog.csdnimg.cn/abbe9f35f6b74c1d9e9b85924a438698.png) 目前不添加定时器、互斥锁和信号量,编程时在代码中添加。 ### FreeRTOS Heap Usage(堆设置) ![ ](https://img-blog.csdnimg.cn/a7ebb6ebef544c24b05041a7e5771e0c.png) ## 6、时钟配置 ```bash 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** ![ ](https://img-blog.csdnimg.cn/4cf33e80c23744dda4995b48a0e3fa23.png) ## 7、工程设置 ![ ](https://img-blog.csdnimg.cn/c46cd02cc4084c7a895afde4dee3c873.png) ![ ](https://img-blog.csdnimg.cn/e42e272028c5469e8d49195a90f084a7.png) ## 8、生成代码 建议勾选上分文件管理。我们在生成代码的时候,出现了如下提示,我们这里需要解决这个警告,否者会出问题。 ![](https://img-blog.csdnimg.cn/406ca7b8b4f24da991f32fa3f5904721.png) 前面介绍`FreeRTOS`时说过,FreeRTOS线程切换的本质就是定时器定一个时间,定的时间到了就切换运行其它线程,在默认情况下会使用`Systick`来作为`RTOS`的时间片定时器,这里不凑巧的是HAL 库代码已经使用了 `Systick`,所以上面警告就是告诉你冲突了,我们需要解决这个冲突。 **如何解决冲突?** 先点击“否”,将 sys 中的 Systick 换成其它定时器,比如`tim1`,RTOS就使用 tim1来做自己的Systick。 ![ ](https://img-blog.csdnimg.cn/e0238c0d43474f2dbef1d1ee322163e2.png) 做了以上设置后在生成代码时就不会再出现前面所提到的警告。 **FreeRTOSConfig.h** 在生成的工程项目中的头文件目录下有一个`FreeRTOSConfig.h`,如果是源码移植的话,我们应该修改这一个`.h `来设置我们需要的配置,但是`CubeMx`提供了图形化的配置界面,也就是我们前面所介绍的内容,我们进行了前面的配置后,关键配置信息就会记录到这个`.h`中,最后 `FreeRTOS`在工作时就会使用到.h 中的相关配置。 # 3、工程文件介绍 ![ ](https://img-blog.csdnimg.cn/be7dadbb5c1347fabca846a7f6a4a00d.png) ![CMSIS API](https://img-blog.csdnimg.cn/3c8ed998809e4ea18459a87923860893.png) ![CMSIS API](https://img-blog.csdnimg.cn/d94a2caf4289418dbc4dd776b3bd2ac5.png) 怎么样是不是跟我们使用原生API创建的任务函数有点不一样,那是肯定不一样的。但是要明白这种方式只不过是给FreeRTOS**原生的API**穿上了一件华丽的外衣而已,函数内部其实还是调用的原生API,只不过没让你看见而已。 ![原生API](https://img-blog.csdnimg.cn/3ca5b9a6c8ea431fbd37b3ab2d59d883.png) ![原生API](https://img-blog.csdnimg.cn/760384585fe341e7a90ebe491eaa685e.png) 可以看出不管是CMSIS API还是原生API函数的创建过程基本是一样的,只不过函数不一样,所以也不要太过纠结使用哪一种API,后期这两种API小编都会分析它们之间的不同,包括消息队列、信号量、互斥量等等! CMSIS API函数主要有: ```c Signal Events //信号 osSignalSet : Set signal flags of a thread. osSignalClear : Reset signal flags of a thread. osSignalWait : Suspend execution until specific signal flags are set. Mutexes //互斥锁 osMutexCreate : Define and initialize a mutex. osMutexWait : Obtain a mutex or Wait until it becomes available. osMutexRelease : Release a mutex. osMutexDelete : Delete a mutex. Semaphores //信号量 osSemaphoreCreate : Define and initialize a semaphore. osSemaphoreWait : Obtain a semaphore token or Wait until it becomes available. osSemaphoreRelease : Release a semaphore token. osSemaphoreDelete : Delete a semaphore. Memory Pool //内存池 osPoolCreate : Define and initialize a fix-size memory pool. osPoolAlloc : Allocate a memory block. osPoolCAlloc : Allocate a memory block and zero-set this block. osPoolFree : Return a memory block to the memory pool. Message Queue //消息队列 osMessageCreate : Define and initialize a message queue. osMessagePut : Put a message into a message queue. osMessageGet : Get a message or suspend thread execution until message arrives. Mail Queue //邮箱队列 osMailCreate : Define and initialize a mail queue with fix-size memory blocks. osMailAlloc : Allocate a memory block. osMailCAlloc : Allocate a memory block and zero-set this block. osMailPut : Put a memory block into a mail queue. osMailGet : Get a mail or suspend thread execution until mail arrives. osMailFree : Return a memory block to the mail queue. ``` ![](https://cf02.ickimg.com/bbsimages/202109/6c4ecb4ec5805a6d7094dcda60b7fdbe.png)
原创作品,未经权利人授权禁止转载。详情见
转载须知
。
举报文章
点赞
(
1
)
果果小师弟
关注
评论
(0)
登录后可评论,请
登录
或
注册
相关文章推荐
MK-米客方德推出工业级存储卡
Beetle ESP32 C3 蓝牙数据收发
Beetle ESP32 C3 wifi联网获取实时天气信息
开箱测评Beetle ESP32-C3 (RISC-V芯片)模块
正点原子数控电源DP100测评
DP100试用评测-----开箱+初体验
Beetle ESP32 C3环境搭建
【花雕体验】16 使用Beetle ESP32 C3控制8X32位WS2812硬屏之二
X
你的打赏是对原创作者最大的认可
请选择打赏IC币的数量,一经提交无法退回 !
100IC币
500IC币
1000IC币
自定义
IC币
确定
X
提交成功 ! 谢谢您的支持
返回
我要举报该内容理由
×
广告及垃圾信息
抄袭或未经授权
其它举报理由
请输入您举报的理由(50字以内)
取消
提交