1. 程式人生 > >KEIL5除錯watch觀察視窗異常:F5重新整理時大多數引數數值一致,並且無改變

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)