打印
[AVR单片机]

请各位看看这个函数的编译结果

[复制链接]
2096|17
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangxz|  楼主 | 2013-3-24 22:38 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
void dly_clk(uint8_t dly)
{
        while(dly--);//asm("nop")
}

编译条件为avr-studio4.19及对应版本的gcc

这个函数在优化等级除0以为的编译结果为
ret
也就是直接返回,本来想有延时作用,当然插入asm("nop") 也是可以,但是时间长了

如小图所示:


请知道的告诉我为啥

如果我想实现

dly:
                                 sbiw r24,1
                                 brne dly
                                 ret

该如何有c表达,谢谢

相关帖子

沙发
ccxlslr| | 2013-3-25 09:13 | 只看该作者
被优化了 变量前加volatile

使用特权

评论回复
评分
参与人数 1威望 +4 收起 理由
qin552011373 + 4 赞一个!
板凳
huangxz|  楼主 | 2013-3-25 10:42 | 只看该作者
谢谢楼上这位,今天试了一下,确实没有被优化,但是变的程序很长,达不到我想要的两行汇编

使用特权

评论回复
地板
cool_coder| | 2013-3-25 12:38 | 只看该作者
只有两三行那么简单的代码,自己用汇编函数写不就完全满足要求了?

使用特权

评论回复
5
ccxlslr| | 2013-3-25 13:22 | 只看该作者
huangxz 发表于 2013-3-25 10:42
谢谢楼上这位,今天试了一下,确实没有被优化,但是变的程序很长,达不到我想要的两行汇编

...


两行汇编是写不出能在C下长时间,无BUG,任何条下都能正确运行的函数的,除非你对编译器很熟,对调用规则很熟。
而且还要考虑重入等问题。
你当人这做编译器的人是傻子啊,能简单的搞这么长,人家规则在那里摆着的。

使用特权

评论回复
6
qin552011373| | 2013-3-25 13:23 | 只看该作者
自己写好嵌进去

使用特权

评论回复
7
ccxlslr| | 2013-3-25 13:44 | 只看该作者
本帖最后由 ccxlslr 于 2013-3-25 13:45 编辑
qin552011373 发表于 2013-3-25 13:23
自己写好嵌进去


那是不能用的,没有保存寄存器,没有考虑重入。当然在简单的测试中,或许可以。

可以根据使用环境适当优化。但还需要知道有这些问题,会不会有冲突

使用特权

评论回复
8
huangxz|  楼主 | 2013-3-25 13:46 | 只看该作者
qin552011373 发表于 2013-3-25 13:23
自己写好嵌进去

是的,可以使用在线汇编,但是跟据功能,像我这样写的c代码确实是用两行汇编就可以实现的,因为avr里有r0-r31总共32个寄存器,所以代码可以优化的很高效率,所以完全可以用两行汇编来实现.至于我为啥不用嵌入汇编来实现是因为还想跟21家的高手请教更多关于编译器的使用技巧。对于实际的应用的,像我这样的也许并不多。谢谢各位的回复。

使用特权

评论回复
9
john_lee| | 2013-3-25 18:57 | 只看该作者
本帖最后由 john_lee 于 2013-3-25 18:58 编辑

这样写:
void dly_clk(uint8_t dly)
{
    while(--dly)
        asm("" ::: "memory");
}
自己看反汇编结果。

使用特权

评论回复
评论
O狂且O 2013-6-16 14:14 回复TA
GCC 用的真溜. 哈....学习了. 
评分
参与人数 2威望 +11 收起 理由
qin552011373 + 6 赞一个!
mxh0506 + 5 牛X !
10
huangxz|  楼主 | 2013-3-25 22:21 | 只看该作者
john_lee 发表于 2013-3-25 18:57
这样写: 自己看反汇编结果。

令人惊叹的完美表现,

谢谢john_lee


使用特权

评论回复
11
qin552011373| | 2013-3-27 23:03 | 只看该作者
学习一下

使用特权

评论回复
12
yhhsky| | 2013-3-30 18:48 | 只看该作者

使用特权

评论回复
13
宇容创行| | 2013-6-9 20:16 | 只看该作者

使用特权

评论回复
14
wkatt1002| | 2013-6-16 09:50 | 只看该作者
mark

使用特权

评论回复
15
O狂且O| | 2013-6-16 14:13 | 只看该作者
Compiler memory barrier
These barriers prevent a compiler from reordering instructions, they do not prevent reordering by CPU.
The GNU inline assembler statement
asm volatile("" ::: "memory");
or even
__asm__ __volatile__ ("" ::: "memory");
forbids GCC compiler to reorder read and write commands around it.[5]

学习了.

使用特权

评论回复
16
bill_shi68| | 2013-7-12 09:25 | 只看该作者
原来差距还这么大!!!!!!!!!!1

使用特权

评论回复
17
江枫渔火| | 2013-7-12 12:16 | 只看该作者
kan bu dong ,xue xi ing

使用特权

评论回复
18
zezy371| | 2013-7-14 23:38 | 只看该作者
看不太懂

使用特权

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

本版积分规则

个人签名:醒来才发现,一切都是一场梦

170

主题

4893

帖子

11

粉丝