打印
[技术讨论]

KEIL是否有内置的输出编译后程序大小的宏定义

[复制链接]
1793|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tao180539|  楼主 | 2019-1-18 16:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tao180539 于 2019-1-18 17:31 编辑

KEIL是否有内置的输出编译后程序大小的宏定义,可以通过printf和KEIL内在的宏定义输出编译后程序的大小,就像通过下面的宏定义自动输出编译的时间。

printf("%s_%s_%d_%d\n", __DATE__, __TIME__, sizeof(__DATE__),sizeof(__TIME__));


就是把编译后的bin文件的大小自动赋值给一个变量,或者宏定义。


相关帖子

沙发
你瞅啥| | 2019-1-19 16:21 | 只看该作者
用你的脚后跟想想,最终代码长度是链接器给出来的,编译的时候编译器都不知道代码有多大,怎么可能实现你的梦想?

使用特权

评论回复
板凳
tao180539|  楼主 | 2019-1-21 08:40 | 只看该作者
你瞅啥 发表于 2019-1-19 16:21
用你的脚后跟想想,最终代码长度是链接器给出来的,编译的时候编译器都不知道代码有多大,怎么可能实现你的 ...

使用特权

评论回复
地板
tao180539|  楼主 | 2019-1-21 08:45 | 只看该作者

其中平时没注意过啥连接器和编译器,一直用KEIL,也没太关注具体的编译原理。

使用特权

评论回复
5
tao180539|  楼主 | 2019-1-21 08:46 | 只看该作者
你瞅啥 发表于 2019-1-19 16:21
用你的脚后跟想想,最终代码长度是链接器给出来的,编译的时候编译器都不知道代码有多大,怎么可能实现你的 ...

其中平时没注意过啥连接器和编译器,一直用KEIL,也没太关注具体的编译原理

使用特权

评论回复
6
tao180539|  楼主 | 2019-1-24 16:59 | 只看该作者
你瞅啥 发表于 2019-1-19 16:21
用你的脚后跟想想,最终代码长度是链接器给出来的,编译的时候编译器都不知道代码有多大,怎么可能实现你的 ...

是否可以写个函数来实现呢

使用特权

评论回复
7
你瞅啥| | 2019-1-24 17:10 | 只看该作者
tao180539 发表于 2019-1-24 16:59
是否可以写个函数来实现呢

那办法就多了,我随便想了3个:

1)定义一个变量,并且放到一个单独的section里面,具体怎么放参考编译器手册。然后根据编译器不同修改链接脚本,对于cortex-m内核的单片机来说,编译器是IAR修改icf文件,编译器GCC修改ld文件,编译器MDK修改sct文件,确保这个section在flash或者ram的最后面。那么运行时,读取这个变量的绝对地址,就可以知道编译器占用的flash/ram长度有多大了。

2)自己写个windows应用程序,按纯文本方式读取map文件,从中提取flash/ram长度,然后修改编译后的hex文件,在一个绝对flash地址内写入flash/ram长度。程序运行时,读取这个绝对地址的值,就是你要的数据。

3)程序内加入以下代码:按顺序从头读取flash的值,如果遇到连续的1024个(你也可以改成你喜欢的值)0xff,则认为第一个0xff就是程序结束的地址,之前的长度就是编译后的flash长度。

使用特权

评论回复
8
tao180539|  楼主 | 2019-1-25 08:31 | 只看该作者
你瞅啥 发表于 2019-1-24 17:10
那办法就多了,我随便想了3个:

1)定义一个变量,并且放到一个单独的section里面,具体怎么放参考编译 ...

加你个QQ方便吗

使用特权

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

本版积分规则

321

主题

515

帖子

3

粉丝