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;
}
你用的硬件仿真在跑吗 这样很容易出现问题的 往往都是仿真器的稳定性带来的问题
你可以烧写到flash中跑个几天去测试
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
}
孤独求粗 发表于 2013-7-25 10:24 static/image/common/back.gif
谢谢版主的回复!
是这样的:
之前不连仿真器下到flash里面跑,跑三四个小时感觉DSP就死了(给他发数 ...
CMD应该没啥问题 如果有问题一开始就会出问题
很可能是程序跑飞了做了非法修改
我觉得你可以将你的工程量减少然后验证
如果没问题 再添加一部分功能 然后在验证
这样会找出问题所在 zhangmangui 发表于 2013-7-25 10:31 static/image/common/back.gif
CMD应该没啥问题 如果有问题一开始就会出问题
很可能是程序跑飞了做了非法修改
我觉得你可以将你的 ...
请问版主,您指的非法修改是什么概念?
会不会是由于我局部变量定义太多造成了?
我的stack一共1k的空间,其他函数里定义了不少局部变量。
我再查查,谢谢版主!
我会告诉你我是混积分的的嘛 孤独求粗 发表于 2013-7-25 17:20 static/image/common/back.gif
请问版主,您指的非法修改是什么概念?
会不会是由于我局部变量定义太多造成了?
我的stack一共1k的空间 ...
有时候定义的指针等指出去修改了不该修改的数据 这个问题确实是个比较头痛的 bug.
光凭这些信息只能说明有问题而已.
解决这个问题, 除了长期守候,等待问题再次出现.
还可以仔细分析代码运行过程, 寻找缺陷出现的可能, (不过这点非顶级高手, 不能完成这个工作).
还有, 通过改变外部条件, 制造问题出现的概率, 软件上也可以有意植入捕捉问题的监控代码.(这也要经验相当丰富的人来做)
推荐学习一下本坛里一位高人撰写的 "软件调试黑宝书", 可以直接在论坛里搜索一下 推荐了 我就找来了看看
airwill 发表于 2013-7-26 09:04 static/image/common/back.gif
这个问题确实是个比较头痛的 bug.
光凭这些信息只能说明有问题而已.
解决这个问题, 除了长期守候,等待问题 ...
谢谢两位版主的指导,一定会查出这个问题,谢谢! zhangmangui 发表于 2013-7-26 09:14 static/image/common/back.gif
推荐了 我就找来了看看
谢谢两位版主的指导,一定会查出这个问题,谢谢! 孤独求粗 发表于 2013-7-26 11:02 static/image/common/back.gif
谢谢两位版主的指导,一定会查出这个问题,谢谢!
加油相信你 楼主 应该对两面两个变量进行监控, 代码中应该主动判断是否超出缓冲区的大小..
否则某些意外状况,当值 变量无限增加,而破坏其他数据
特别是判断是不是==38这种, 某些状况比如 这个变量变成39后,
会导致变量无线增加....非常危险..
另外2812应该有非法中断, 想办法段下来, 然后手工查看那个位置进入的...
运气好,能让你想出原因.
RS485_Get_Len;
RS485_True_Count; 这种问题比较难搞,细细的查一遍程序,80%程序bug
jiemnij 发表于 2013-8-5 15:51 static/image/common/back.gif
楼主 应该对两面两个变量进行监控, 代码中应该主动判断是否超出缓冲区的大小..
否则某些意外状况,当值 变量 ...
嗯经验之谈 个人认为:中断处理的时间过长,需要的堆栈开销越大。建议把判断、解析放到查询处理。 程序重写, 最近一直忙别的事情,这个问题暂时还没能很好解决,解决后会与大家分享。
感谢各位网友,版主的热心帮助!谢谢! 孤独求粗 发表于 2013-9-9 09:31 static/image/common/back.gif
最近一直忙别的事情,这个问题暂时还没能很好解决,解决后会与大家分享。
感谢各位网友,版主的热心帮助! ...
期待你的分享 旁观,学习学习!!!!
页:
[1]