KEIL5除錯watch觀察視窗異常:F5重新整理時大多數引數數值一致,並且無改變
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)