0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

RTOS为什么要搞两种API?

h1654155149.6853 来源:电子工程世界 作者:电子工程世界 2022-03-11 14:33 次阅读

本文以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。这样解释应该好一点。

在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、新建工程

ec13458c-54af-11ec-b2e9-dac502259ad0.png

2、外部晶振

选择外部晶振

ec4a9e74-54af-11ec-b2e9-dac502259ad0.png

4、下载器

选择四线的SWD接口下载器。

ec724690-54af-11ec-b2e9-dac502259ad0.png

5、打开FreeRTOS

这里可以看到STM32CubeMX只提供了一种RTOS就是FreeRTOS,并且提供的是CMSIS接口API,并没有提供原生的API,所以如果你想学习原生API就必须学会手动移植源码,使用STM32CubeMX来创建工程就必须使用ARM公司的CMSIS API

ec9da1be-54af-11ec-b2e9-dac502259ad0.png

ecc3036e-54af-11ec-b2e9-dac502259ad0.png

Include paramters

这一个与FreeRTOS的原生接口有关,大家凡是看到v打头、x打头的函数,都是FreeRTOS的原生函数,我们现在要使用的是对原生接口封装后的CMSIS API,通过Include paramter的配置可以决定哪些原生接口被使用,哪些不被使用,不过有关Include paramters中的内容,一般情况下使用默认设置即可。

ecfaecfc-54af-11ec-b2e9-dac502259ad0.png

User Constant

在该这栏目中可以添加宏定义,添加后就会在代码中自动生成宏定义的代码,但是我们一般不会这样添加,我们需要定义什么宏定义,我们一般都是直接在代码中编写。

ed341694-54af-11ec-b2e9-dac502259ad0.png

Task and Queues

在这一个栏目中,我们可以添加任务(线程),自动生成代码时就会生成创建任务(线程)的代码,一般会有一个默认任务,如果需要的话我们可以额外添加一个任务,当然我们也可以自己去写这些创建任务的代码。

添加一个任务(线程),默认任务+添加的任务,目前我们有两个任务,创建工程时会自动生成创建这两个任务的代码。

添加之前

ed64d540-54af-11ec-b2e9-dac502259ad0.png

添加之前

添加之后

edbcf324-54af-11ec-b2e9-dac502259ad0.png

添加之后

Timers and Semaphores

通过该栏目可以添加软件定时器、互斥锁和信号量,然后就可以自动生成软件定时器、互斥锁和信号量的代码,但是一般情况是在写代码时我们自己添加相应的代码,而不是自动生成能,所以这个栏目不配置。

edcf81f6-54af-11ec-b2e9-dac502259ad0.png

目前不添加定时器、互斥锁和信号量,编程时在代码中添加。

FreeRTOS Heap Usage(堆设置)

ee1bfffe-54af-11ec-b2e9-dac502259ad0.png

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

ee614c12-54af-11ec-b2e9-dac502259ad0.png

7、工程设置

ee914b56-54af-11ec-b2e9-dac502259ad0.png

eeb87820-54af-11ec-b2e9-dac502259ad0.png

8、生成代码

建议勾选上分文件管理。我们在生成代码的时候,出现了如下提示,我们这里需要解决这个警告,否者会出问题。

eedce2aa-54af-11ec-b2e9-dac502259ad0.png

前面介绍FreeRTOS时说过,FreeRTOS线程切换的本质就是定时器定一个时间,定的时间到了就切换运行其它线程,在默认情况下会使用Systick来作为RTOS的时间片定时器,这里不凑巧的是HAL 库代码已经使用了 Systick,所以上面警告就是告诉你冲突了,我们需要解决这个冲突。

如何解决冲突?

先点击“否”,将 sys 中的 Systick 换成其它定时器,比如tim1,RTOS就使用 tim1来做自己的Systick。

eef7defc-54af-11ec-b2e9-dac502259ad0.png

