搜索
bottom↓
楼主: snoopyzz

[stm8s]IAR for stm8果然是杯具-_-

[复制链接]

出0入0汤圆

发表于 2010-7-30 19:01:04 | 显示全部楼层 |阅读模式
总见上官一直支持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次,要等到什么时候-_-

出0入0汤圆

 楼主| 发表于 2010-7-30 19:04:16 | 显示全部楼层
ram为什么多了这么多?

出0入90汤圆

发表于 2010-7-30 19:32:45 | 显示全部楼层
编译的时候会产生2组编译信息,我觉得上面一组才是真的,下面这组的RAM会占用太多。

出0入0汤圆

发表于 2010-7-30 19:38:48 | 显示全部楼层
是LZ杯具而不是iar杯具,不解析

出0入0汤圆

发表于 2010-7-30 19:55:39 | 显示全部楼层
lz杯具了,用好了IAR你会发现他很爽,当然,现在版本还太低,有很多不足。

出0入0汤圆

发表于 2010-7-30 20:55:31 | 显示全部楼层
IAR统计RAM统计包含堆栈了的。

出0入0汤圆

发表于 2010-7-30 21:00:51 | 显示全部楼层
回复【楼主位】snoopyzz

我并没有使用开代码压缩,即使开了也就再少几十字节,我写的代码一向注重优化了。。。

-----------------------------------------------------------------------

用iar你就知道,不开优化与开优化时天壤之别。

出0入0汤圆

发表于 2010-7-30 21:10:48 | 显示全部楼层
cosmic不会用寄存器,
iar不会stm8指令,

---------------
从长远讲,cosmic可能一直悲剧下去。
iar提升空间应该还有很多。

出0入162汤圆

发表于 2010-7-30 22:01:18 | 显示全部楼层
iar代码效率很低很低

同样一个程序在iar下最大压缩,只比cosmic未压缩的文件下小一点点

同样不压缩,iar的程序庞大的惊人


cosmic的压缩很狗屎,只有最大压缩。
我一最大压缩,程序运行就不正常了,不象iar可以调整优化选项

cosmic我只能不压缩了,大小还好

出0入0汤圆

 楼主| 发表于 2010-7-31 08:39:52 | 显示全部楼层
这是cosmic的map文件输出信息

start 00008080 end 0000843e length   958 segment .const
start 00008477 end 000089fe length  1415 segment .text
start 00004000 end 00004000 length     0 segment .eeprom
start 00004000 end 00004000 length     0 segment .EEPROM_CODE
start 00000000 end 00000031 length    49 segment .bsct, initialized
start 00008446 end 00008477 length    49 segment .bsct, from
start 00000031 end 0000003a length     9 segment .ubsct
start 0000003a end 0000003a length     0 segment .bit
start 0000003a end 0000003a length     0 segment .share
start 00000100 end 00000100 length     0 segment .data
start 00000100 end 00000100 length     0 segment .bss
start 00008000 end 00008080 length   128 segment .const
start 0000843e end 00008446 length     8 segment .init

可以看到 ,常量是958字节(数据表格)+128字节(中断向量)=1086字节,
应该对应IAR的Read only data....


查了下map信号 stack usage 是 18
函数调用关系如下

                              ---------
                              Call tree
                              ---------
   1 > _main: (2)
   2      + _APump_DoEvent: (2)
   3      + _CLK_Init: (2)
   4      + _Init_Port: (2)
   5      + _PWM_DoEvent: (2)
   6      + _PWM_Init: (2)
   7      + _Recv_DoEvent: (2)
   8      |    + _Recv_DoCode: (2)
   9      |    |    + _Check_Flash: (4)
  10      |    |    |    + _CRC16_Update: (3)
          |    |    |
          |    |
          |
  11      + _Table_DoEvent: (6)
  12      + _Timer_Init: (2)
  13      + _Valve_DoEvent: (2)
  14      + _Vibrate_DoEvent1: (6)
  15      + _Vibrate_DoEvent2: (5)
  16      + __stext: (0)
      
  17 > f_IRQ_NonHandled: (5)
  18 > f_Recv_Signal: (5)
  19 > f_TIM4_Update: (5)
  20   _APump_DoEvent --> 2
  21   _CLK_Init --> 3
  22   _CRC16_Update --> 10
  23   _Check_Flash --> 9
  24   _Init_Port --> 4
  25   _PWM_DoEvent --> 5
  26   _PWM_Init --> 6
  27   _Recv_DoCode --> 8
  28   _Recv_DoEvent --> 7
  29   _Table_DoEvent --> 11
  30   _Timer_Init --> 12
  31   _Valve_DoEvent --> 13
  32   _Vibrate_DoEvent1 --> 14
  33   _Vibrate_DoEvent2 --> 15
  34   __stext --> 16

