孤独求粗 发表于 2013-7-24 16:12

2812跑十几个小时--死了

本帖最后由 孤独求粗 于 2013-7-24 16:14 编辑

我的2812 DSP程序大体是这样的:
1、用SCIB中断接收485数据,接收完后发送一组数据,中断接收周期为200ms;
2、我的中断接收的程序如下,因为这部分涉及到一个数据的转义(一包数据中遇到0x10会转移成0x10 0x10(不包括帧头帧尾及校验),接收到这包数后,要正确解析),之前没有转义的时候,程序一点问题都没有,可能是这段程序不知道哪里出了问题,查了半天也没查到。
3、前两天程序跑个三、四个小时就进非法中断(连仿真器);从昨天晚上开始跑,跑到今天早晨,一共跑了十几个小时,又死了,但是这次提示一个错误(如附件),貌似是什么堆栈溢出之类的,查了一天也没找到根源,现在急的要命要命的,希望论坛里的朋友能帮忙支支招。

    RS485_Get_Data = (WORD8)(ScibRegs.SCIRXBUF.all & 0x00FF);
    if(RS485_Get_Data == RS485_START1_FRAME)
    {
      if((RS485_Get_Data == 0x10) && (RS485_Get_Len != 0) && \
         (RS485_True_Count != 34) && (RS485_True_Count != 35) && (RS485_True_Count != 36) && \
         (RS485_True_Count != 37))                //判断帧头(0x10 0x02)、帧尾(0x10 0x03)
          {
            RS485_True_Data = RS485_Get_Data;
                RS485_Get_Len++;
                flag++;
                if(flag % 2 == 0)
                {
               RS485_True_Count++;
               flag = 0;
                }
          }
      else
          {
            flag = 0;
            RS485_True_Data = RS485_Get_Data;
            RS485_True_Count++;
          if(RS485_True_Count == 38)       //去掉转义后的数据包真实长度是38个字节
            {
            CRC1 = (CRC_CCITT_FCS(RS485_Get_Data, (RS485_Get_Len-1)) & 0xFF00)>>8;
            CRC2 =CRC_CCITT_FCS(RS485_Get_Data, (RS485_Get_Len-1)) & 0x00FF;
             if((CRC1 == RS485_Get_Data) && (CRC2 == RS485_Get_Data) && \
                (RS485_Get_Data == RS485_START2_FRAME) && (RS485_Get_Data == RS485_END1_FRAME) && \
                (RS485_Get_Data == RS485_END2_FRAME))   //去掉转义后,判断这包数的帧头、帧尾、及校验,正确的话解析
            {
                RS485Data_Extract(RS485_True_Data);
                RS485_Get_End = 1;
                RS485_Get_Len = 0;
                RS485_True_Count = 0;
            }
            else
            {
                RS485_Get_Len = 0;
                RS485_True_Count = 0;
            }
            }
            else
            {
            RS485_Get_Len++;
            }
      }


      }
      else
      {
          RS485_Get_Len = 0;
          RS485_True_Count = 0;
      }

zhangmangui 发表于 2013-7-24 18:22

你用的硬件仿真在跑吗   这样很容易出现问题的   往往都是仿真器的稳定性带来的问题   
你可以烧写到flash中跑个几天去测试

孤独求粗 发表于 2013-7-25 10:24

zhangmangui 发表于 2013-7-24 18:22 static/image/common/back.gif
你用的硬件仿真在跑吗   这样很容易出现问题的   往往都是仿真器的稳定性带来的问题   
你可以烧写到flash ...
谢谢版主的回复!
是这样的:
    之前不连仿真器下到flash里面跑,跑三四个小时感觉DSP就死了(给他发数,不给回);
    后来我想连上仿真器看看是什么问题,发现跑个三四个小时就进非法中断了,昨天连着仿真器一直跑了一晚上进非法中断,白天来了重新运行DSP(不是重新上电),就提示附件所示的错误。
    目前出现这个问题只有DSP重新上电才能恢复,没找到问题,感到很无助,cmd文件应该也没问题,我查了好多遍,再把我的cmd文件附上,大家帮忙看看吧。谢谢了!

