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