做了以上设置后在生成代码时就不会再出现前面所提到的警告。

FreeRTOSConfig.h

在生成的工程项目中的头文件目录下有一个FreeRTOSConfig.h,如果是源码移植的话,我们应该修改这一个.h来设置我们需要的配置,但是CubeMx提供了图形化的配置界面,也就是我们前面所介绍的内容,我们进行了前面的配置后,关键配置信息就会记录到这个.h中,最后 FreeRTOS在工作时就会使用到.h 中的相关配置。

3、工程文件介绍

ef116aca-54af-11ec-b2e9-dac502259ad0.png

ef3cd6d8-54af-11ec-b2e9-dac502259ad0.png

CMSIS API

ef7bd1ee-54af-11ec-b2e9-dac502259ad0.png

CMSIS API

怎么样是不是跟我们使用原生API创建的任务函数有点不一样,那是肯定不一样的。但是要明白这种方式只不过是给FreeRTOS原生的API穿上了一件华丽的外衣而已,函数内部其实还是调用的原生API,只不过没让你看见而已。

efb75386-54af-11ec-b2e9-dac502259ad0.png

原生API

eff75d5a-54af-11ec-b2e9-dac502259ad0.png

原生API

不管是CMSIS API还是原生API函数的创建过程基本是一样的,只不过函数不一样,所以也不要太过纠结使用哪一种API,后期这两种API都会分析它们之间的不同,包括消息队列、信号量、互斥量等等!

CMSIS API函数主要有:

SignalEvents//信号 osSignalSet:Setsignalflagsofathread. osSignalClear:Resetsignalflagsofathread. osSignalWait:Suspendexecutionuntilspecificsignalflagsareset. Mutexes//互斥锁 osMutexCreate:Defineandinitializeamutex. osMutexWait:ObtainamutexorWaituntilitbecomesavailable. osMutexRelease:Releaseamutex. osMutexDelete:Deleteamutex. Semaphores//信号量 osSemaphoreCreate:Defineandinitializeasemaphore. osSemaphoreWait:ObtainasemaphoretokenorWaituntilitbecomesavailable. osSemaphoreRelease:Releaseasemaphoretoken. osSemaphoreDelete:Deleteasemaphore. MemoryPool//内存池 osPoolCreate:Defineandinitializeafix-sizememorypool. osPoolAlloc:Allocateamemoryblock. osPoolCAlloc:Allocateamemoryblockandzero-setthisblock. osPoolFree:Returnamemoryblocktothememorypool. MessageQueue//消息队列 osMessageCreate:Defineandinitializeamessagequeue. osMessagePut:Putamessageintoamessagequeue. osMessageGet:Getamessageorsuspendthreadexecutionuntilmessagearrives. MailQueue//邮箱队列 osMailCreate:Defineandinitializeamailqueuewithfix-sizememoryblocks. osMailAlloc:Allocateamemoryblock. osMailCAlloc:Allocateamemoryblockandzero-setthisblock. osMailPut:Putamemoryblockintoamailqueue. osMailGet:Getamailorsuspendthreadexecutionuntilmailarrives. osMailFree:Returnamemoryblocktothemailqueue.

审核编辑 :李倩

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 接口协议
    +关注

    关注

    5

    文章

    38

    浏览量

    18394
  • 操作系统
    +关注

    关注

    37

    文章

    6287

    浏览量

    121886

原文标题:干货|操作系统RTOS为什么要搞两种API?