MEMORY
{
PAGE 0:    /* Program Memory */
         /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE1 for data allocation */

   ZONE0       : origin = 0x002000, length = 0x002000   /* XINTF zone 0 */
   ZONE1       : origin = 0x004000, length = 0x002000   /* XINTF zone 1 */
   RAML0       : origin = 0x008000, length = 0x001000   /* on-chip RAM block L0 */
   ZONE2       : origin = 0x080000, length = 0x080000   /* XINTF zone 2 */
   ZONE6       : origin = 0x100000, length = 0x080000   /* XINTF zone 6 */
   OTP         : origin = 0x3D7800, length = 0x000800   /* on-chip OTP */
   FLASHJ      : origin = 0x3D8000, length = 0x002000   /* on-chip FLASH */
   FLASHI      : origin = 0x3DA000, length = 0x002000   /* on-chip FLASH */
   FLASHH      : origin = 0x3DC000, length = 0x004000   /* on-chip FLASH */
   FLASHG      : origin = 0x3E0000, length = 0x004000   /* on-chip FLASH */
   FLASHF      : origin = 0x3E4000, length = 0x004000   /* on-chip FLASH */
   FLASHE      : origin = 0x3E8000, length = 0x004000   /* on-chip FLASH */
   FLASHD      : origin = 0x3EC000, length = 0x004000   /* on-chip FLASH */
   FLASHC      : origin = 0x3F0000, length = 0x004000   /* on-chip FLASH */
   FLASHA      : origin = 0x3F6000, length = 0x001F80   /* on-chip FLASH */
   CSM_RSVD    : origin = 0x3F7F80, length = 0x000076   /* Part of FLASHA.Program with all 0x0000 when CSM is in use. */
   BEGIN       : origin = 0x3F7FF6, length = 0x000002   /* Part of FLASHA.Used for "boot to Flash" bootloader mode. */
   CSM_PWL   : origin = 0x3F7FF8, length = 0x000008   /* Part of FLASHA.CSM password locations in FLASHA */

   ROM         : origin = 0x3FF000, length = 0x000FC0   /* Boot ROM available if MP/MCn=0 */
   RESET       : origin = 0x3FFFC0, length = 0x000002   /* part of boot ROM (MP/MCn=0) or XINTF zone 7 (MP/MCn=1) */
   VECTORS   : origin = 0x3FFFC2, length = 0x00003E   /* part of boot ROM (MP/MCn=0) or XINTF zone 7 (MP/MCn=1) */

PAGE 1 :   /* Data Memory */
                /* Memory (RAM/FLASH/OTP) blocks can be moved to PAGE0 for program allocation */
                /* Registers remain on PAGE1                                                */

   RAMM0       : origin = 0x000000, length = 0x000400   /* on-chip RAM block M0 */
   RAMM1       : origin = 0x000400, length = 0x000400   /* on-chip RAM block M1 */
   RAML1       : origin = 0x009000, length = 0x001000   /* on-chip RAM block L1 */
   FLASHB      : origin = 0x3F4000, length = 0x002000   /* on-chip FLASH */
   RAMH0       : origin = 0x3F8000, length = 0x002000   /* on-chip RAM block H0 */
}

SECTIONS
{

   /* Allocate program areas: */
   .cinit            : > FLASHC      PAGE = 0
   .pinit            : > FLASHC,   PAGE = 0
   .text               : > FLASHC      PAGE = 0
   codestart         : > BEGIN       PAGE = 0
   ramfuncs            : LOAD = FLASHC,
                         RUN = RAML0,         
                                          /*   RUN = RAMH0,          */
                         LOAD_START(_RamfuncsLoadStart),
                         LOAD_END(_RamfuncsLoadEnd),
                         RUN_START(_RamfuncsRunStart),
                         PAGE = 0

   .stack            : > RAMM0       PAGE = 1
   .ebss               : > RAML1       PAGE = 1
   .esysmem            : > RAMH0       PAGE = 1


   .econst             : LOAD = FLASHC,      PAGE = 0,
                         RUN= RAMH0,       PAGE = 1,
                                                 RUN_START(_econst_runstart),
                         LOAD_START(_econst_loadstart),
                         LOAD_END(_econst_loadend)


   .switch             : > FLASHA      PAGE = 0      

   IQmath            : > FLASHC      PAGE = 0                  /* Math Code */
   IQmathTables      : > ROM         PAGE = 0, TYPE = NOLOAD   /* Math Tables In ROM */

   .reset            : > RESET,      PAGE = 0, TYPE = DSECT
   vectors             : > VECTORS   PAGE = 0, TYPE = DSECT

}


zhangmangui 发表于 2013-7-25 10:31

