我是一名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吗?
这是怎么回事呢?请知道我朋友告诉我一下,谢谢你们
我看代码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知道些内幕呢?
如果把函数实现放在1.C文件中,那么在另一个2.C文件引用的时候,2.C并不知道这个函数实现代码是大还是小, 如果是很大的话不适合inline.如果这个函数比较小适合的话 所以放在h文件里。 static 可以避免重复定义 和 更容易inline.
嗯,可以看到代码大小或许是非常合理的解释。但缺点是暴露了实现代码。