分享PIC18单片机的低优先级中断的中断现场保护的恶心之处

2020-02-06 10:24发布

本帖最后由 heqiaosheng 于 2014-11-6 14:34 编辑

因为是初次使用PIC18f25k80单片机,所以对应它的中断保护没什么了解,只知道有两个优先级,然后项目中使用到的外设比较多,中断也比较多,所以就将中断分成高优先级和低优先级。

然后诡异的事就发生了,程序经常性的跑飞,大概纠结了一个月,那时我都怀疑我的编程能力了,最终找到了问题,我草,PIC18的低优先级中断竟然不保护现场!!!

希望以后用到此系类的同志们能注意到这个问题,强烈推荐只使用高优先级中断。虽然网上有中断保护的汇编代码,但是我没有用,我觉得高优先级中断就够了,那个恶心的低优先级中断就让它长眠吧!!!

图片来源:MPLAB C18 C 编译器入门 [06版].pdf 的102页。已经上传过了,要下载的请打开此链接 http://www.amobbs.com/thread-5603111-1-1.html

QQ截图20141106142645.png (139.67 KB, 下载次数: 0) 下载附件 中断现场保护 2014-11-6 14:26 上传

MPLAB C18 C编译器用户指南.pdf (1.07 MB, 下载次数: 37) 2014-11-6 14:27 上传 点击文件名下载附件


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
12条回答
tangkuan660
1楼-- · 2020-02-06 14:12
楼主从哪里搞到这么高级版本的中文版?自从有一次中文版把寄存器翻译错了,让我多调了3天,再也不敢用中文翻译的文档了。
heqiaosheng
2楼-- · 2020-02-06 14:16
tangkuan660 发表于 2014-11-6 15:16
楼主从哪里搞到这么高级版本的中文版?自从有一次中文版把寄存器翻译错了,让我多调了3天,再也不敢用中文 ...

PIC的中文文档比较丰富,以上文档是编译器安装时的自带的参考文档。
yklstudent
3楼-- · 2020-02-06 14:25
 精彩回答 2  元偷偷看……
EMC菜鸟
4楼-- · 2020-02-06 19:47
虽然也用 PIC18 ,但从没使用过中断嵌套,所以没遇到楼主的问题,但对楼主的问题我有疑问:
1、PIC16 级别的单片机,你说的那些寄存器也都不是由CPU自动保存的,也需要代码来保存,照你这么说,PIC16 的中断都别用了?
2、一直以为除非你用汇编,用 C 的话应该不需要你考虑中断现场保护的事情吧,C 编译器不是都帮你做到了么?(C编译器应该对此有明确的说明,如果需要你自己用代码保护现场,也应该会有明确的说明的吧)
heqiaosheng
5楼-- · 2020-02-06 22:07
yklstudent 发表于 2014-11-6 16:31
Code highlighting produced by Actipro CodeHighlighter (freeware)http://www.CodeHighlighter.com/-->1  ...

我就是这样写的。

//=============================================================================
//【函数功能】中断处理子函数
//【参数说明】无
//【创建时间】
//【修改时间】
//=============================================================================

//----------------------------------------------------------------------------
// Low priority interrupt vector

#pragma code InterruptVectorLow = 0x18
void InterruptVectorLow(void)
{
  _asm
    goto InterruptHandlerLow //jump to interrupt routine
  _endasm
}

//----------------------------------------------------------------------------
// Low priority interrupt routine

#pragma code
#pragma interrupt InterruptHandlerLow

void InterruptHandlerLow(void)// 低优先级中断处理(只保存PC)
{
       
}

//----------------------------------------------------------------------------
// High priority interrupt vector

#pragma code InterruptVectorHigh = 0x08
void InterruptVectorHigh(void)
{
  _asm
    goto InterruptHandlerHigh //jump to interrupt routine
  _endasm
}

//----------------------------------------------------------------------------
// High priority interrupt routine

#pragma code
#pragma interrupt InterruptHandlerHigh

// 注意此中断处理函数需要在开头声明
void InterruptHandlerHigh(void)// 高优先级中断处理(自动保存PC、WREG、BSR和STAUTS寄存器)
{
        u8 i = 0;
       
        if(INTCONbits.TMR0IF == 1)
        {
                ;
        }
       
        if(INTCONbits.RBIF == 1)// PB电平中断
        {
                INTCONbits.RBIF = 0;
               
                ;
        }

        if(PIR1bits.TMR1IF == 1)// Timer1中断处理
        {                        
                ;
        }

        if(PIR1bits.RC1IF == 1)// 串口接收中断
        {
                i = RCREG1;//  清除标志
        }

        if(PIR5bits.RXB0IF == 1)// CAN接收中断
        {   
                PIR5bits.RXB0IF = 0;// 清接收中断标志
        }
}
yklstudent
6楼-- · 2020-02-06 22:41
heqiaosheng 发表于 2014-11-7 16:43
我就是这样写的。

//=============================================================================

这样写,还是有问题?
幸好一开始我就一直用的高中断,低中断一直没去用过

一周热门 更多>