打印
[AVR单片机]

IAR AVR中能不能禁止对某个函数的代码优化

[复制链接]
9584|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dudongdao|  楼主 | 2008-10-17 11:46 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    先是用ICCAVR编译的程序,空间紧张了,压缩后用了百分之90,后来改用IAR,压缩后百分之58,压缩效率的确厉害,真是佩服。但是出现了一个问题,下面这个函数优化过头了:
U16 GetSysTimer(void)
{
    U16 u16ReturnValue;
    
    m_st_SysIntFlag.u8SysIntFlag &= ~0x01;
    u16ReturnValue = m_st_SysTimer.u16SysTimer;

    if(m_st_SysIntFlag.u8SysIntFlag&0x01)
    {
        u16ReturnValue = m_st_SysTimer.u16SysTimer;
    }

    return u16ReturnValue;
}

原来的意思是取系统时间m_st_SysTimer.u16SysTimer,如果发生了中断,再取一次,IAR发现if(m_st_SysIntFlag.u8SysIntFlag&0x01)这句在此函数中没有意义,给优化掉了。想请教一下大家,可以评比对某个函数的优化吗,如果可以,那IAR真是好东东,以后就用这个了,代码压缩效率真绝。

相关帖子

沙发
wyx000| | 2008-10-17 12:02 | 只看该作者

要用volatile

在m_st_SysIntFlag和m_st_SysTimer变量的声名前加volatile,和用什么编译器无关

使用特权

评论回复
板凳
dudongdao|  楼主 | 2008-10-17 12:10 | 只看该作者

OK

好 我试试~

使用特权

评论回复
地板
dudongdao|  楼主 | 2008-10-17 12:35 | 只看该作者

高~ 哈哈~~ 可以了~~

再请教一下WYX:“这个关键字是什么作用,是定义中断中用到的变量的吗”

使用特权

评论回复
5
dudongdao|  楼主 | 2008-10-17 12:42 | 只看该作者

++

还有一个问题,IAR会不会自动生成初始化代码,就是把全局变量都初始化为零的功能。

使用特权

评论回复
6
ATmega32L| | 2008-10-17 23:31 | 只看该作者

单独对某个函数不优化:

单独对某个函数不优化:
在函数前面加上:
#pragma optimize=none  
或者
_Pragma("optimize=none")

使用特权

评论回复
7
dudongdao|  楼主 | 2008-10-18 16:30 | 只看该作者

谢谢~

   谢谢MEGA32,请问一下这些你是在哪里看来的呢,我怎么到网络上找不到资料的。

使用特权

评论回复
8
yewuyi| | 2008-10-18 17:29 | 只看该作者

IAR中出现优化问题,基本都是你的写法不规范造成的

所以这个时候想办法让它不优化是不对的,应该去找到为什么优化不对,并改正那错误的书写习惯或有歧义的一些定义什么的。。。

使用特权

评论回复
9
dudongdao|  楼主 | 2008-10-22 13:37 | 只看该作者

在用户手册中找到了禁止优化的命令。

By default, the same optimization level for an entire project or file is used, but you
should consider using different optimization settings for different files in a project. For
example, put code that must execute very quickly into a separate file and compile it for
minimal execution time (maximum speed), and the rest of the code for minimal code
size. This will give a small program, which is still fast enough where it matters. The
“#pragma optimize directive ”allows you to fine-tune the optimization for specific
functions, such as time-critical functions.


使用特权

评论回复
10
928315| | 2008-10-22 21:17 | 只看该作者

AVR的SPI口问题

AVR那个SPI口别用来下程序了,如果在程序烧写完成后,SPI口是否还可以正常使用??

使用特权

评论回复
11
mxh0506| | 2008-10-22 22:39 | 只看该作者

To ATmega32L:

你果然是IAR的高手. _Pragma好像是C99的一个特性, 能不能给讲讲IAR从哪一版起支持_Pragma的? IAR的手册上对此似乎只字未提.

使用特权

评论回复
12
ATmega32L| | 2008-10-22 23:27 | 只看该作者

参看EWAVR_CompilerReference

参看EWAVR_CompilerReference。

IAR支持C99部分特性。

_Pragma可以作为宏的一部分,而#pragma不能作为某个宏的部分。

利用_Pragma特性,可以把GCC的SIGNAL(vector)移植到IAR。

使用特权

评论回复
13
mxh0506| | 2008-10-23 22:12 | 只看该作者

多谢ATmega32L指点,加你做好友,以后多交流

EWARM应该也差不多吧?我在EWARM 4.X的手册没找到相关说明.等有空了试试看.

使用特权

评论回复
14
dudongdao|  楼主 | 2008-10-24 13:04 | 只看该作者

谁有实力的,把C编译器手册翻译一次,让大家都受益。

谁有实力的,把C编译器手册翻译一次,让大家都受益。

使用特权

评论回复
15
mxh0506| | 2008-10-24 17:07 | 只看该作者

我曾经翻译过XLINK的一部分手册

要全文翻译,一个人做太累了,不太值得.
有空还要享受生活呢,对吧?

使用特权

评论回复
16
dudongdao|  楼主 | 2008-10-24 17:27 | 只看该作者

你是司马迁

三百多页~ 挑有用的也就不到200页~   如果英文熟点~ 半个月就完了~  然后在去享受生活去。  难道要用三五年吗~  

使用特权

评论回复
17
yewuyi| | 2008-10-24 17:32 | 只看该作者

网络上有一些零零碎碎的翻译

使用特权

评论回复
18
dudongdao|  楼主 | 2008-10-24 18:08 | 只看该作者

好消息~ 真是好消息

   能不能给个链接,同志们都期待着~yewuyi的链接,好心人,救救我们E文不好的同胞吧

使用特权

评论回复
19
yewuyi| | 2008-10-24 19:40 | 只看该作者

俺没有搜集过,但过去在NET上逛的时候看到过一些

零零碎碎的,没有进行搜集和整理。


不过IAR的IDE和编译器在各个芯片上都差不太多,关于IAR FOR MSP430的资料会多一点,可以触类旁通。。。

使用特权

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

本版积分规则

90

主题

413

帖子

1

粉丝