ATmega32 发表于 2007-11-28 15:57:19

请问:IAR怎么单独对一个函数采用最高速度优化?

请问:IAR怎么单独对一个函数采用最高速度优化?

#pragma optimize = ??????

korren 发表于 2007-11-28 16:05:10

直接在函数前面加上:
#pragma optimize=s 9 //最大速度优化。

#pragma optimize=z 9 //最大空间优化。

ATmega32 发表于 2007-11-28 16:06:25

多谢。

如果单独对一个函数不优化呢?

korren 发表于 2007-11-28 16:16:20

#pragma optimize #pragma optimize=token_1 token_2 token_3
where token_n is one of the following:
s Optimizes for speed
z Optimizes for size
2|none|3|low|6|medium|9|high Specifies the level of optimization
no_code_motion Turns off code motion
no_cse Turns off common subexpression elimination
no_inline Turns off function inlining
no_tbaa Turns off type-based alias analysis

The #pragma optimize directive is used for decreasing the optimization level, or for
turning off some specific optimizations. This pragma directive only affects the function
that follows immediately after the directive.
Note that it is not possible to optimize for speed and size at the same time. Only one of
the s and z tokens can be used. It is also not possible to use macros embedded in this
pragma directive. Any such macro will not get expanded by the preprocessor.

Oliver 发表于 2008-1-12 15:42:19

用IAR一直都是最大优化,没出过什么,今天用WDT时出现问题,大家是怎么解决的?先贴出问题

程序初始话时:
WDTCSR |= (1<<WDCE | 1<<WDE);
WDTCSR= (1<<WDE| 1<<WDP2 | 1<<WDP0);        // 0.5S


睡眠时:
WDTCSR |= (1<<WDCE | 1<<WDE);
WDTCSR= 0;

查看汇编时发现:IAR优化时吧第一行给搞了个子程序:
1.对应初始化
//432         WDTCSR |= (1<<WDCE | 1<<WDE);
      RCALL   ?Subroutine21
//433         WDTCSR= (1<<WDE| 1<<WDP2 | 1<<WDP0);        // 0.5S
??CrossCallReturnLabel_65:
      LDI   R16, 13
      STS   96, R16

2.对应关WDT:
//693         WDTCSR |= (1<<WDCE | 1<<WDE);
      RCALL   ?Subroutine21
//694         WDTCSR= 0;
??CrossCallReturnLabel_66:
      LDI   R16, 0
      STS   96, R16

3.子程序:
?Subroutine21:
      LDS   R16, 96
      ORI   R16, 0x18
      STS   96, R16
      RET


搞个单独的涵数然后关闭优化可以吗?

Oliver 发表于 2008-1-12 15:53:45

测试了一下只要有4处操作WDTCSR的话就会搞个子程序,有时子程序就两句话
STS   96, R16
RET

这种对时序有要求的操作,并且是系统级的,按道理就不能这样一来优化的吧?大侠们,有什么设置吗?

Oliver 发表于 2008-1-12 16:01:33

暂时找到解决办法了,去掉下图中红圈的勾就好了,这个选上后代码能小很多很多,>8%的效率.

http://cache.amobbs.com/bbs_upload782111/files_9/ourdev_200845.GIF

大侠讲讲这是什么东东啊?还有什么解决办法吗?

gingin 发表于 2008-1-12 18:26:38

这类优化好像是在用时间换空间。

Oliver 发表于 2008-1-13 00:05:03

好象是,交互调用什么的.希望高人们继续跟贴啊

sciencehero 发表于 2008-5-21 22:03:58

收藏,谢谢.

sjzd 发表于 2008-5-21 22:11:38

谢谢   对IAR优化还不怎么了解   哪位有相关资料啊

ATmega32 发表于 2008-5-22 08:34:42

#ifndef __IAR_OPTIMIZE_H__
#define __IAR_OPTIMIZE_H__

#define OPTIMIZE_SIZE_NONE    _Pragma("optimize=z 2")
#define OPTIMIZE_SIZE_LOW   _Pragma("optimize=z 3")
#define OPTIMIZE_SIZE_MEDIUM_Pragma("optimize=z 6")
#define OPTIMIZE_SIZE_HIGH    _Pragma("optimize=z 9")

