打印
[MCU]

怎么单独编译一个C文件生成HEX或BIN文件

[复制链接]
5996|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lr2131|  楼主 | 2014-5-21 20:29 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我单片机上有3个工程,这3个工程都会用到一些相同的函数,我不想让3分工程在编译的时候都编译到各自的烧录文件中,,然后再烧到flash里,这样做,比较浪费空间。

我想单独把这些公用的函数编译成HEX或BIN文件,单独烧写到内部flash里面。在编译的时候,我记下每个函数的首地址,然后其他3个工程中使用函数指针,就可以运行这些公用函数。

同样的,以后还有些公用的数据也想像这么干,但不知道怎么做,怎么创建一份这些公用函数的工程。

相关帖子

沙发
wangch_sh| | 2014-5-21 21:08 | 只看该作者
为什么要用三个工程呢?

使用特权

评论回复
板凳
nbldelnan| | 2014-5-22 08:51 | 只看该作者
求同!帮顶!!

使用特权

评论回复
地板
ayb_ice| | 2014-5-22 09:16 | 只看该作者
本帖最后由 ayb_ice 于 2014-5-22 09:18 编辑

这个没有可能的

"我单片机上有3个工程,"
这个说法本身就有问题吧

使用特权

评论回复
5
lr2131|  楼主 | 2014-5-22 09:31 | 只看该作者
ayb_ice 发表于 2014-5-22 09:16
这个没有可能的

"我单片机上有3个工程,"

那要怎么说才是没问题的呢?

使用特权

评论回复
6
lr2131|  楼主 | 2014-5-22 09:32 | 只看该作者
ayb_ice 发表于 2014-5-22 09:16
这个没有可能的

"我单片机上有3个工程,"

单片机上一个IAP,一个APP。这样的方式应该很常见吧,再加个备份用的APP也没什么吧.

使用特权

评论回复
7
dirtwillfly| | 2014-5-22 09:36 | 只看该作者
可以编译成库文件,然后在三个工程里使用

使用特权

评论回复
8
ayb_ice| | 2014-5-22 10:07 | 只看该作者
lr2131 发表于 2014-5-22 09:32
单片机上一个IAP,一个APP。这样的方式应该很常见吧,再加个备份用的APP也没什么吧. ...

将IAP的地址空间保留出来就可以了吧

使用特权

评论回复
9
lr2131|  楼主 | 2014-5-22 10:44 | 只看该作者
dirtwillfly 发表于 2014-5-22 09:36
可以编译成库文件,然后在三个工程里使用

编译成库之后,这3个工程在编译时,一样会链接这个库,然后编译到烧录文件中吧。

那单片机内部Flash一样还是有这公用函数库的3分拷贝吧。

使用特权

评论回复
10
lr2131|  楼主 | 2014-5-22 10:46 | 只看该作者
ayb_ice 发表于 2014-5-22 10:07
将IAP的地址空间保留出来就可以了吧

不明白你的意思

使用特权

评论回复
11
dirtwillfly| | 2014-5-22 10:53 | 只看该作者
lr2131 发表于 2014-5-22 10:44
编译成库之后,这3个工程在编译时,一样会链接这个库,然后编译到烧录文件中吧。

那单片机内部Flash一样 ...

是的

使用特权

评论回复
12
ayb_ice| | 2014-5-22 11:24 | 只看该作者
lr2131 发表于 2014-5-22 10:46
不明白你的意思

那个工程,将公共文件编译烧录进MCU(公共函数地址固定不变)

其它工程用强制指针调用公共函数即可,烧录时不擦除保留空间,也不烧录保留空间

我并没有实际搞过这个,但好象就是这样搞的

使用特权

评论回复
13
lr2131|  楼主 | 2014-5-22 11:33 | 只看该作者
dirtwillfly 发表于 2014-5-22 10:53
是的

我就是不想让公用的代码或数据在flash中有多份重复,才想要用这样的方法,相当于是动态链接的方式吧,静态方式浪费空间。

使用特权

评论回复
14
lanmp| | 2014-5-22 11:37 | 只看该作者
函数指针

使用特权

评论回复
15
lr2131|  楼主 | 2014-5-22 11:39 | 只看该作者
ayb_ice 发表于 2014-5-22 11:24
那个工程,将公共文件编译烧录进MCU(公共函数地址固定不变)

其它工程用强制指针调用公共函数即可,烧录时 ...

你说的方法感觉应该可以,把公用函数都放到一个不太变动的工程中,从编译文件中拿到每个公用函数的地址,然后其他工程中用函数指针的方式调用函数。

使用特权

评论回复
16
lr2131|  楼主 | 2014-5-22 11:40 | 只看该作者
lanmp 发表于 2014-5-22 11:37
函数指针

函数指针,然后呢?

使用特权

评论回复
17
lanmp| | 2014-5-22 11:42 | 只看该作者
把绝对地址付给函数指针。最好不要传递参数,或者干脆使用全局变量。

使用特权

评论回复
18
lr2131|  楼主 | 2014-5-22 12:12 | 只看该作者
lanmp 发表于 2014-5-22 11:42
把绝对地址付给函数指针。最好不要传递参数,或者干脆使用全局变量。

是把绝对地址赋给函数指针啊,带参数可以啊,怎么不可以呢?
只是这些公用函数必须是可重入函数,里面不能使用静态变量,不管是全局的还是局部的。

使用特权

评论回复
19
贾丝文| | 2014-5-22 14:11 | 只看该作者
编译第一个文件时,把函数指定绝对地址,第二个文件声明这个函数地址,就可以直接用了

使用特权

评论回复
20
lr2131|  楼主 | 2014-5-22 15:55 | 只看该作者
贾丝文 发表于 2014-5-22 14:11
编译第一个文件时,把函数指定绝对地址,第二个文件声明这个函数地址,就可以直接用了
...

这个我知道

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

203

帖子

0

粉丝