还是cosmic的优化程序高,上官兄

怎么样也没到IAR那么恐怖占用RAM的程度。。。。

另外4L,既然这样,我目前不会考虑用IAR做stm8的项目,所以我自己当然是不会杯具的了
从st7起我就开始用cosmic,6502这一体系的汇编更是很早就开始用,
看的出编译出代码的优劣,编译器犯傻时我也经常会嵌入汇编,目前看来IAR生成的指令相比cosmic要不合理的多

出0入0汤圆

发表于 2010-7-31 08:56:24 | 显示全部楼层
2 143 bytes of readonly  code memory  ----->iar代码
1 105 bytes of readonly  data memory  ----->iar数据表格
326 bytes of readwrite data memory    ----->iar所有ram,包括16个虚拟寄存器,默认256byte堆栈,用户ram

默认堆栈是很大很大的,要用户按需设置!!!!

出0入0汤圆

 楼主| 发表于 2010-7-31 09:01:38 | 显示全部楼层
另外,上官兄

对于这个工程,IAR最高等级优化效果如下

  2 143 bytes of readonly  code memory
  1 105 bytes of readonly  data memory
    326 bytes of readwrite data memory
不优化如下
  2 830 bytes of readonly  code memory
  1 105 bytes of readonly  data memory
    326 bytes of readwrite data memory
相差的确不少

ps. cosmic的优化默认就是开的,只是代码压缩没开
我如果禁止cosmic优化,
ram还是58,flash是2974,
比2558多了416字节。

出0入0汤圆

 楼主| 发表于 2010-7-31 09:09:52 | 显示全部楼层
回复【11楼】dianzidog
2 143 bytes of readonly  code memory  ----->iar代码
1 105 bytes of readonly  data memory  ----->iar数据表格
326 bytes of readwrite data memory    ----->iar所有ram,包括16个虚拟寄存器,默认256byte堆栈,用户ram
默认堆栈是很大很大的,要用户按需设置!!!!
-----------------------------------------------------------------------

请问下,我刚装IAR,不大懂,在哪里设置?
还有这256字节堆栈是作什么用的??
在cosmic中,变量区向上增长,堆栈向下增长,编译器会识别出函数调用关系,如果两个区有重合,就会报错的

原来装IAR是因为刚买块STM32的开发板,当然首选用IAR ,想着STM8也一起统一下编译器,目前看来是不现实了

出0入0汤圆

发表于 2010-7-31 09:22:36 | 显示全部楼层
IAR设置堆栈

