打印

程序中调用loop函数会影响堆栈,宏DELAY会吗?

[复制链接]
2409|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hxdjb|  楼主 | 2011-4-7 10:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
ayb_ice| | 2011-4-7 10:23 | 只看该作者
调用时堆栈加深,退出时释放了

使用特权

评论回复
板凳
hxdjb|  楼主 | 2011-4-7 10:27 | 只看该作者

先谢谢ayb_ice,不好意思,我问反了,请再看看

本帖最后由 hxdjb 于 2011-4-7 10:36 编辑

用DELAY时也会堆栈加深吗?我想用DELAY代替函数LOOP()用来做微秒级的延时。

使用特权

评论回复
地板
刘前辈| | 2011-4-7 10:32 | 只看该作者
除非这样,只嵌入,不调用:
    ……
   _nop_( );
  _nop_( );
  _nop_( );
  _nop_( );  
    ……


/

使用特权

评论回复
5
caighostniao| | 2011-4-7 10:35 | 只看该作者
来学习下

使用特权

评论回复
6
ayb_ice| | 2011-4-7 10:39 | 只看该作者
用宏是否会增加堆栈,那要看宏是怎么定义的
用你那个宏编译都过不了

使用特权

评论回复
7
hxdjb|  楼主 | 2011-4-7 10:55 | 只看该作者
本帖最后由 hxdjb 于 2011-4-7 11:05 编辑

编译通过了,这样行吗? 我就是想延时几个微秒,但是又不会影响堆栈,如果采用刘前辈的方法,ROM 不够。程序中用到
延时几个微秒的地方太多了。能否给个意见。
#define  DELAY(a,b)   a*b
uchar temp;
void  loop(void)
       { nop
          nop
          nop
          nop };
void main(void)
   {
      temp=DELAY(3,4);  //用宏 DELAY 会影响堆栈深度吗?
      loop; ()     
      .......
      .......
    }

使用特权

评论回复
8
ayb_ice| | 2011-4-7 11:43 | 只看该作者
LZ
堆栈没有那么紧张,一个平行的调用不会增加堆栈的深度,怕的是嵌套调用,
每嵌套一级调用增加2个字节的堆栈深度,一般很少有超过9级的嵌套调用,就算9级也才9*2=18字节
影响远小于中断

使用特权

评论回复
9
joyme| | 2011-4-7 11:43 | 只看该作者
宏是完全替代,智能节省写代码不能节省最终生成的代码量,你用a*b在c语言看似少了几行,可实际编译后你看汇编就知道比连用4个NOP要多很多,当然它的延时也不止这么多了。几个us如果主频是1MHz的话, 一个函数调用就差不多是4个指令周期即4us,你可以考虑loop函数里不要再加nop语句。

使用特权

评论回复
10
abin0415| | 2011-4-7 12:57 | 只看该作者
学习了

使用特权

评论回复
11
刘前辈| | 2011-4-7 19:23 | 只看该作者
本帖最后由 刘前辈 于 2011-4-7 19:28 编辑

很简单:直接嵌入NOP,计时精确,程序可靠,比调用跳转 / 返回好。

#define DELAY2  _nop_();_nop_()  
#define DELAY4  _nop_();_nop_();_nop_();_nop_()     //一个_nop_( ) 1 us或者固定延迟时间;

main( )

; DELAY4;
                        ; SOURCE LINE # 30
        NOP         
        NOP         
        NOP         
        NOP         
?C0001:


函数调用是要脱离程序轨道的,假设正在调用子程序中,随机中断发生,又跳到中断程序,中断又调用服务程序,……所以,跳来跳去并不好。


、、

使用特权

评论回复
12
ayb_ice| | 2011-4-8 08:52 | 只看该作者
LZ 看看这个帖子你就明白了 https://bbs.21ic.com/viewthread.php?tid=45743&highlight=

使用特权

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

本版积分规则

131

主题

242

帖子

2

粉丝