打印

大家在使用STVD+COSMIC编译程序的时候,选择的是哪个优化

[复制链接]
8658|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
chenbb8|  楼主 | 2012-12-10 19:21 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
前天的时候,不小心将STM8L152C6写满了,无奈只好开启了Maximize execution speed这个默认的优化选项,以下简称speed。
开启Speed后,观察还占用了超过30000+字节的flash空间,在对程序结构进行优化,并且合并类似的操作为一个函数后,压缩到
了29139字节的大小。随后,在注释掉一个无用函数后发现,占用空间变小,也就是说speed模式不会删除无用函数!!!
另外在仿真的时候,发现speed模式已经会自动的将一些想同的C语句段落合并到一起了。
接着再记录了Minimize code size(+compact)和Split Function in Separate Sections(+split)这两个在以前注意到的比较强力的编译选项后,结果
如下:
  优化选项
  
  前天(字节)
  
  今天(字节)
  
  增加(字节)
  
  Speed
  
  29139
  
  30068
  
  929
  
  Split
  
  25713
  
  29688
  
  3975
  
  Compact
  
  25538
  
  27148
  
  1610
  
  Split+ Compact
  
  -
  
  26827
  
  -
  
在今天早上之前的时候我都还认为,只要用Split模式完成项目是没有问题的,结果今天给坑了- -!
speed模式才增加了929字节,Split模式居然增加了3975!!!
项目还要增加10分之一左右的功能,代码量大概就是5 6KB左右吧,
表格中前三个优化选项暂时没有发现有什么BUG,看网友们说COSMIC在深度优化的时候会有莫名其妙的BUG,
所以我对Compact甚至Split+ Compact带有一点点的畏惧。
大家说下,自己用这些优化的时候是不是真的遇到过BUG啊,真有BUG的话我也只能再申请买STM8L151C8了,估计会被上司狠狠的BS一番了- -!
沙发
chenbb8|  楼主 | 2012-12-10 19:23 | 只看该作者
另外我的英语很渣,Split Function in Separate Sections是“在独立的段中分割函数”的意思么,
就算是这个意思我也不懂真正的含义是什么

使用特权

评论回复
板凳
chenbb8|  楼主 | 2012-12-11 10:18 | 只看该作者
求解啊,现在程序写的很提心吊胆呢
不知道是放下进度去优化程序,还是继续写爆ROM为止- -!

使用特权

评论回复
地板
IJK| | 2012-12-11 10:52 | 只看该作者
COSMIC的 Split+ Compact优化功能用过,暂时没碰到问题,当时代码量也挺大,应该超过32kB了。

另外,如果ROM不够,可以考虑换ROM更大的芯片,比如 STM8L152C8

使用特权

评论回复
5
chenbb8|  楼主 | 2012-12-11 13:27 | 只看该作者
IJK 发表于 2012-12-11 10:52
COSMIC的 Split+ Compact优化功能用过,暂时没碰到问题,当时代码量也挺大,应该超过32kB了。

另外,如果R ...

