STM32 局部變量壓住全局變量地址 緣由分析

在作項目的時候,遇到一個狀況,我是用的是ucosii系統,從OSTime獲取時間,但是OSTime老是莫名其妙突變,好比1,2,3,939528300以爲很奇怪,怎麼會忽然突變呢。後來在調試模式下排查發現如下幾個可疑點:程序員

1.OSTime是個全局變量,地址是0x2400B5A4,長度四個字節數據結構

2.斷點進入了一個局部變量裏,int a, &a=0x2400B5A7 ,正好壓住了OSTime的最高字節,致使OSTime跳變。函數

這是什麼問題,典型的棧空間申請太小致使。 spa

下面科普一下堆棧知識:調試

(1)棧區(stack):由編譯器自動分配和釋放,存放函數的參數返回值、局部變量等,其操做方式相似於數據結構中的棧。
(2)堆區(heap):由程序員分配管理,好比malloc。
(3)全局區與靜態區:存儲全局變量和靜態變量,其中初始化的全局變量和靜態變量在一塊區域,未初始化的全局變量和未初始化的靜態變量在相鄰的另外一塊區域。
(4)文字常量區:常量字符串存放。
(5)程序代碼區:存放程序代碼。字符串

data段,bss段,heap段,stack段。包含對應上面所說的(1)(2)(3)。constdata(常量),和函數代碼,對應上面的(4)(5);編譯器

data指的是初始化不爲0的全局或靜態(static)變量。bss指的是沒有初始化,或者初始化爲0的全局或靜態變量。編譯

看明白了吧,說白了局部變量放在棧裏,把heap設置大點就行了變量

相關文章
相關標籤/搜索