(原文件名: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能直接设置堆栈大小灵活。

出0入0汤圆

 楼主| 发表于 2010-7-31 09:30:15 | 显示全部楼层
谢谢上官兄,map我倒是知道如何开启的,

再问下,堆栈一般设多少?如何知道是否合适?

出0入0汤圆

发表于 2010-7-31 09:39:35 | 显示全部楼层
一般设置100个字节究差不多了。

不过我个人观点,这个值并不十分重要。

因为IAR堆栈是从RAM尾端开始的(某种程度上可以看做把剩余全部RAM都当做堆栈,如果不考虑STM8堆栈硬件制约),
其实这个值设置多少,在运行时并没有关系。
(即使堆栈设置为1字节,程序也应该可以正常运行)

只是在编译器的时候看看剩余RAM能能提供足够的堆栈,不足则会报错。

出0入0汤圆

发表于 2010-7-31 10:04:05 | 显示全部楼层
iar杯具了,

  2 143 bytes of readonly  code memory  
  1 105 bytes of readonly  data memory
---------------------------------------
flash用量是2 143 + 1 105

不过,还是坚信,iar优化肯定会超过cosmic 。

就看IAR是否重视STM8了。

出0入0汤圆

发表于 2010-7-31 10:07:35 | 显示全部楼层
长见识了...

出0入0汤圆

 楼主| 发表于 2010-7-31 11:41:55 | 显示全部楼层
ram倒真是一样的。。。

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

出0入0汤圆

 楼主| 发表于 2010-7-31 11:44:40 | 显示全部楼层
见上一楼,似乎真的只是标准的6502指令集

出0入0汤圆

发表于 2010-7-31 19:54:44 | 显示全部楼层
长见识了。。

出0入0汤圆

发表于 2010-8-1 00:42:16 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-2 01:26:59 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-8-2 08:25:03 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-8-2 18:52:05 | 显示全部楼层
回复【3楼】dianzidog
是lz杯具而不是iar杯具,不解析
-----------------------------------------------------------------------

应该是ST杯具了
找了两家做编译器的都在忽悠他

出0入0汤圆

发表于 2010-8-2 18:53:02 | 显示全部楼层
回复【4楼】avr-arm 光芒
lz杯具了,用好了iar你会发现他很爽,当然,现在版本还太低,有很多不足。

-----------------------------------------------------------------------

好的编译器,不需要你操太多的心
就如上面的 s>>8, s/2 之类,应该都能认出来

出0入0汤圆

发表于 2010-8-2 18:54:21 | 显示全部楼层
回复【8楼】stm8s103
cosmic不会用寄存器,
iar不会stm8指令,
---------------
从长远讲,cosmic可能一直悲剧下去。
iar提升空间应该还有很多。
-----------------------------------------------------------------------

但是,IAR的大方向应该定下来了:那就是我不喜欢、不看好的“虚拟寄存器”
只要它不放弃这点,我就不会用IAR
但是它应该不会改变架构了

出0入0汤圆

发表于 2010-8-3 08:40:21 | 显示全部楼层
回复【27楼】Cliff
-----------------------------------------------------------------------
但是,iar的大方向应该定下来了:那就是我不喜欢、不看好的“虚拟寄存器”
只要它不放弃这点,我就不会用iar
但是它应该不会改变架构了
-----------------------------------------------------------------------

楼上有偏见了。

虚拟寄存器不好的地方,只是中断的时候要保护虚拟寄存器,
但是优点也是显而易见的,解放通用寄存器,减少压栈出栈操作。

楼上玩OS吧,大概是认为iarstm8任务切换需要保护16个虚拟寄存器,浪费时间。
可以和AVR比较一下,
avr 一个push是两个时钟周期,32个寄存器要64个时钟周期,
stm8一个push是一个时钟周期,16个虚拟寄存器才16个周期,再加上9个通用寄存器入栈时间,总共25个时钟周期,
大大小于AVR寄存器保护时间。

AVR用OS都能用很好,stm8更不是问题。

出0入0汤圆

发表于 2010-8-3 10:06:37 | 显示全部楼层
回复【28楼】stm8s103
-----------------------------------------------------------------------

从你言谈中很能透露出对IAR的支持啊!

但是,现在几款STM8的C编译器都不尽如人意
IAR强大是强大,但是抛不开RISC的理念,却是一个硬伤。
不论是STM8的虚拟寄存器,还是AVR的虚拟(软件)堆栈,都很明显的露出了生搬硬套RISC C编译器的影子

所谓万事古难全,如果IAR不是致力于RISC,它也不可能为每一款MCU设计对它优化的编译器
Keil当年可以专注于51,但IAR不可专注于STM8、AVR……之内的一样

我的意思是,IAR的C编译器理念,并不是最理想的

现在就回到你所说的问题上来:
〉虚拟寄存器不好的地方,只是中断的时候要保护虚拟寄存器,
〉但是优点也是显而易见的,解放通用寄存器,减少压栈出栈操作。
我问你呀,是一系列的 PUSH/POP 快,还是 ADD SP, #$xx  SUB SP, #$xx 快呢?
虽然说,这个问题有些片面,有时候从全局考虑,用 IAR 的方式确实能更有效的减少代码量
但是,正如我以前曾说过(在IAR与Keil MDK编译器之争),IAR 是以近乎变态的方式来换取空间优化的
我这么说,不是否认IAR可能会成为STM8编译器的NO.1,但是,就算NO.1,在我看来也有不理想的地方存在的
因为,它不能专注

出0入0汤圆

发表于 2010-8-3 12:28:35 | 显示全部楼层
楼上高手啊,有没有计划自己搞个编译器?

出0入0汤圆

发表于 2010-8-3 13:07:20 | 显示全部楼层
回复【30楼】cyberjok
楼上高手啊,有没有计划自己搞个编译器?

-----------------------------------------------------------------------

我觉着Cliff有这个实力。
头像被屏蔽

出0入0汤圆

发表于 2010-8-3 13:50:57 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

出0入0汤圆

发表于 2010-8-3 14:31:58 | 显示全部楼层
回复【31楼】taishan
-----------------------------------------------------------------------

21ic 有人在搞STM8的编译器,估计国内这环境有能力搞,也未必有时间和心情去搞,都为了生计。。。。

出0入0汤圆

发表于 2010-8-3 22:47:14 | 显示全部楼层
回复【30楼】cyberjok
楼上高手啊,有没有计划自己搞个编译器?

-----------------------------------------------------------------------

呵呵,这倒还没有。
毕竟这个太费精力了,无暇顾及那么多啊
你看现在基于GCC的个人维护的编译器,都现状不佳啊,缺乏维护

MSP430的,就停留在老版本上了
AVR的,原作者不维护了,新版GCC4上的编译效率反而不如GCC3

而不使用GCC的话,更是无从谈起

而且,用GCC的话,也有很多事情要做呢
先是 binutils, 再是 gcc,然后是优化的 libgcc,最后是 C运行库
不单单是移植一个gcc就完事的啊

出0入0汤圆

发表于 2010-8-5 00:26:03 | 显示全部楼层
回复【29楼】Cliff  
回复【28楼】stm8s103 
-----------------------------------------------------------------------

从你言谈中很能透露出对iar的支持啊!

但是,现在几款stm8的c编译器都不尽如人意
iar强大是强大,但是抛不开risc的理念,却是一个硬伤。
不论是stm8的虚拟寄存器,还是avr的虚拟(软件)堆栈,都很明显的露出了生搬硬套risc c编译器的影子

所谓万事古难全,如果iar不是致力于risc,它也不可能为每一款mcu设计对它优化的编译器
keil当年可以专注于51,但iar不可专注于stm8、avr……之内的一样

我的意思是,iar的c编译器理念,并不是最理想的

现在就回到你所说的问题上来:
〉虚拟寄存器不好的地方,只是中断的时候要保护虚拟寄存器, 
〉但是优点也是显......
-----------------------------------------------------------------------
8bitMCU本来就对空间比速度要重视,空间就是成本!!!能用8Kflash的不用16K。至于速度嘛,不太差就好了。51比avr差远了,但还是很多人用,何况就差几个CLK的中断周期呢

出0入0汤圆

发表于 2010-8-5 06:25:29 | 显示全部楼层
回复【35楼】dianzidog
8bitMCU本来就对空间比速度要重视,空间就是成本!!!能用8Kflash的不用16K。至于速度嘛,不太差就好了。51比avr差远了,但还是很多人用,何况就差几个CLK的中断周期呢
-----------------------------------------------------------------------

1、请问目前 STM8 系列的,8K 和 16K,到底差多少价格?
2、我说的速度,是中断响应速度,或任务切换速度。实时性 不等于 快
3、你以为用 51 的,都是(或者说绝大部分是)基于成本考虑?

出0入0汤圆

发表于 2010-8-5 08:17:48 | 显示全部楼层
2、我说的速度,是中断响应速度,或任务切换速度。实时性 不等于 快
-------------------------------------------------------------------

任务切换速度应该不是问题。
任务实时性一般不会在乎任务切换多用几个us.
多几个us,少几个us对任务实时性影响不大。

AVR保护通用寄存器要64个周期,STM8保护通用寄存器与虚拟寄存器只要25个周期,
AVR跑OS都不是问题,stm8更不是问题。

实时性更加敏感的是中断,
真的到了多几个周期都不能忍受,
中断就该用内嵌汇编了。

出0入0汤圆

发表于 2010-8-5 08:35:50 | 显示全部楼层
回复 cliff   
-----------------------------------------------------------------------
所谓万事古难全,如果iar不是致力于risc,它也不可能为每一款mcu设计对它优化的编译器
keil当年可以专注于51,但iar不可专注于stm8、avr……之内的一样

我的意思是,iar的c编译器理念,并不是最理想的
-----------------------------------------------------------------------

基本同意。

我的看法是iar由于多线作战,不能专注于某个特定的编译器。
通常iar精力用的比较多的编译器,效率都不错,如iaravr,iararm。

现在担心iar是否重视stm8,如果重视不够,也可能iarstm8永远杯具下去。

我个人到不认为是risc,cisc理念有别。

出0入0汤圆

 楼主| 发表于 2010-8-5 08:55:43 | 显示全部楼层
我也是希望IAR稍重视下stm8,对他们而言,多加入几个指令的使用也并不是太难的事情,只看愿不愿做了。。。
必竟有个好用的编译器,大家都会喜欢的。虽然在中国。。。基本没人花钱买-_-

出0入0汤圆

发表于 2010-8-5 09:41:35 | 显示全部楼层
回复【39楼】snoopyzz
虽然在中国。。。基本没人花钱买-_-
-----------------------------------------------------------------------

哼,这也是 IAR 自己默许的,就跟 Microsoft 一样。
自己知情而不去维护它自己的权益,我就视他为自动放弃!

出0入0汤圆

发表于 2010-8-5 09:43:02 | 显示全部楼层
回复【37楼】stm8s103
实时性更加敏感的是中断,
真的到了多几个周期都不能忍受,
中断就该用内嵌汇编了。
-----------------------------------------------------------------------

嗯!这倒真提醒了我!
用汇编就完全回避这个虚拟寄存器的问题了!
谢谢啊!

出0入0汤圆

发表于 2010-8-5 09:45:21 | 显示全部楼层
回复【38楼】stm8s103

〉现在担心iar是否重视stm8,如果重视不够,也可能iarstm8永远杯具下去。
看来“现在”的重视程度真的不够啊,这个编译器出的实在太草草了

〉我个人到不认为是risc,cisc理念有别。
最大的区别在于函数参数的传递、局部变量的使用,是用堆栈,还是通用寄存器

出50入0汤圆

发表于 2010-8-5 13:23:36 | 显示全部楼层
IAR FOR AVR用起来很爽

出0入0汤圆

发表于 2010-8-5 13:40:07 | 显示全部楼层
回复【36楼】Cliff  
回复【35楼】dianzidog 
8bitmcu本来就对空间比速度要重视,空间就是成本!!!能用8kflash的不用16k。至于速度嘛,不太差就好了。51比avr差远了,但还是很多人用,何况就差几个clk的中断周期呢 
-----------------------------------------------------------------------

1、请问目前 stm8 系列的,8k 和 16k,到底差多少价格?
2、我说的速度,是中断响应速度,或任务切换速度。实时性 不等于 快
3、你以为用 51 的,都是(或者说绝大部分是)基于成本考虑?
-----------------------------------------------------------------------

1,8K---3块     16K---另一个系列了,要5-6块
2 中断响应的时间就 = CPU每周期的时间 * 中断切换周期数。51每周期的时间超慢的,总时间也超多了
3 你没明白我的意思,51多慢啊,进中断切换的时间比stm8慢多了,总体速度也慢多了,但很多人都不会在意它的速度。

出0入0汤圆

发表于 2010-8-18 23:37:29 | 显示全部楼层
学习

出0入0汤圆

发表于 2010-10-19 22:23:03 | 显示全部楼层
MARK

出0入0汤圆

发表于 2010-10-19 22:50:32 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-23 08:06:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-10-23 09:35:50 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-13 09:53:34 | 显示全部楼层
mark!

出0入0汤圆

发表于 2010-12-24 20:20:59 | 显示全部楼层
听君一席话,胜读十年书!snoopyzz和Cliff果然是高手,对编译原理如此精通,小弟是衷心佩服,还望两位能多指点啊。我玩编程三年多,对这些原理却一知半解,汗颜啊。

出0入0汤圆

发表于 2011-2-8 23:48:58 | 显示全部楼层
进来膜拜····

出0入0汤圆

发表于 2011-4-8 16:52:04 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-8 17:21:05 | 显示全部楼层
我个人认为IAR最败笔的编译器有:
1. EWS08
2. EWSTM8
3. EWPIC(停产)  
4. EWPIC18(停产)

出0入0汤圆

发表于 2011-4-8 19:58:33 | 显示全部楼层
【楼主位】 snoopyzz  

"杯具。。。等IAR懂了stm8的指令,等IAR懂(u8)(a>>8)只取低8位就可以不需要真的移8次,要等到什么时候-_- "

-----------------------------------------------------------------------------------------------------

我试了下没有进行8次移位啊。




(原文件名:1.PNG)

出0入0汤圆

 楼主| 发表于 2011-4-8 20:55:11 | 显示全部楼层
IAR我已经删了...当时验证时的确是循环移位了8次...你试试全局变量...

出0入0汤圆

发表于 2011-4-8 21:58:23 | 显示全部楼层
【56楼】 snoopyzz

结果一样。


(原文件名:1.PNG)

出0入0汤圆

发表于 2011-4-9 06:31:22 | 显示全部楼层
现在IAR 版本才1.2,优化能力还很不足。

iar目前与comsic优化能力也差不了多少,但iar优化能力提升的潜力更大。

出0入0汤圆

 楼主| 发表于 2011-4-9 08:18:21 | 显示全部楼层
回复【57楼】hsztc  
-----------------------------------------------------------------------

可能新版改进了吧,但即使如此,如此的优化能力,也差点很远,给你看看cosmic如何优化的...

当x=0x1234指定常量时,会直接把0x12(#18)赋给变量y

u16 x;
u8 y;

void main(void)
{
    x = 0x1234;
    y = (u8)(x>>8);
}
6534  0000               _main:
6538                     ; 7     x = 0x1234;
6540  0000 ae1234                ldw        x,#4660
6541  0003 bf01                  ldw        _x,x
6542                     ; 8     y = (u8)(x>>8);
6544  0005 35120000              mov        _y,#18

===================

当x为变量时,则把x的高位直接赋值给y变量

u16 x = 0x1234;
u8 y;

void main(void)
{
    y = (u8)(x>>8);
}

6534  0000               _main:
6538                     ; 8     y = (u8)(x>>8);
6540  0000 450100                mov        _y,_x

出0入0汤圆

发表于 2011-4-9 08:51:46 | 显示全部楼层
LS的这段程序在IAR里会被完全优化掉,给个warning说y定义了但没使用过
// ---------------------
void main(void)
{
    x = 0x1234;
    y = (u8)(x>>8);
}

//----------------------

我在IAR For STM8里测试了如下程序,其中bLcdInfoIndex是全局变量
        WORD x = 0x1234;
    BYTE y = (BYTE)(x>>8);
        bLcdInfoIndex = (BYTE)(x>>8);
        if(y) NOP();

得到的汇编是:
//  136         WORD x = 0x1234;
//  137     BYTE y = (BYTE)(x>>8);
//  138         bLcdInfoIndex = (BYTE)(x>>8);
        MOV       N:bLcdInfoIndex, #0x12
//  139         if(y) NOP();
        nop

出0入0汤圆

发表于 2011-4-9 09:00:05 | 显示全部楼层
IAR STM8目前还不懂STM8指令。

void test(void)
{
    x = 0x1234;
    y = (unsigned char)(x>>8);
}
用IAR MSP430编译:
        RSEG CODE:CODE:REORDER:NOROOT(1)
//    7 void test(void)
test:
//    8 {
//    9     x = 0x1234;
        MOV.W   #0x1234, &x
//   10     y = (unsigned char)(x>>8);
        MOV.B   &x + 1, &y
//   11 }
        RET
//   12

一样只是用MOV指令,不用寄存器。

IAR并不是不懂MOV指令,只是IAR STM8不懂。
貌似IARSTM8目前工作重心放在了调试工具上(看最新的1.3更新,基本上都是关于调试工具的),
看来是得把调试工具完善了,再来改进优化。

出0入0汤圆

发表于 2011-4-9 09:03:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-4-9 09:18:05 | 显示全部楼层
回复【60楼】bigZ  
-----------------------------------------------------------------------

搞错,最近在用NEC和STM8搞混了。。。上面的结果是IAR FOR NEC的。。。

出0入0汤圆

发表于 2011-4-9 09:32:59 | 显示全部楼层
IAR 1.20 for STM8的测试结果,优化开到最高
//    7         unsigned int x = 0x1234;
//    8         unsigned char y = x>>8;
//    9         if(y) m = x>>8;
main:
        LD        A, #0x12
        LD        L:m, A
//   10         if(m) y++;

出0入0汤圆

发表于 2011-4-9 09:51:32 | 显示全部楼层
对于CISC的MCU来说,MOV实际使用的时钟周期比手册中说的可能要多
曾经测试过瑞萨的MCU,手册说是3个时钟,可实际测试却要11个(其客服曾向我展示过TRACE仿真的数据,和我的测试结果相同)
所以对于x=y这种操作编译后要么是:
MOV x,y
要么是
LD A,x
LD y,A

而LD指令实测速度可能是最快的
2条LD使用的代码量和1条MOV可以说是相同的
可以参考STM8的指令手册

出0入0汤圆

发表于 2011-4-9 13:25:36 | 显示全部楼层
【59楼】 snoopyzz

把优化等级调到中就是直接常数赋值了,不过有的时候代码比起AVR差多了。



(原文件名:1.PNG)

出0入0汤圆

发表于 2011-5-29 17:27:15 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-5-29 18:07:23 | 显示全部楼层
"貌似IARSTM8目前工作重心放在了调试工具上(看最新的1.3更新,基本上都是关于调试工具的),"

the first priority for someone buying a commercial development tool is reliability, followed by support. speed is low.

IAR is where it is today because its tools are very very reliable. and gcc will never be used commercially because it isn't reliable and its support is non-existent.

出0入0汤圆

发表于 2011-12-20 14:11:57 | 显示全部楼层
现在IAR还没做到比COSMIC好。

出0入0汤圆

发表于 2012-1-14 23:01:34 | 显示全部楼层
马克

出0入0汤圆

发表于 2012-4-14 19:15:07 | 显示全部楼层
cosmic还是好。路过,涨见识了!

出0入0汤圆

发表于 2012-10-13 22:43:13 | 显示全部楼层
riptell2008 发表于 2012-4-14 19:15
cosmic还是好。路过,涨见识了!

不好,一个AES(论坛中的例程)用KEIL通过,能加密,也能正确解出,用 cosmic 杯具,能加不有解。几位有机会试一下。







cosmic 有没有新版本啊?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-10-16 08:56:36 | 显示全部楼层
学习中,都是牛人啊

出0入0汤圆

发表于 2012-11-8 11:33:16 | 显示全部楼层
学习了,最近在IAR上编写STM8的OS,正需要这些。现在IAR可以更改虚拟寄存器为12个了。

出0入0汤圆

发表于 2012-11-8 15:57:23 | 显示全部楼层
mark 一下。

出0入0汤圆

发表于 2012-11-8 16:14:23 | 显示全部楼层
    IAR for STM8,什么时候能把虚拟寄存器设为0,就是个好的编译器,否则,就是垃圾!

出0入0汤圆

发表于 2012-11-8 16:30:21 | 显示全部楼层
stm8s103 发表于 2010-8-5 08:17
2、我说的速度,是中断响应速度,或任务切换速度。实时性 不等于 快
----------------------------------- ...

    AVR有32个寄存器,但有些寄存器是可以通过编译伪指令锁定的,可以不参与到线程切换时的保存与恢复中去的,只有R0~R7是必须要保护的。
    所以说,编译器厂商也意识到了CPU的多寄存器并非一定是好事。
    IAR for STM8的虚拟寄存器(12个或16个),纯粹脱裤子放屁。

出0入0汤圆

发表于 2012-11-8 21:01:43 | 显示全部楼层
thx!!!

出0入0汤圆

发表于 2013-3-1 09:34:43 | 显示全部楼层
IAR STM8。。。。不懂

出0入0汤圆

发表于 2013-5-25 17:03:29 | 显示全部楼层

IAR for  STM8   现在都1.4了,看看前辈们的提出的问题,不知道IAR做了什么改变

出0入0汤圆

发表于 2014-1-7 21:37:58 | 显示全部楼层
不明觉厉

出0入0汤圆

发表于 2014-1-23 10:32:02 | 显示全部楼层
各位高手,我最近也遇到一个问题 ,就是本来程序大小为
3 914 bytes of readonly  code memory
  1 101 bytes of readonly  data memory
    308 bytes of readwrite data memory
后来在main程序中加了一句,sprintf(debug,"Enter the main");
程序大小变为:

  10 086 bytes of readonly  code memory
   1 195 bytes of readonly  data memory
     308 bytes of readwrite data memory
并提示错误如下,请各位大牛解答一下,已经弄了两天确实没办法啦!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-7-2 17:31:42 | 显示全部楼层
学习了。

出0入0汤圆

发表于 2014-9-24 16:05:46 | 显示全部楼层
学习了。。不错的MARK

出0入0汤圆

发表于 2014-9-24 16:26:14 | 显示全部楼层
mark mark mark

出0入0汤圆

发表于 2014-9-24 19:11:00 | 显示全部楼层
mark,不错的帖子

出0入0汤圆

发表于 2016-11-3 13:55:26 | 显示全部楼层
mark 涨知识啊

出0入0汤圆

发表于 2017-8-26 16:05:10 | 显示全部楼层
stm8真是个奇葩啊,按照速度最高优化,竟然能够把以下代码优化成如此匪夷所思
char a ,b
(a & 0xf0) == 0x40  变成了 a == 0x40
b = a & 0xf 变成了 b = a;

令人难以置信啊,iar不是吹优化牛么

出0入0汤圆

发表于 2017-8-26 19:19:28 | 显示全部楼层
myxiaonia 发表于 2017-8-26 16:05
stm8真是个奇葩啊,按照速度最高优化,竟然能够把以下代码优化成如此匪夷所思
char a ,b
(a & 0xf0) == 0x ...


贴反汇编,上下文也贴

光你这样胡扯只是污染环境

出0入0汤圆

发表于 2017-8-26 21:52:44 | 显示全部楼层
Earthman 发表于 2017-8-26 19:19
贴反汇编,上下文也贴

光你这样胡扯只是污染环境

你才胡扯呢

出0入0汤圆

发表于 2017-8-30 05:52:02 来自手机 | 显示全部楼层
最新版本的也这么惨么?过几天有两个lic要到货了。

出0入0汤圆

发表于 2019-4-22 18:10:24 | 显示全部楼层
mark..................
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 05:44

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表