今天在調試一個STM32的程序,之前程序一切運行正常。在修改某些數組后,突然程序不能正常工作了。
追蹤問題發現問題是出現在一個數組中,利用一個函數的指針參數去修改一個數組的值。在程序內部的時候,指針的值一切正常。當在外部調用這個數組后,數組的值就發生了錯亂。導致程序錯誤。函數類型如下所示:
1 #include<stdio.h> 2 3 #define u8 unsigned char 4 #define u16 unsigned int 5 6 u8 Num[20] = {0}; 7 8 9 int main() 10 { 11 u8 i = 0; 12 Func(Num); 13 14 printf("%d\n",Num[0]); 15 16 for(i=0; i<20; i++) 17 { 18 printf("%c\n",Num[i+1]); 19 } 20 21 getchar(); 22 23 } 24 25 void Func(u8* Array) 26 { 27 Array[0] = 11; 28 Array[1] = '1'; 29 Array[2] = '2'; 30 }
思考了很久,而且也在程序外面用別的編譯器模擬發現都不會有問題。最后突然想到是自己改大了數組的空間,肯定是棧溢出了。回去修改STM32的啟動文件,把其中的默認值0x400參數修改成0x800.滿足當前需求結果一切正常了。
1 Stack_Size EQU 0x00000800
查找這個問題花了整整一天時間,想得頭都要爆了。引以為戒。所以把問題記錄一下,方便以大家在碰到問題的時候解決。碰到相似問題的時候一定要多想一想有沒有可能是堆或棧溢出。
