中断优先级和中断调用函数问题

[复制链接]
查看7028 | 回复5 | 2014-1-7 21:17:53 | 显示全部楼层 |阅读模式
我在用到红外接收是用到外部中断,并且用延迟函数来判断高低电平,但是我在编译的时候编译器显示 error : error C2043 : 'isr_INT0' can't call non __interrupt function 'delay140us'。就是中断函数中不能调用非中断功能函数。但是我在查阅SN8 C Studio手册中P136有写中断函数中调用相应的处理函数。并且在SN8 C Studio help中没有找到相应error C2043的解释。请教一下如何在中断函数中调用非中断函数。还有一个问题是我现在用到定时器和中断函数,但是两者的优先级设定有问题,编译器要求两者的中断函数定义void __internet [0x08] usename()形式。我在SN8 C Studio软件文件中有一个例子说明多重中断的定义形式:
void __interrupt [0x08] ISR_WAKE(void)
{
        if(FWAKEIRQ)
        {
                FWAKEIRQ = 0;
        }
}
//-------------------------------------------------
void __interrupt [0x09] ISR_INT0(void)
{
        if(FP00IRQ)
        {
                FP00IRQ = 0;
        }
}
//-------------------------------------------------
void __interrupt [0x0A] ISR_INT1(void)
{
        if(FP01IRQ)
        {
                FP01IRQ = 0;
        }
}
//-------------------------------------------------
void __interrupt [0x0B] ISR_T0(void)
{
        if(FT0IRQ)
        {
                FT0IRQ = 0;
        }
}
sx3339241 | 2014-1-19 12:42:35 | 显示全部楼层
不错的资料!谢谢分享!!
金彩公子 | 2014-1-29 15:11:15 | 显示全部楼层
松翰的单片机不可以在中断里调用其他函数,如果确实要在中断里用这个函数,把这个函数直接写在中断里就ok了
有你真好 | 2014-4-19 23:01:57 | 显示全部楼层
在中断函数中调用非中断函数,对于松翰的C编译器写程序,尽量少在中断服务函数中调用函数,因为调用的函数不能重复调用,否则编译器会提示错误,但这个还是能解决的,可看编译器的帮助中有,V148版本解决了这个问题,个人意见最好就不要在中断服务函数中调用函数,因为还会容易导致堆栈溢出问题,
有你真好 | 2014-4-19 23:04:27 | 显示全部楼层
可以在主函数中
while(1)
{
    if(TC0IRQ)//1ms或者100us中断请求一次
    {
         TC0IRQ = 0;
        //调用函数
    }
}
zqy1818 | 2014-7-15 13:55:24 | 显示全部楼层
定义中断子函数就可以了,以下为2708代码参考:
------------------------------------------------------------------------------------------------------------------------------
#include <sn8p2708a.h>

void init_TC(void);
void __interrupt P00INT(void);
void __interrupt P01INT(void);
void __interrupt SIOINT(void);
void __interrupt T0INT(void);
void __interrupt TC0INT(void);
void __interrupt TC1INT(void);

bit ftc0int;
void __interrupt[0x8] intserv(void)
{
        if(FT0IRQ)
        {
                FT0IRQ=0;
                T0INT();
        }
        else if(FTC0IRQ)
        {
                FTC0IRQ =0;
                TC0INT();
        }
        else if(FTC1IRQ)
        {
                FTC1IRQ = 0;
                TC1INT();
        }
        else if(FP00IRQ)
        {
                FP00IRQ = 0;
                P00INT();
        }
        else if(FP01IRQ)
        {
                FP01IRQ = 0;
                P01INT();
        }
        else if(FSIOIRQ)
        {
                FSIOIRQ = 0;
                SIOINT();
        }

        else {}
}


void P00INT(void)
{
}
void P01INT(void)
{
}
void SIOINT(void)
{
}
void T0INT(void)
{
}
void TC0INT(void)
{
        TC0C=0x64;
        ftc0int = 1;
}

void TC1INT(void)
{

}

void main(void)
{
                init_TC();
}
void init_TC(void)
{
                FTC0IRQ = 0;
                FTC0IEN = 0;

                TC0M = 0x20;
                TC0C = 0x64;

                FTC0ENB = 1;
                FTC0IEN = 1;

                FGIE = 1;
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则