多谢提醒,我也没有在Split+ Compact优化上发现什么问题~
等写到30K了,就去申请买STM8L151C8(我没用到LCD功能,
当初买152貌似是因为淘宝上32K的152比151便宜几毛钱

使用特权

评论回复
6
chenbb8|  楼主 | 2012-12-11 15:47 | 只看该作者
今天做试验的时候发现,compact模式不会删除无用函数,删除无用函数的模式是split。所以应该将这两个模式结合起来使用~
另外,在compact模式下,同一文件下,两个函数之间就算有相同的动作,也不会被优化成一个动作,
所以还是要手动将这两个函数中相同的部分提取出来作为一个单独的函数,以降低程序的体积。
谁要是有什么心得,请留下来以方便后来者啊

使用特权

评论回复
7
uet_cache| | 2012-12-11 15:54 | 只看该作者
你是不是用库写的程序,如果用库写的程序可以将库中没有用到的函数全删掉。或者精简一些改用寄存器操作。多大的程序,在,那样不会占很空间。
我以前用库写程序,很快就没空间,后面就是那样解决。靠优化,省不了多少空间。

使用特权

评论回复
8
chenbb8|  楼主 | 2012-12-11 17:27 | 只看该作者
uet_cache 发表于 2012-12-11 15:54
你是不是用库写的程序,如果用库写的程序可以将库中没有用到的函数全删掉。或者精简一些改用寄存器操作。多 ...

split模式有删除无用函数的功能,不过开启的方式不太直观,很多人没发现吧
我没用库,直接操作寄存器的

使用特权

评论回复
9
uet_cache| | 2012-12-11 17:43 | 只看该作者
i没有用库,编程用编到这么大的空间啊。

你是不是浮点数运算或FOR语句 SWITCH语句用的多啊

使用特权

评论回复
10
chenbb8|  楼主 | 2012-12-11 20:43 | 只看该作者
uet_cache 发表于 2012-12-11 17:43
i没有用库,编程用编到这么大的空间啊。

你是不是浮点数运算或FOR语句 SWITCH语句用的多啊 ...

switch语句用的是比较多,程序应该也有一万多行:(
另外使用了QP NANO这个状态机框架,大量的运用了指针,而不是直接读取,这也会引起体积变大

使用特权

评论回复
11
uet_cache| | 2012-12-11 20:48 | 只看该作者
能简单化,最好不要复杂化。这是我的编程原则。
呵呵,楼主还是自己做主吧。

使用特权

评论回复
12
chenbb8|  楼主 | 2012-12-11 22:53 | 只看该作者
uet_cache 发表于 2012-12-11 20:48
能简单化,最好不要复杂化。这是我的编程原则。
呵呵,楼主还是自己做主吧。 ...

嘿嘿,谁用谁知道~~
这个技术适合于快速建模开发程序,降低模块间的耦合度,减少BUG。
缺点当然就是代码量比较大,不过也可以手工将状态函数中的指针访问对象的方法
全替换成直接操作对象,应该能降低2 3K的容量。

使用特权

评论回复
13
uet_cache| | 2012-12-12 08:32 | 只看该作者
:)恩

使用特权

评论回复
14
janly| | 2012-12-13 00:14 | 只看该作者
用iar试一试

使用特权

评论回复
15
chenbb8|  楼主 | 2012-12-13 09:47 | 只看该作者
janly 发表于 2012-12-13 00:14
用iar试一试

恩,split模式已经无法编译了,split+compact模式现在的代码在30000字节上下浮动(边写边优化)
等买了64K的单片机,就试下IAR,不过我看一些老帖子里的意思是IAR的优化比不过cosmic~

使用特权

评论回复
16
janly| | 2012-12-13 22:02 | 只看该作者
代码的优化很大部分取决于自己所写的C语言代码,可以共用的程序尽可能提取出来作为公共调用。有时候同样的一段代码换一种方式编译后的代码会小很多,所以可以看看自己的代码哪些认为是冗余的先优化后再编译;

使用特权

评论回复
17
sy_lixiang| | 2012-12-30 17:46 | 只看该作者
别的真不敢乱说,但用split优化的时候, 在线调试,经常遇到断点无法打的情况,不一定会跳到什么地方去。程序执行混乱。

还没有仔细研究汇编,但肯定和优化是有关系的。

我把程序调成-no后,就没有上述问题了。

楼主现在进展如何了?

使用特权

评论回复
18
chenbb8|  楼主 | 2012-12-31 19:04 | 只看该作者
sy_lixiang 发表于 2012-12-30 17:46
别的真不敢乱说,但用split优化的时候, 在线调试,经常遇到断点无法打的情况,不一定会跳到什么地方去。程 ...

现在用的是split优化选项,单片机改64K的了~程序已经写完,37000字节出头吧。
默认优化(神马优化选项都不勾选)就会出现你说的那种执行混乱的状况,这就是所谓的优化啊~
因为你的代码中有相同的地方,要合并起来节省空间。
我的代码中现在仿真的时候看不到这种情况,一方面是因为我将相同的代码制作成了单独的函数,
其次是因为使用了函数指针状态机,有些相同的代码因为相隔不同的状态函数,所以无法优化合并,
这种代码在switch…case嵌套结构的状态机实现方式是可以合并的,前提是没有将每个状态-信号下的
相应动作制作成独立的函数……
因为cosmic的优化貌似只是在函数内优化,不能跨越不同的函数

使用特权

评论回复
19
sy_lixiang| | 2012-12-31 22:33 | 只看该作者
楼主说的还是很在理的。不过有的东西我现在知道的也不多。
我这几天在线调试的时候,就是在switch内部不同case但语句相同的地方乱的。
向你学习你的做法。

使用特权

评论回复
20
tovax| | 2016-8-1 13:39 | 只看该作者
谢谢,Split+ Compact

使用特权

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

本版积分规则

个人签名:努力中

2

主题

559

帖子

4

粉丝