[AVR单片机] IAR AVR中能不能禁止对某个函数的代码优化

[复制链接]
10734|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:“这个关键字是什么作用,是定义中断中用到的变量的吗”
 楼主| dudongdao 发表于 2008-10-17 12:42 | 显示全部楼层

++

还有一个问题,IAR会不会自动生成初始化代码,就是把全局变量都初始化为零的功能。
ATmega32L 发表于 2008-10-17 23:31 | 显示全部楼层

单独对某个函数不优化:

单独对某个函数不优化:
在函数前面加上:
#pragma optimize=none  
或者
_Pragma("optimize=none")
 楼主| dudongdao 发表于 2008-10-18 16:30 | 显示全部楼层

谢谢~

   谢谢MEGA32,请问一下这些你是在哪里看来的呢,我怎么到网络上找不到资料的。
yewuyi 发表于 2008-10-18 17:29 | 显示全部楼层

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

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


928315 发表于 2008-10-22 21:17 | 显示全部楼层

AVR的SPI口问题

AVR那个SPI口别用来下程序了,如果在程序烧写完成后,SPI口是否还可以正常使用??
mxh0506 发表于 2008-10-22 22:39 | 显示全部楼层

To ATmega32L:

你果然是IAR的高手. _Pragma好像是C99的一个特性, 能不能给讲讲IAR从哪一版起支持_Pragma的? IAR的手册上对此似乎只字未提.
ATmega32L 发表于 2008-10-22 23:27 | 显示全部楼层

参看EWAVR_CompilerReference

参看EWAVR_CompilerReference。

IAR支持C99部分特性。

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

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

mxh0506 发表于 2008-10-23 22:12 | 显示全部楼层

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

EWARM应该也差不多吧?我在EWARM 4.X的手册没找到相关说明.等有空了试试看.
 楼主| dudongdao 发表于 2008-10-24 13:04 | 显示全部楼层

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

谁有实力的,把C编译器手册翻译一次,让大家都受益。
mxh0506 发表于 2008-10-24 17:07 | 显示全部楼层

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

要全文翻译,一个人做太累了,不太值得.
有空还要享受生活呢,对吧?
 楼主| dudongdao 发表于 2008-10-24 17:27 | 显示全部楼层

你是司马迁

三百多页~ 挑有用的也就不到200页~   如果英文熟点~ 半个月就完了~  然后在去享受生活去。  难道要用三五年吗~  
yewuyi 发表于 2008-10-24 17:32 | 显示全部楼层

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

 楼主| dudongdao 发表于 2008-10-24 18:08 | 显示全部楼层

好消息~ 真是好消息

   能不能给个链接,同志们都期待着~yewuyi的链接,好心人,救救我们E文不好的同胞吧
yewuyi 发表于 2008-10-24 19:40 | 显示全部楼层

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

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


不过IAR的IDE和编译器在各个芯片上都差不太多,关于IAR FOR MSP430的资料会多一点,可以触类旁通。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

90

主题

413

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部