RTOS为什么要搞两种API?

网友投稿 511 2022-10-22

RTOS为什么要搞两种API?

在STM32上使用FreeRTOS,可以直接使用FreeRTOS的原生接口(原生API),源码移植就是使用的是原生API接口,这无可厚非。你也可以选择CMSIS接口,实际上CMSIS接口和原生接口都是类似的,但是如果你学会了CMSIS的RTOS接口之后,也能自学对应的原生接口,当然还是有区别的,因此还是需要花时间去熟悉的。

STM32CubeMX在提供FreeRTOS时也提供了CMSIS接口,后面具体举例时就可以看到封装的.c文件,总之ST对FreeRTOS封装出了CMSIS接口。

二、使用CubeMX配置FreeRTOS

以STM32F407ZGT6芯片为例,使用CubeMX配置FreeRTOS。

1、新建工程

2、外部晶振

选择外部晶振

4、下载器

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

5、打开FreeRTOS

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

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

User Constant

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

Task and Queues

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

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

添加之前

添加之前

添加之后

添加之后

FreeRTOS Heap Usage(堆设置)

外部晶振为8M的时候,推荐值:plln=336,pllm=8,pllp=2

7、工程设置

8、生成代码

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

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

如何解决冲突?

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

FreeRTOSConfig.h

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

3、工程文件介绍

CMSIS API

CMSIS API

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

原生API

原生API

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

CMSIS API函数主要有:

审核编辑 :李倩

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Docker容器引擎——安装部署和镜像容器的基本操作
下一篇:docker 的基本操作指令 2
相关文章

 发表评论

暂时没有评论,来抢沙发吧~