搜索
bottom↓
回复: 24

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

[复制链接]

出0入0汤圆

发表于 2007-11-28 15:57:19 | 显示全部楼层 |阅读模式
请问:IAR怎么单独对一个函数采用最高速度优化?

#pragma optimize = ??????

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2007-11-28 16:05:10 | 显示全部楼层
直接在函数前面加上:
#pragma optimize=s 9 //最大速度优化。

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

出0入0汤圆

 楼主| 发表于 2007-11-28 16:06:25 | 显示全部楼层
多谢。

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

出0入0汤圆

发表于 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.

出0入0汤圆

发表于 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


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

出0入0汤圆

发表于 2008-1-12 15:53:45 | 显示全部楼层
测试了一下只要有4处操作WDTCSR的话就会搞个子程序,有时子程序就两句话
STS     96, R16
RET

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

出0入0汤圆

发表于 2008-1-12 16:01:33 | 显示全部楼层
暂时找到解决办法了,去掉下图中红圈的勾就好了,这个选上后代码能小很多很多,>8%的效率.



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

出0入0汤圆

发表于 2008-1-12 18:26:38 | 显示全部楼层
这类优化好像是在用时间换空间。

出0入0汤圆

发表于 2008-1-13 00:05:03 | 显示全部楼层
好象是,交互调用什么的.希望高人们继续跟贴啊

出0入0汤圆

发表于 2008-5-21 22:03:58 | 显示全部楼层
收藏,谢谢.

出0入0汤圆

发表于 2008-5-21 22:11:38 | 显示全部楼层
谢谢   对IAR优化还不怎么了解   哪位有相关资料啊

出0入0汤圆

 楼主| 发表于 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);   
}

出0入0汤圆

发表于 2008-5-22 08:54:51 | 显示全部楼层

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

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

试试

出0入0汤圆

发表于 2008-5-22 09:01:23 | 显示全部楼层
踩一下,收藏

出0入0汤圆

发表于 2008-5-22 09:32:12 | 显示全部楼层
对iar的讨论越来越深入了!!
值得高兴

出0入0汤圆

发表于 2008-5-22 09:39:19 | 显示全部楼层
#pragma optimize=s 9,怎样对一个中断函数进行书写呢,中断函数本身#pragma ......

出0入0汤圆

 楼主| 发表于 2008-5-22 10:50:50 | 显示全部楼层
#pragma  optimize=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)

出0入0汤圆

发表于 2008-5-22 11:40:17 | 显示全部楼层
#pragma  optimize=s 9
#pragma vector=TIMER0_OVF_vect
__interrupt void test(void)
{
  for(unsigned char i=0;i<100;i++);
}
有警告信息

出0入0汤圆

 楼主| 发表于 2008-5-22 11:52:31 | 显示全部楼层
Warning[Go003]: Optimization can only be lowered from the default, not raised

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

出0入0汤圆

发表于 2008-5-22 14:17:24 | 显示全部楼层
选项里面设置为最高优化.

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

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

出0入0汤圆

 楼主| 发表于 2008-5-22 14:33:18 | 显示全部楼层
楼上的意思是说,出现一次#pragma  optimize后,后面的所有函数都按照次优化参数优化,直到出现下一个#pragma  optimize??

#pragma  optimize=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仍然按默认的优化处理.

出0入0汤圆

发表于 2008-5-22 20:42:01 | 显示全部楼层
应该是,好些时候工程会新添加的*.r90库文件内部#pragma  optimize指令的影响.

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

出0入0汤圆

发表于 2015-1-29 21:01:50 | 显示全部楼层
留下记号。

出0入0汤圆

发表于 2015-2-2 16:38:02 | 显示全部楼层
看的眼花缭乱,学习了

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-23 12:34

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

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