打印
[PIC®/AVR®/dsPIC®产品]

求助pic18内核,串口接收一段时间出现从0地址运行

[复制链接]
3374|26
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
nickyhzp|  楼主 | 2014-5-15 15:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
pic18内核,串口持续接收几个小时后出现从0地址运行的情况,表现出来跟复位一样,请问一下,串口编写中断需要注意什么吗?第一次接触pic,快被这个问题折磨死了,怀疑堆栈溢出,可是编译器没提示,而且,屏蔽掉其他代码,只保留串口收发还是有这个问题,接收是靠中断外加一个定时器检测超时,发送主函数,发送不会引起这个问题,这是中断处理程序
        if (TMR1IF && TMR1IE)
        {
                TMR1IF=0;
                TMR1ON=0;
                TMR1IE=0;

                if( GetBit(RS485State,InRcPro) )
                {
                        rs485_ReciTime();
                        ClrBit(RS485State,InRcPro);
                        CREN=0 ;
                        CREN=1 ;  
                       
                        serial_count = 25;
                        return;
                }

                Self.second +=4;
                TimeSecond +=5;
                return;
        }
        if( RCIF && RCIE )                //485接收中断
        {       
                RCIF = 0;
                if( FERR || OERR ) //监测是否有帧错误
                {         
                        CREN=0 ;
                        CREN=1 ;  //接收模块被复位重置,OERR清零
                        tmp=RCREG;  
                        return;
                }
                tmp = RCREG;
                if( GetBit(RS485State,InRcPro)==0 )
                {
                        Rs485TimeMs(5);
                        SetBit(RS485State,InRcPro);
                }                                       
                if( Rs485_buff.count < 110 )
                {
                        Rs485_buff.data[ Rs485_buff.count++ ] = tmp;
                        sleep_timera=15;
                        TMR1H=0xEC ;        //5ms
                        TMR1L=0x78;
                }
                return;
        }
沙发
wangch_sh| | 2014-5-17 10:13 | 只看该作者
怎么有return?

使用特权

评论回复
板凳
yewuyi| | 2014-5-17 15:47 | 只看该作者
这能说啥,只能自己面壁检查代码

使用特权

评论回复
地板
nickyhzp|  楼主 | 2014-5-19 08:48 | 只看该作者
wangch_sh 发表于 2014-5-17 10:13
怎么有return?

中断函数中的,就应该有return啊

使用特权

评论回复
5
nickyhzp|  楼主 | 2014-5-19 08:49 | 只看该作者
yewuyi 发表于 2014-5-17 15:47
这能说啥,只能自己面壁检查代码

我就是想知道,单纯的中断会不会引起pic内核的单片机从0地址运行(看门狗除外)

使用特权

评论回复
6
yewuyi| | 2014-5-19 09:34 | 只看该作者
nickyhzp 发表于 2014-5-19 08:49
我就是想知道,单纯的中断会不会引起pic内核的单片机从0地址运行(看门狗除外) ...

1、没有问题的中断,肯定不会让MCU复位。
2、但如果是不正确的代码形成的堆栈溢出等造成的PC值跳飞,则是有可能导致MCU复位的。

使用特权

评论回复
7
nickyhzp|  楼主 | 2014-5-19 10:55 | 只看该作者
yewuyi 发表于 2014-5-19 09:34
1、没有问题的中断,肯定不会让MCU复位。
2、但如果是不正确的代码形成的堆栈溢出等造成的PC值跳飞,则是 ...

目前把优化等级提高到5之后,到了以前差不多该出问题的时间没有出现复位,估计是代码有bug,编译器把它给优化掉了,还需进一步测试。唉

使用特权

评论回复
8
yewuyi| | 2014-5-19 11:01 | 只看该作者
nickyhzp 发表于 2014-5-19 10:55
目前把优化等级提高到5之后,到了以前差不多该出问题的时间没有出现复位,估计是代码有bug,编译器把它给 ...

我一向都是优化等级为最高。

使用特权

评论回复
9
nickyhzp|  楼主 | 2014-5-19 11:19 | 只看该作者
yewuyi 发表于 2014-5-19 11:01
我一向都是优化等级为最高。

