我是一名stm32初学者。购买了一个开发板并附带了视频教学。在新建一个stm32工程中,视频里要求将一系列的文件添加到工程并选择好path。其中有一个叫core_cm3.c的文件,我有一次忘记添加了,但编译居然没有出错而且程序能运行。后来我又试了一下把core_cm3.c删除了,但keil依旧没有报错。stm32说明书里讲到core_cm3.c这个文件对stm32是很重要的,那我想知道问什么不添加core_cm3.c不会报错?而且stm32f10x.h文件里面#include<core_cm3.c>的,也就是core_cm3的.h文件是用到的(我试过删除core_cm3.h之后编译会出错)。有人告诉我只是我程序没用到core_cm3.c里面的一些功能,但我程序里面有#include<core_cm3.h>,难道说有core_cm3.h但不需要core_cm3.c吗?
这是怎么回事呢?请知道我朋友告诉我一下,谢谢你们
你好,这个问题问的很好,我们正在联系ST的工程师帮忙看,请耐心等待他们回复
你好,好的那我耐心的等待。谢谢
刚刚收到ST的来信,他们已经在看这个问题了,正在安排工程师帮忙回复
jonny 你好
下面是我对这个问题的一些理解。希望能解答你的疑惑。
Core_cm3.c里有一些汇编关键字的宏定义,支持不同的编译器,还提供了访问内核寄存器的函数。在CMSIS升级到2.0版本时CMSIS的软件结构做了一些调整,去掉了core_cm3.c。ST的固件库也相应做了修改。在新的版本里只需要包含core_cm3.h,core_cmFunc.h,core_cmInstr.h,不需要core_cm3.c文件了。
好的
STMicroelectronics 的 amanda_s 帮忙回在下面了,你可以看看
Amanda_s 你好
谢谢你的回答。只是说针对这个core_cm3只需要.h文件不需要.c文件,还是别的文件都如此呢?据我所知keil里的文件很多都是一个.c文件加一个.h文件并存的,见过的很多函数都是function.c和function.h的,然后调用的时候就#include<function.h>。
我这里说的只是针对core_cm3.c/core_cm3.h文件。
好的,谢谢你了。
感谢你对我的帮助,这stm32的学习之路看来还很长
没关系,大家都是从零开始的,欢迎经常来交流。也很感谢ST的amanda_s 的大力协助。
此外,如果你对Cortex-M系列MCU有兴趣的话,也欢迎参考ARM的专家jyiu写的一系列文章。
其中有一篇我翻译了:如何从零开始利用ARM微控制器相应资源
你可以看看。
祝你早日成为STM32高手
很高兴能帮助到你。有关STM32的问题,你还可以去21ic的ST MCU论坛,那里除了我们的FAE会回答问题,还有很多热心的网友可以帮助你解决问题。
往期的精华帖里也有很多东西可以学习。
我看代码core_cm3.h里面包括了一些函数的定义、宏定义,实际是把.c里面的内容放到了.h中。
不知道ARM这样做的目的是为何?
Hi Moyanming
在core_cm3.h中定义的是static inline类型的函数。inline表示这些函数在被调用时是直接将代码嵌入在被调用的地方,这样可以加快调用速度。static是为了防止在多处被引用时,出现重名的编译错误。一般inline函数最好放在.h文件中,在需要使用其中函数的C文件中,只需要包含该头文件就可以了。
这是我的理解,不对请指出。
inline没有疑问。
static之所以能够达到amanda_s提到的作用,是因为static是文件局部可见的,当include该.h后,带有static的函数(或变量)只能在本文件可见。如果多个文件都引用了.h,那么该static局部函数只存在与对应的文件内;否则如果不加static,可能出现重复定义的错误。是不是这样?
我主要是疑惑本来可以存在core_cm3.c的,为什么把该c中的内容放到了.h中(这违背了一些模块化的思想),是因为简单吗?还是因为这些.c中的函数本来也就是很简单的函数,比如汇编代码,不如直接放在.h中,做成static include的形式,既没有任何性能损失,又使目录文件结构简单的呢?
这个或许也跟ARM有关了,是否songbin知道些内幕呢?