1. 故障发生时软件系统的基本情况:
单片机STM32F103VC,需要运算处理大量数据,在调试运算程序时,需要加入2000长度的int数组。
程序采用RTX系统,60MH,异常发生时,用的是5个任务,看门狗,运算,ADC,DMA,DAC和串口,LCD和key,595数码管显示。
其中测试数据数组被加入运算任务中。调试仿真全速运行时,运算任务占比最多,任务栈占比8-46%。
运算任务程序需要运算一段不规则波形(客户要求自适应模式)
2. 故障现象:
调试时,发现串口输出数据和excel中记录的数据不一致。切换到仿真状态,单步调试,发现index1的数值在函数中任意断点始终是一个值,不发生改变,只有运行到另外断点时,才变为另一个值,而在改变后的断点也始终是这个特定值。
而watch1窗口除UPnum之外,所有的值都是相同数值。
在断点284处,按F5,数值始终是4,(正常应该从1到n-1).
在284前端用printf输出index1到串口,上位机串口窗口显示的index1数值正常。即从1到n-1变化。
RTX调试串口未产生任务栈溢出提示
如图:
3.解决办法:
1 把发生故障所在的函数中的大多数局部变量变为全局变量。
2 缩小测试用数据量到100.
3 保存测试用数据的数组长度缩小到200.
在这种情况下,仿真测试正常(index1从1到n-1变化),故障消失。
4. 总结:
以上故障终究是由于加入内存的数据量过大,而且局部变量过多,栈空间不够造成的。
采取方案:
尽可能减少局部变量
减少数据量(数据量可以减少到1/2)