以前用的winavr,有些地方优化与不优化差别挺大的,之后习惯了,用其他编译器,一般都是关闭优化验证功能,之后再开启优化:lol:lol

使用特权

评论回复
10
yewuyi| | 2014-5-19 11:21 | 只看该作者
nickyhzp 发表于 2014-5-19 11:19
以前用的winavr,有些地方优化与不优化差别挺大的,之后习惯了,用其他编译器,一般都是关闭优化验证功能 ...

俺用IAR、PICC等,基本上优化开到最高和不开优化对比,代码差的极少。

使用特权

评论回复
11
lanmp| | 2014-5-19 11:22 | 只看该作者
为什么有Return?另外,堆栈溢出是运行期的问题,编译器怎么会知道。

使用特权

评论回复
12
nickyhzp|  楼主 | 2014-5-19 11:27 | 只看该作者
yewuyi 发表于 2014-5-19 11:21
俺用IAR、PICC等,基本上优化开到最高和不开优化对比,代码差的极少。
...

写这种敏感程序,除了加volatile之外,其他普通变量,是不是都会被编译器优化?还是说具体怎么优化需要去看编译器的手册?

使用特权

评论回复
13
nickyhzp|  楼主 | 2014-5-19 11:28 | 只看该作者
lanmp 发表于 2014-5-19 11:22
为什么有Return?另外,堆栈溢出是运行期的问题,编译器怎么会知道。

我用的C语言开发的,是32级硬件堆栈,出现问题编译器会提示啊。不过我也一直怀疑是不是运行期间堆栈出问题了,只不过不能仿真,一时拿不出证据来证明

使用特权

评论回复
14
nickyhzp|  楼主 | 2014-5-19 11:29 | 只看该作者
lanmp 发表于 2014-5-19 11:22
为什么有Return?另外,堆栈溢出是运行期的问题,编译器怎么会知道。

return就是退出中断服务,退出后还有没响应的中断的话,会继续进来的

使用特权

评论回复
15
lanmp| | 2014-5-19 12:07 | 只看该作者
nickyhzp 发表于 2014-5-19 11:29
return就是退出中断服务,退出后还有没响应的中断的话,会继续进来的

你说的这么信誓旦旦我都有点含糊了,什么编译器要在Interrupt Handler里面加Return啊?

使用特权

评论回复
16
lanmp| | 2014-5-19 12:08 | 只看该作者
nickyhzp 发表于 2014-5-19 11:28
我用的C语言开发的,是32级硬件堆栈,出现问题编译器会提示啊。不过我也一直怀疑是不是运行期间堆栈出问 ...

出现什么问题会提示?提示什么?

使用特权

评论回复
17
yewuyi| | 2014-5-19 13:36 | 只看该作者
lanmp 发表于 2014-5-19 11:22
为什么有Return?另外,堆栈溢出是运行期的问题,编译器怎么会知道。

编译器不知道,只能傻傻的翻译,所以执行的时候溢出就可能会导致PC指针飞掉了。。。

使用特权

评论回复
18
yewuyi| | 2014-5-19 13:37 | 只看该作者
not return

使用特权

评论回复
19
lanmp| | 2014-5-19 14:55 | 只看该作者
我做的第一个单片机实验就出过和lz一样的问题。题目是用一个按键控制LED以四种不同的方式亮。当时用汇编,把四种模式写成四个死循环,按键后进中断,从中断里面直接goto到某一个循环里面去。写完程序觉得写得挺好,简洁明了,功能也没发现问题。估计老师也不是第一次见了,拿来板子狂按了一顿就....

使用特权

评论回复
20
nickyhzp|  楼主 | 2014-5-19 16:42 | 只看该作者
lanmp 发表于 2014-5-19 12:07
你说的这么信誓旦旦我都有点含糊了,什么编译器要在Interrupt Handler里面加Return啊? ...

这个项目我接手之前工程师加的return,由于第一次接触pic内核,我也就继续追随他的脚步了

使用特权

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

本版积分规则

4

主题

29

帖子

0

粉丝