ST-Bluenrg-lp晶片程式設計因為地址重疊導致常量值被更改
阿新 • • 發佈:2021-01-09
所遇問題:定義的結構體,用於限制範圍大小。類似於:
struct test SysParaMax = {
.test1= 5000,
.test2 = 5000,
.test3 = 100,
.test4 = 600,
}
struct test SysParaMin = {
.test1= 0,
.test2 = 0,
.test3 = 0,
.test4 = 0,
}
結果作為範圍限制使用的時候,因為debug才檢視到的值為這樣:
struct test SysParaMax = { .test1= -3090, .test2 = 8902, .test3 = -2345, .test4 = -4343, } struct test SysParaMin = { .test1= 987, .test2 = 342, .test3 = 343, .test4 = -1244, }
由此導致程式出現各種奇奇怪怪的問題,而作為常量值,一般也不怎麼會檢查。最後發現時就浪費了大量的時間了。
這種問題首先第一可能是指標指向,導致變數發生改變,第二地址偏移導致。
第一種查詢辦法:一般先通過全域性搜尋檢視是否有指標指向的問題。結果發現沒有。
第二種分析辦法:通過map檔案檢視變數對應的上下地址。
類似於:
因為要是上面的syspara的使用資料超過了定義的範圍是會出現資料的溢位現象導致後面的資料發生變化。而後面檢查了其大小發現也不是這個問題。
最後純屬運氣發現了一個非常有意思的問題,我所使用的某個模組中定義了一個大小達到了60k的一個區域性變數的結構體,因為別人之前對空間沒什麼要求就定義的比較大。
這是我自己所使用的RAM大小,所使用的全域性變數和區域性變數全部都被定義在RAM中,區域性變數使用完後就會被去除,再使用是再定義,本來使用的一般的全域性變數和區域性變數的地址不會一樣,畢竟一個在全域性區,一個在棧區。
但這次定義的區域性變數太大了,導致區域性變數的地址和全域性變數的地址重疊,導致了全域性變數的資料會隨著區域性變數的資料發生變化,,,,在我自己的應用中,一些全域性的結構體變數被使用完一次之後資料立馬清零,不清楚的都是玄學問題,搞清楚後就舒服很多。
這是某些檔案的地址:
而我的區域性變數的地址是從0x2000080E到0x2000F276所以導致在這個區間的變數全部都變的不太一樣,而區域性變數賦值的時候是會改變地址上的值,由此造成各種各樣的奇怪問題,最後都回歸到一個問題上。