文章出处:【微信号:电子工程世界,微信公众号:电子工程世界】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    两种采样方式

    两种采样方式.....................................
    发表于 08-08 15:04

    求教关于两种单片机控制NRF24L01问题

    最近在240151和51之间通信没问题但是430和51之间 就没弄出结果。51我用的22.1184M晶振430用的8M晶振应该是时序问题 但是没搞出来。求知道啊~~~~~~~~~~~~~~不知道有没有搞过的两种不同单片机的啊
    发表于 04-16 13:33

    COMS电平和TTL电平辨别的方法?为什么分这两种电平?电子行业还有哪些电平?

    COMS电平和TTL电平辨别的方法?为什么分这两种电平?电子行业还有哪些电平?
    发表于 05-11 19:00

    顶层可以铺两种网络的铜吗?

    顶层可以铺两种网络的铜吗?VCC和GND,VCC那一块连接的器件多,所以打算把VCC放在一起,然后再铺个铜,其他的地方就铺GND。这样行吗?
    发表于 07-05 09:17

    怎么比较两种FPGA设计

    在比较两种设计时使用什么更实用?来自地图报告的占用切片或来自综合报告的实际比率以上来自于谷歌翻译以下为原文What is more practical to use in comparing two
    发表于 10-22 11:17

    如何学习RTOS

    希望机会来临时你不要有这种感觉。为了帮大家理清RTOS编程的套路,我们会在“裸机系统与多线程系统”章节简单的分析下这两种编程方式的区别,这个区别我称它为学习RTOS的命门,只要打通这个任督二脉,以后
    发表于 11-22 13:45

    TI-RTOS API函数Task_construct和Task_creat的作用是什么?

    明白Task_construct()和Task_creat()个函数分别是什么作用,有没有TI RTOS Kernel API 详细的说明文档?
    发表于 04-28 09:27

    请问TI-RTOSAPI手册哪里有?

    用了一段时间的TI-RTOS,但是很遗憾,每次想去找API都是靠看源代码,相关的手册也没有像freertos那样说明API的使用方式,请问有比较容易理解的API手册吗
    发表于 06-11 07:51

    两种芯片的区别

    我想知道28027和28034这这两种芯片有什么区别或者联系呢?希望各位大佬能够尽量讲解得通俗易懂一些,刚开始学习,有点懵,感谢感谢
    发表于 06-18 20:27

    SPI接口的两种模式

    ADI HMC系列该系列支持SPI接口,有两种通信MODE,SPI_OPEN_MODE和SPI_HMC_MODE。这两种模式由软件控制,根据上电时SCK和SEN谁先出现rise edge来选择,如果
    发表于 11-05 07:03

    介绍嵌入式开发中的两种典型input文件

    大家好,我是痞子衡,是正经技术的痞子。今天痞子衡给大家讲的是嵌入式开发里的project文件。前面节课里,痞子衡分别给大家介绍了嵌入式开发中的两种典型input文件:源文件(.c/....
    发表于 02-16 06:19

    HarmonyOS和OpenHarmony的DevEco两种IDE如何共存?

      用于 HarmonyOS 的 DevEco 和用于 OpenHarmony 的 DevEco 两种IDE如何共存?  我用的是MacOS,不能同时安装这个IDE,想现鲜API9就可以继续开发,想继续开发Harmony OS
    发表于 05-09 11:07

    RTOS提供两种和裸机不同的调用创建的函数的方法

    RTOS提供了两种和裸机不同的调用创建的函数的方法:一个是直接在main函数里面用线程调用;一个是在终端处,敲写命令行进行调用,和裸机基本类似;在想清楚这件事情之前,首先都必须要清楚怎么创建线程举
    发表于 11-01 11:30

    PX5 RTOS拥有对POSIX pthreads API的原生支持

    、CPU 性能和电池寿命资源有限的微控制器 (MCU)上。 第六:“为什么不使用现有的实时操作系统?问题是每个RTOS都有自己的专有API,而现存需求使得重新对本机API编码变得非常困难,大多数
    发表于 05-18 13:59

    现在是使用标准RTOS API的时间了吗?

    与嵌入式MCU一起使用的RTOS的名单很长,其中大多数都有自己的专有功能以及独特的API。有些API很好,有些则不太好。实际上,好的和不太好的RTOS
    发表于 05-30 11:08 146次阅读