#define OPTIMIZE_SPEED_NONE    _Pragma("optimize=s 2")
#define OPTIMIZE_SPEED_LOW   _Pragma("optimize=s 3")
#define OPTIMIZE_SPEED_MEDIUM_Pragma("optimize=s 6")
#define OPTIMIZE_SPEED_HIGH    _Pragma("optimize=s 9")


#define OZ_2 OPTIMIZE_SIZE_NONE
#define OZ_3 OPTIMIZE_SIZE_LOW
#define OZ_6 OPTIMIZE_SIZE_MEDIUM
#define OZ_9 OPTIMIZE_SIZE_HIGH

#define OS_2 OPTIMIZE_SPEED_NONE
#define OS_3 OPTIMIZE_SPEED_LOW
#define OS_6 OPTIMIZE_SPEED_MEDIUM
#define OS_9 OPTIMIZE_SPEED_HIGH

#endif



OPTIMIZE_SIZE_NONE inline void WDT_Init(void)
{
WDTCSR = (1<<WDCE)|(1<<WDE);      
WDTCSR = (1<<WDE|1<<WDP1|1<<WDP0);   
}

wxyujz 发表于 2008-5-22 08:54:51


WDTCSR |= (1<<WDCE | 1<<WDE);

改成
WDTCSR = (1<<WDCE | 1<<WDE);

试试

lihuyong 发表于 2008-5-22 09:01:23

踩一下,收藏

tsb0574 发表于 2008-5-22 09:32:12

对iar的讨论越来越深入了!!
值得高兴

qiuhuawei 发表于 2008-5-22 09:39:19

#pragma optimize=s 9,怎样对一个中断函数进行书写呢,中断函数本身#pragma ......

ATmega32 发表于 2008-5-22 10:50:50

#pragmaoptimize=s 9
#pragma vector=TIMER0_OVF_vect
__interrupt void test(void)
{
for(unsigned char i=0;i<100;i++);
}

或者:
OPTIMIZE_SPEED_HIGH SIGNAL(TIMER0_OVF_vect)
{
for(unsigned char i=0;i<100;i++);
}

其中SIGNAL宏:
#define _PRAGMA_STR(A) _Pragma(#A)
#define PRAGMA_STR(A) _PRAGMA_STR(A)
#define __VECTOR__(A) vector=A
#define SIGNAL(A)\
PRAGMA_STR(__VECTOR__(A))\
__interrupt void SIGNAL##_##A(void)

qiuhuawei 发表于 2008-5-22 11:40:17

#pragmaoptimize=s 9
#pragma vector=TIMER0_OVF_vect
__interrupt void test(void)
{
for(unsigned char i=0;i<100;i++);
}
有警告信息

ATmega32 发表于 2008-5-22 11:52:31

Warning: Optimization can only be lowered from the default, not raised

IAR单独对某个函数只能降低或者不改变优化级别,不能提高优化级别..

Oliver 发表于 2008-5-22 14:17:24

选项里面设置为最高优化.

其实这个指令不是为了对涵数或者中断优化而定的,而是告诉编译器以下代码按本定义优化方式优化编译,

直到遇到下一条优化指令后再按其定义改变优化策略

ATmega32 发表于 2008-5-22 14:33:18

楼上的意思是说,出现一次#pragmaoptimize后,后面的所有函数都按照次优化参数优化,直到出现下一个#pragmaoptimize??

#pragmaoptimize=z 2
void test1(void)
{
for(unsigned char i=0;i<100;i++);
}

void test2(void)
{
for(unsigned char i=0;i<100;i++);
}

楼上的意思是说test1和test2都采用z 2,即不优化.
实际上只有test1不优化,而test2仍然按默认的优化处理.

Oliver 发表于 2008-5-22 20:42:01

应该是,好些时候工程会新添加的*.r90库文件内部#pragmaoptimize指令的影响.

致使后面的代码也按其优化了.现在每个涵数我们都要求针对性的优化.

Solar_Gao 发表于 2015-1-29 21:01:50

留下记号。

yfgww 发表于 2015-2-2 16:38:02

看的眼花缭乱,学习了

ssavr568 发表于 2015-2-2 16:42:04

标记一下,马上就要用到了
页: [1]
查看完整版本: 请问:IAR怎么单独对一个函数采用最高速度优化?