[AVR单片机] 请各位看看这个函数的编译结果

[复制链接]
 楼主| 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 | 显示全部楼层
只有两三行那么简单的代码,自己用汇编函数写不就完全满足要求了?
ccxlslr 发表于 2013-3-25 13:22 | 显示全部楼层
huangxz 发表于 2013-3-25 10:42
谢谢楼上这位,今天试了一下,确实没有被优化,但是变的程序很长,达不到我想要的两行汇编

...


两行汇编是写不出能在C下长时间,无BUG,任何条下都能正确运行的函数的,除非你对编译器很熟,对调用规则很熟。
而且还要考虑重入等问题。
你当人这做编译器的人是傻子啊,能简单的搞这么长,人家规则在那里摆着的。
qin552011373 发表于 2013-3-25 13:23 | 显示全部楼层
自己写好嵌进去
ccxlslr 发表于 2013-3-25 13:44 | 显示全部楼层
本帖最后由 ccxlslr 于 2013-3-25 13:45 编辑
qin552011373 发表于 2013-3-25 13:23
自己写好嵌进去


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

可以根据使用环境适当优化。但还需要知道有这些问题,会不会有冲突
 楼主| huangxz 发表于 2013-3-25 13:46 | 显示全部楼层
qin552011373 发表于 2013-3-25 13:23
自己写好嵌进去

是的,可以使用在线汇编,但是跟据功能,像我这样写的c代码确实是用两行汇编就可以实现的,因为avr里有r0-r31总共32个寄存器,所以代码可以优化的很高效率,所以完全可以用两行汇编来实现.至于我为啥不用嵌入汇编来实现是因为还想跟21家的高手请教更多关于编译器的使用技巧。对于实际的应用的,像我这样的也许并不多。谢谢各位的回复。
john_lee 发表于 2013-3-25 18:57 | 显示全部楼层
本帖最后由 john_lee 于 2013-3-25 18:58 编辑

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

评论

GCC 用的真溜. 哈....学习了.  发表于 2013-6-16 14:14

评分

参与人数 2威望 +11 收起 理由
qin552011373 + 6 赞一个!
mxh0506 + 5 牛X !

查看全部评分

 楼主| huangxz 发表于 2013-3-25 22:21 | 显示全部楼层
john_lee 发表于 2013-3-25 18:57
这样写: 自己看反汇编结果。

令人惊叹的完美表现,

谢谢john_lee


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
qin552011373 发表于 2013-3-27 23:03 | 显示全部楼层
学习一下
yhhsky 发表于 2013-3-30 18:48 | 显示全部楼层
宇容创行 发表于 2013-6-9 20:16 | 显示全部楼层
wkatt1002 发表于 2013-6-16 09:50 | 显示全部楼层
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
  1. asm volatile("" ::: "memory");
or even
  1. __asm__ __volatile__ ("" ::: "memory");
forbids GCC compiler to reorder read and write commands around it.[5]

学习了.
bill_shi68 发表于 2013-7-12 09:25 | 显示全部楼层
原来差距还这么大!!!!!!!!!!1
江枫渔火 发表于 2013-7-12 12:16 | 显示全部楼层
kan bu dong ,xue xi ing
zezy371 发表于 2013-7-14 23:38 | 显示全部楼层
看不太懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

177

主题

4937

帖子

11

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