打印
[DSP编程]

2812跑十几个小时--死了

[复制链接]
2211|19
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
孤独求粗|  楼主 | 2013-7-24 16:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 孤独求粗 于 2013-7-24 16:14 编辑

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

    RS485_Get_Data[RS485_Get_Len] = (WORD8)(ScibRegs.SCIRXBUF.all & 0x00FF);
    if(RS485_Get_Data[0] == RS485_START1_FRAME)
    {
      if((RS485_Get_Data[RS485_Get_Len] == 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_True_Count] = RS485_Get_Data[RS485_Get_Len];
                RS485_Get_Len++;
                flag++;
                if(flag % 2 == 0)
                {
                 RS485_True_Count++;
                 flag = 0;
                }
          }
      else
          {
            flag = 0;
            RS485_True_Data[RS485_True_Count] = RS485_Get_Data[RS485_Get_Len];
            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[RS485_Get_Len-1]) && (CRC2 == RS485_Get_Data[RS485_Get_Len]) && \
                (RS485_Get_Data[1] == RS485_START2_FRAME) && (RS485_Get_Data[RS485_Get_Len-3] == RS485_END1_FRAME) && \
                (RS485_Get_Data[RS485_Get_Len-2] == 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;
        }

QQ截图20130724160951.png (41.29 KB )

QQ截图20130724160951.png

相关帖子

沙发
zhangmangui| | 2013-7-24 18:22 | 只看该作者
你用的硬件仿真在跑吗   这样很容易出现问题的   往往都是仿真器的稳定性带来的问题   
你可以烧写到flash中  跑个几天去测试  

使用特权

评论回复
板凳
孤独求粗|  楼主 | 2013-7-25 10:24 | 只看该作者
zhangmangui 发表于 2013-7-24 18:22
你用的硬件仿真在跑吗   这样很容易出现问题的   往往都是仿真器的稳定性带来的问题   
你可以烧写到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
谢谢版主的回复!
是这样的:
    之前不连仿真器下到flash里面跑,跑三四个小时感觉DSP就死了(给他发数 ...

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
孤独求粗 + 1 很给力!谢谢
5
孤独求粗|  楼主 | 2013-7-25 17:20 | 只看该作者
zhangmangui 发表于 2013-7-25 10:31
CMD应该没啥问题   如果有问题一开始就会出问题  
很可能是程序跑飞了  做了非法修改
我觉得你可以将你的 ...

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

使用特权

评论回复
6
盛熙傲雪| | 2013-7-25 17:46 | 只看该作者
我会告诉你我是混积分的的嘛

使用特权

评论回复
7
zhangmangui| | 2013-7-25 18:42 | 只看该作者
孤独求粗 发表于 2013-7-25 17:20
请问版主,您指的非法修改是什么概念?
会不会是由于我局部变量定义太多造成了?
我的stack一共1k的空间 ...

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

使用特权

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
孤独求粗 + 1 赞一个!
9
zhangmangui| | 2013-7-26 09:14 | 只看该作者
推荐了   我就找来了  看看
程序调试黑宝书.pdf (847.97 KB)

使用特权

评论回复
10
孤独求粗|  楼主 | 2013-7-26 11:00 | 只看该作者
airwill 发表于 2013-7-26 09:04
这个问题确实是个比较头痛的 bug.
光凭这些信息只能说明有问题而已.
解决这个问题, 除了长期守候,等待问题 ...

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

使用特权

评论回复
11
孤独求粗|  楼主 | 2013-7-26 11:02 | 只看该作者
zhangmangui 发表于 2013-7-26 09:14
推荐了   我就找来了  看看

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

使用特权

评论回复
12
zhangmangui| | 2013-7-26 11:05 | 只看该作者
孤独求粗 发表于 2013-7-26 11:02
谢谢两位版主的指导,一定会查出这个问题,谢谢!

加油  相信你

使用特权

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

使用特权

评论回复
评分
参与人数 1威望 +1 收起 理由
孤独求粗 + 1 赞一个!
14
wgj_fly| | 2013-8-6 17:14 | 只看该作者
这种问题比较难搞,细细的查一遍程序,80%程序bug

使用特权

评论回复
15
zhangmangui| | 2013-8-15 12:06 | 只看该作者
jiemnij 发表于 2013-8-5 15:51
楼主 应该对两面两个变量进行监控, 代码中应该主动判断是否超出缓冲区的大小..
否则某些意外状况,当值 变量 ...

嗯  经验之谈

使用特权

评论回复
16
hczsea| | 2013-8-19 13:56 | 只看该作者
个人认为:中断处理的时间过长,需要的堆栈开销越大。建议把判断、解析放到查询处理。

使用特权

评论回复
17
wyscjm| | 2013-8-19 15:06 | 只看该作者
程序重写,

使用特权

评论回复
18
孤独求粗|  楼主 | 2013-9-9 09:31 | 只看该作者
最近一直忙别的事情,这个问题暂时还没能很好解决,解决后会与大家分享。
感谢各位网友,版主的热心帮助!谢谢!

使用特权

评论回复
19
zhangmangui| | 2013-9-9 10:11 | 只看该作者
孤独求粗 发表于 2013-9-9 09:31
最近一直忙别的事情,这个问题暂时还没能很好解决,解决后会与大家分享。
感谢各位网友,版主的热心帮助! ...

期待你的分享

使用特权

评论回复
20
tianwen_4524| | 2013-9-11 13:46 | 只看该作者
旁观,学习学习!!!!

使用特权

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

本版积分规则

3

主题

19

帖子

1

粉丝