孤独求粗 发表于 2013-7-25 10:24 static/image/common/back.gif
谢谢版主的回复!
是这样的:
    之前不连仿真器下到flash里面跑,跑三四个小时感觉DSP就死了(给他发数 ...

CMD应该没啥问题   如果有问题一开始就会出问题
很可能是程序跑飞了做了非法修改
我觉得你可以将你的工程量减少然后验证   
如果没问题   再添加一部分功能   然后在验证
这样会找出问题所在

孤独求粗 发表于 2013-7-25 17:20

zhangmangui 发表于 2013-7-25 10:31 static/image/common/back.gif
CMD应该没啥问题   如果有问题一开始就会出问题
很可能是程序跑飞了做了非法修改
我觉得你可以将你的 ...

请问版主,您指的非法修改是什么概念?
会不会是由于我局部变量定义太多造成了?
我的stack一共1k的空间,其他函数里定义了不少局部变量。
我再查查,谢谢版主!

盛熙傲雪 发表于 2013-7-25 17:46

我会告诉你我是混积分的的嘛

zhangmangui 发表于 2013-7-25 18:42

孤独求粗 发表于 2013-7-25 17:20 static/image/common/back.gif
请问版主,您指的非法修改是什么概念?
会不会是由于我局部变量定义太多造成了?
我的stack一共1k的空间 ...

有时候定义的指针等指出去修改了不该修改的数据

airwill 发表于 2013-7-26 09:04

这个问题确实是个比较头痛的 bug.
光凭这些信息只能说明有问题而已.
解决这个问题, 除了长期守候,等待问题再次出现.
还可以仔细分析代码运行过程, 寻找缺陷出现的可能, (不过这点非顶级高手, 不能完成这个工作).
还有, 通过改变外部条件, 制造问题出现的概率, 软件上也可以有意植入捕捉问题的监控代码.(这也要经验相当丰富的人来做)
推荐学习一下本坛里一位高人撰写的 "软件调试黑宝书", 可以直接在论坛里搜索一下

zhangmangui 发表于 2013-7-26 09:14

推荐了   我就找来了看看

孤独求粗 发表于 2013-7-26 11:00

airwill 发表于 2013-7-26 09:04 static/image/common/back.gif
这个问题确实是个比较头痛的 bug.
光凭这些信息只能说明有问题而已.
解决这个问题, 除了长期守候,等待问题 ...
谢谢两位版主的指导,一定会查出这个问题,谢谢!

孤独求粗 发表于 2013-7-26 11:02

zhangmangui 发表于 2013-7-26 09:14 static/image/common/back.gif
推荐了   我就找来了看看

谢谢两位版主的指导,一定会查出这个问题,谢谢!

zhangmangui 发表于 2013-7-26 11:05

孤独求粗 发表于 2013-7-26 11:02 static/image/common/back.gif
谢谢两位版主的指导,一定会查出这个问题,谢谢!

加油相信你

jiemnij 发表于 2013-8-5 15:51

楼主 应该对两面两个变量进行监控, 代码中应该主动判断是否超出缓冲区的大小..
否则某些意外状况,当值 变量无限增加,而破坏其他数据
特别是判断是不是==38这种, 某些状况比如 这个变量变成39后,
会导致变量无线增加....非常危险..
另外2812应该有非法中断, 想办法段下来, 然后手工查看那个位置进入的...
运气好,能让你想出原因.
RS485_Get_Len;
RS485_True_Count;

wgj_fly 发表于 2013-8-6 17:14

这种问题比较难搞,细细的查一遍程序,80%程序bug

zhangmangui 发表于 2013-8-15 12:06

jiemnij 发表于 2013-8-5 15:51 static/image/common/back.gif
楼主 应该对两面两个变量进行监控, 代码中应该主动判断是否超出缓冲区的大小..
否则某些意外状况,当值 变量 ...

嗯经验之谈

hczsea 发表于 2013-8-19 13:56

个人认为:中断处理的时间过长,需要的堆栈开销越大。建议把判断、解析放到查询处理。

wyscjm 发表于 2013-8-19 15:06

程序重写,

孤独求粗 发表于 2013-9-9 09:31

最近一直忙别的事情,这个问题暂时还没能很好解决,解决后会与大家分享。
感谢各位网友,版主的热心帮助!谢谢!

zhangmangui 发表于 2013-9-9 10:11

孤独求粗 发表于 2013-9-9 09:31 static/image/common/back.gif
最近一直忙别的事情,这个问题暂时还没能很好解决,解决后会与大家分享。
感谢各位网友,版主的热心帮助! ...

期待你的分享

tianwen_4524 发表于 2013-9-11 13:46

旁观,学习学习!!!!
页: [1]
查看完整版本: 2812跑十几个小时--死了