一直以為 const 聲明的變量一定是只讀的,并且也一定會存放在 FLASH 中,直到在 103 的 map 文件中看到了這個變量:
聲明如下(函數(shù)體外):
__I 聲明如下:
可以看到,雖然使用 const 修飾變量為只讀,但是 MDK 編譯器仍將這兩個數(shù)組放在了 RAM 區(qū)(全局變量),這意味著這個變量仍可寫(通過指針方式修改),只是不能直接修改而已,還白白浪費了 RAM 空間,因為從實現(xiàn)來看,根本不需要修改這個表,完全可以將其放入 FLASH 空間。
測試發(fā)現(xiàn),是 volatile 這個關(guān)鍵字導(dǎo)致了這個現(xiàn)象,如果沒有這個關(guān)鍵字修飾,則能夠?qū)⑵浞湃?FLASH 中,所以庫函數(shù)這個代碼也是挺迷的。
去除 volatile 修飾后(0x08xx xxxx 為 FLASH 地址區(qū)):
并且你以為這就完了?當將 const 聲明的數(shù)組放在函數(shù)體中,你會發(fā)現(xiàn)這個數(shù)組也被放在了 RAM (棧)區(qū),而不是 FLASH,這樣你想節(jié)省??臻g的計劃就泡湯了。
那該怎么辦?很簡單,加一個 static 即可:
但是當你加上 volatile 后,又被放入 RAM 中了,并且這次不是在棧中,而是作為全局變量(map 文件可找)存在,占用了 RAM 的空間。
這算不大不小坑吧,望引以為戒!
審核編輯:劉清
-
FlaSh
+關(guān)注
關(guān)注
10文章
1638瀏覽量
148153 -
RAM
+關(guān)注
關(guān)注
8文章
1369瀏覽量
114759 -
CONST
+關(guān)注
關(guān)注
0文章
44瀏覽量
8177
原文標題:坑!const 聲明的變量一定只能讀嗎?
文章出處:【微信號:emOsprey,微信公眾號:魚鷹談單片機】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論