打印

这段话怎么理解,关于PICC的C语言细节。求解答~~

[复制链接]
2517|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tc9148|  楼主 | 2012-1-31 22:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void delay(uchar i)
{}


void main()
{}


void  interrupt usart(void)
{
      delay(100);


}
程序细节省略,在用maplab 编译时,提示错误,但是当我把delay(100)去掉时,编译成功,有人回答说是:中断调用了外部的函数吧,中断中的函数要跟外面的独立。

但是我不理解这句话的意思,谁能说的直白点,和C语言哪里冲突了。万分感谢。

相关帖子

沙发
ghpzhu| | 2012-1-31 22:15 | 只看该作者
LZ在main函数或其它函数中有没有调用delay(uchar i)?
如果有的话,就这就不是一个安全的程序了,存在潜在的危险,例如可能在main()中调用delay()的时候发生中断。再者说你这个在中断中加入延时函数也太“另类”了。

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
tc9148 + 1
板凳
tc9148|  楼主 | 2012-1-31 23:39 | 只看该作者
2# ghpzhu

不是另类,是因为我为了临时验证一下功能,采取的措施。

使用特权

评论回复
地板
原野之狼| | 2012-2-1 00:07 | 只看该作者
把ERROR信息贴出来吧

使用特权

评论回复
5
ayb_ice| | 2012-2-1 08:25 | 只看该作者
这个是由PIC MCU特点决定的,
标准的C函数一般是重入的,但PIC的结构限制了重入,PICC这点故意不兼容标准C的,KEIL C51也是类似的

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
tc9148 + 1 说的很有说服力,我想给10分,好像给不了。 ...
6
tc9148|  楼主 | 2012-2-1 08:29 | 只看该作者
5# ayb_ice

能帮我看看这个程序的问题出在哪里吗?
https://bbs.21ic.com/frame.php?frameon=yes&referer=http%3A//bbs.21ic.com/my.php%3Fitem%3Dposts

使用特权

评论回复
7
tc9148|  楼主 | 2012-2-1 08:30 | 只看该作者
5# ayb_ice

能帮我看看这个程序的问题出在哪里吗?

程序1:
#include <pic.h>
#define uchar  unsigned char
#define uint   unsigned int
__CONFIG(0x30D2);
uchar t,x;


void main()
{
    uint j=10,i=50000;
    t=0;
    x=9;
    TRISC=0xc0;
    TRISD4=0; //RD4口定义为输出
    RD4=0;
////////////////////////////////////////////////////////////////////////////
//这段程序放在这里,编译完后,烧写,然后LED确实闪烁5次。
////////////////////////////////////////////////////////////////////////////
    while(j--) //闪烁5次
    {
        while(i--); //
        i=50000;
        RD4=~RD4; //
    }   
///////////////////////////////////////////////////////////////////////////
    SPBRG=0x64;
    TXSTA=0x24;
    RCSTA=0x90;
    RCIE=1;
    TXIE=1;
    PEIE=1;
    GIE=1;


    while(1);

}

void interrupt usart(void)
{
    if(RCIF)//判断是否为串口接受中断
    {
        RCIF=0;
          t=RCREG;
        if(t==1)
        {
            t=0;
            RD4=~RD4;
            TXREG=x;
        }
    }
}







程序2:
#include <pic.h>
#define uchar  unsigned char
#define uint   unsigned int
__CONFIG(0x30D2);
uchar t,x;


void main()
{
    uint j=10,i=50000;
    t=0;
    x=9;
    TRISC=0xc0;
    TRISD4=0; //RD4口定义为输出
    RD4=0;
    SPBRG=0x64;
    TXSTA=0x24;
    RCSTA=0x90;
    RCIE=1;
    TXIE=1;
    PEIE=1;
    GIE=1;

////////////////////////////////////////////////////////////////////////////
//这段程序放在这里,编译完后,烧写,然后LED根本就没有闪烁。
////////////////////////////////////////////////////////////////////////////
    while(j--) //闪烁5次
    {
        while(i--); //
        i=50000;
        RD4=~RD4; //
    }   
///////////////////////////////////////////////////////////////////////////

    while(1);

}

void interrupt usart(void)
{
    if(RCIF)//判断是否为串口接受中断
    {
        RCIF=0;
          t=RCREG;
        if(t==1)
        {
            t=0;
            RD4=~RD4;
            TXREG=x;
        }
    }
}










这是为什么呢?急死我啦,LED闪烁程序放的位置不同,造成的结果不同,但是串口通信和PC机通信是正常的,都可以收到和发送。奇怪啦!哪里有问题?

使用特权

评论回复
8
ayb_ice| | 2012-2-1 10:40 | 只看该作者
应该是你的程序受到中断的影响了

使用特权

评论回复
9
tc9148|  楼主 | 2012-2-1 13:03 | 只看该作者
8# ayb_ice w

问题是中断是随机的,为什么一打开全局中断和外部中断,程序就停在这里不动了呢?

使用特权

评论回复
10
lifeinjoy| | 2012-2-5 17:28 | 只看该作者
interrupt 是关键字,可能用错了

使用特权

评论回复
11
谈的元| | 2012-2-5 22:47 | 只看该作者
8# ayb_ice  w

问题是中断是随机的,为什么一打开全局中断和外部中断,程序就停在这里不动了呢?
tc9148 发表于 2012-2-1 13:03


前面程序是执行闪烁后再执行中断的

后面的是执行中断后 再执行闪烁代码的

中断是随机的,但记得没开全局中断,所有的中断是不执行的,是等待的

一旦开启全局中断,,如果有中断事情产生,就会执行中断代码

使用特权

评论回复
12
jiebin689| | 2012-2-6 08:10 | 只看该作者
中断中加入延时.?
那改寄存器的初始值不更好?...

使用特权

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

本版积分规则

个人签名:一回生,两回熟。

137

主题

589

帖子

1

粉丝