求救!开发的系统连续运行时,时长会出现Security violation(BOR)复位。按照http://stackoverflow.com/questions/28943839/msp430-random-resets-with-security-violation-bor这个里面提供的思路排查,基本定位出程序执行到哪个位置复位的。但无法确定是什么引起的。
程序简述:
1. 该程序采用片上ADC12采集流量信号,ADC12工作在单通道循环采样的模式,采样结果通过DMA传递的片内的RAM中的一个缓冲数组Sample_data里,DMA工作在repeat single transfer模式下。
2. Sample_data数组长度定义为2100个字,ADC12的采样结果循环缓冲到这个数组里。
3. Sample_data数组缓冲到2048点后,开始执行computation函数,从Sample_data中取出2048点数据做两次FFT运算来计算流量。(与此同时,ADC12继续采数据通过DMA循环缓冲到Sample_data中去)。注:FFT运算是用汇编语言编写的,这个汇编函数应该没有问题,之前已经用了很多年了。
4. computation函数是在main()函数里面循环调用的,即 computation被循环不断地执行。
5. 系统还开启了一个Timer,每隔25ms产生一次中断,在中断函数里面计算瞬时流量和累积流量。
问题描述:
1. 系统长时间运行时偶尔会出现复位,通过SYSRSTIV寄存器判断是0A复位,即Security Violation(BOR)。通过设置_no_init数组来记录复位前的运行位置发现程序复位的位置均在第二次做FFT运算里面,但无法确定具体原因。
2. 做2048点FFT时,程序所占用的空间情况如下(IAR编译),空间未超。
70 810 bytes of CODE memory
15 368 bytes of DATA memory (+ 144 absolute )
171 bytes of CONST memory
(其中,stack分的是1024,heap分的是100)
3. 在FFT的汇编函数中多个地方记录复位前SP的值,并未发现其有超出或接近STACK边界的情况(CSTACK边界为5800 – 5BFF),大多都在0x5B以上,而且没有异常。
不知这个复位还有哪些因素会引起?
灰小子:
运行computation函数的时候把adc采样关了,看看还复位么?
SeaFesse:
你是专家。。。
HG:
这种问题一般会比较复杂,通常是因为非法操作了boot code。首先要做的就是定位,逐次屏蔽代码,看看到哪里的时候发现这种问题。
能用Violate关键字的都要用上,不过你如果用DMA的话可能会有一些问题,比如你还没有管DMAx (DMAxCTL.DMAEN = 0)就修改DMAxSA, DMAxDA and DMAxSZ寄存器。如果确实用了,试试下面的步骤。
DMAxCTL.DMAEN = 0
Set DMAxSA, DMAxDA and DMAxSZ with the appropriate values
DMAxCTL = DMADT_4 | DMADSTINCR_0 | DMASRCINCR_0 | DMAEN