总见上官一直支持IAR,我今天也突然有兴致换个编译器试试,
移植了cosmic下的一个stm8s103F3的工程,编译成功,结果发现真杯具-_-
cosmic下 data:58 flash:2578 堆栈未知(我没做堆栈占用信息的统计工具) 我并没有使用开代码压缩,即使开了也就再少几十字节,我写的代码一向注重优化了。。。
结果在IAR下
2 143 bytes of readonly code memory
1 105 bytes of readonly data memory
326 bytes of readwrite data memory
杯具。。。等IAR懂了stm8的指令,等IAR懂(u8)(a>>8)只取低8位就可以不需要真的移8次,要等到什么时候-_-
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
(原文件名:Image0019.JPG)
IAR生成map
(原文件名:Image0020.JPG)
RAM用量,如果不考虑堆栈,不同的编译器是差不多的。
因为用基本上等于全局变量和静态变量的多少,而程序里面的全局变量和静态变量多少是固定的,
对于iar来说,不用的全局变量和静态变量不会连接到目标文件中,貌似cosmic也有这样的功能,
因此,cosmic与iar RAM用量应该差不多,iar仅仅是多了16字节虚拟寄存器。
MAP里面有:
"A1": place at start of [0x000000-0x0000ff] { rw section .vregs }; //RAM最前端,先放置16个虚拟寄存器
"A2": place at end of [0x000000-0x0017ff] { block CSTACK }; //堆栈从RAM最尾端开始放置
"A3": place at start of [0x008000-0x00ffff] { block INTVEC }; //FLASH最前端,放置向量表
"P3": place in [from 0x008000 to 0x00ffff] {
ro section .far.data_init, ro section .huge.data_init, ro }; //其他常量,程序段在放置在向量表后面
IAR堆栈是从RAM最尾端开始放置,
如果你把堆栈大小设置为1,可以发现IAR把最后一个字节分配做了堆栈。
反观COSMIC,堆栈固定在512字节(貌似可以改,但比较麻烦),楼主的RAM用量统计并没有把这个包括在内,不如IAR能直接设置堆栈大小灵活。
不过我个人观点,这个值并不十分重要。
因为IAR堆栈是从RAM尾端开始的(某种程度上可以看做把剩余全部RAM都当做堆栈,如果不考虑STM8堆栈硬件制约),
其实这个值设置多少,在运行时并没有关系。
(即使堆栈设置为1字节,程序也应该可以正常运行)
只是在编译器的时候看看剩余RAM能能提供足够的堆栈,不足则会报错。
2 143 bytes of readonly code memory
1 105 bytes of readonly data memory
---------------------------------------
flash用量是2 143 + 1 105
不过,还是坚信,iar优化肯定会超过cosmic 。
就看IAR是否重视STM8了。
cosmic的ram 有额外的x_reg,y_reg共四字节,58-4=54
iar有16字节的vreg,326-256-16=54
flash优化方面,我观察了下汇编。只能说目前真的不怎么样,连ST7的指令集都不会用,似乎是只使用了标准6502指令集。。。
[IAR]
8 {
9 APump.Tick = MS(500);
000006 A67D LD A, #0x7d
000008 C70000 LD L:APump, A
10 APump.CurLevel = LEVEL_STOP;
00000B 4F CLR A
00000C C70000 LD L:APump + 2, A
11 APump.IsUpdate = true;
00000F A601 LD A, #0x1
000011 CA0000 OR A, L:APump + 3
000014 C70000 LD L:APump + 3, A
000017 2000 JRA L:??APump_DoEvent_1
12 }
[cosmic]
458 0005 357d0000 mov _APump,#125
459 ; 10 APump.CurLevel = LEVEL_STOP;
460 0009 3f02 clr _APump+2
461 ; 11 APump.IsUpdate = true;
463 000b 2011 jp LC001 (后面有相同的语句,合并优化,故跳转后面去了)
...
481 001e 72100003 bset _APump+3,#0
我之前还用错了。。。IAR的代码还更大些,
有些位变量,我是用了cosmic的_Bool来定义的,在IAR中被认做了unsigned char
一周热门 更多>