打印

keil c 中函数调用的问题!

[复制链接]
2498|6
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
liqimcu|  楼主 | 2007-2-28 10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void Wr93c46(tBYTE Addr_93c46,tWORD Word_93c46)
    {
    tBYTE i;
    Wen93c46();
    SK93c46=0;
    DI93c46=1;
    CS93c46=1;//选中
    Clock93c46();
    Addr_93c46=Addr_93c46&0x3f|0x40;
    for(i=8;i!=0;i--)
        {
        DI93c46=Addr_93c46&0x80;
        Clock93c46();
        Addr_93c46<<=1;
        }
    for(i=16;i!=0;i--)
        {
        DI93c46=Word_93c46&0x8000;
        Clock93c46();
        Word_93c46<<=1;
        }
    CS93c46=0;//不选中,以降低功耗
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    CS93c46=1;//选中
    DO93c46=1;
    while(DO93c46==0)
        {
        ;
        }
    EWDS();                ///用在此处不成功?
    }

调试时发现函数    EWDS();  不是被做为子程序调用的(lcall EWDS()),而是直接跳到那儿去(ljmp EWDS()),请问谁知道这是怎么回事?? 谢谢!

相关帖子

沙发
原野之狼| | 2007-3-3 12:37 | 只看该作者

RE:

我也有遇到这种情况:
可以查看一下汇编代码,看看到底是怎么运行的。
改变一下优化选项
确定器件没有选错
实在不行,稍稍改变一下程序接口,或者改变一些变量或函数的命名。

使用特权

评论回复
板凳
风吹草动| | 2007-3-3 22:23 | 只看该作者

要是把EWDS();放到while()里面会有什么结果呢?

使用特权

评论回复
地板
computer00| | 2007-3-3 23:12 | 只看该作者

已经解决过的了

使用特权

评论回复
5
liqimcu|  楼主 | 2007-3-7 10:00 | 只看该作者

已经有高人指点过了!

 xujunchen 发表于 2007-2-28 11:24 侃单片机 ←返回版面    

2楼: 这是优化造成的,没有关系. 

 



欢迎报名参加 新型触摸屏技术及其控制方案 在线研讨会>>>
 
 

 computer00 发表于 2007-2-28 11:27 侃单片机 ←返回版面    

3楼: 因为这个函数放在最后,没必要返回两次 

直接在EWDS函数内返回就行了。

例如A调用B,B又调用C,如果C在B的最后面,那么我们可以直接从C返回到A,没必要先返回到B,再又返回到A。


你在EWDS();之后随便写个什么有意义的语句,再来编译一下,结果就不一样了。 
 

使用特权

评论回复
6
ayb_ice| | 2007-3-12 10:00 | 只看该作者

随便说说

    EWDS();                // 用在此处不成功?
    _nop_();               // 添加即可(还必须有合适的头文件)

使用特权

评论回复
7
maxking| | 2007-3-12 16:21 | 只看该作者

头文件是"intrins.h"

使用特权

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

本版积分规则

7

主题

53

帖子

0

粉丝