0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

const聲明的變量一定只能讀嗎?

魚鷹談單片機(jī) ? 來源:魚鷹談單片機(jī) ? 2023-10-07 09:23 ? 次閱讀

一直以為 const 聲明的變量一定是只讀的,并且也一定會存放在 FLASH 中,直到在 103 的 map 文件中看到了這個變量:

wKgaomUgsyCAVtmeAACXYb5Ah-M693.jpg

聲明如下(函數(shù)體外):

wKgZomUgsyGAQHEXAACMSPBygJ0689.jpg

__I 聲明如下:

wKgZomUgsyCAWdcnAACXF7CHJh4577.jpg

可以看到,雖然使用 const 修飾變量為只讀,但是 MDK 編譯器仍將這兩個數(shù)組放在了 RAM 區(qū)(全局變量),這意味著這個變量仍可寫(通過指針方式修改),只是不能直接修改而已,還白白浪費(fèi)了 RAM 空間,因為從實現(xiàn)來看,根本不需要修改這個表,完全可以將其放入 FLASH 空間。

測試發(fā)現(xiàn),是 volatile 這個關(guān)鍵字導(dǎo)致了這個現(xiàn)象,如果沒有這個關(guān)鍵字修飾,則能夠?qū)⑵浞湃?FLASH 中,所以庫函數(shù)這個代碼也是挺迷的。

去除 volatile 修飾后(0x08xx xxxx 為 FLASH 地址區(qū)):

wKgZomUgsyGAXxrhAAEUB8_PCNw895.jpg

并且你以為這就完了?當(dāng)將 const 聲明的數(shù)組放在函數(shù)體中,你會發(fā)現(xiàn)這個數(shù)組也被放在了 RAM ()區(qū),而不是 FLASH,這樣你想節(jié)省??臻g的計劃就泡湯了。

wKgaomUgsyCAZId8AAFHv4g6qNA355.jpg

那該怎么辦?很簡單,加一個 static 即可:

wKgZomUgsyCAS6QcAAFJiGOd-Bo615.jpg

但是當(dāng)你加上 volatile 后,又被放入 RAM 中了,并且這次不是在棧中,而是作為全局變量(map 文件可找)存在,占用了 RAM 的空間。

wKgaomUgsyGAMkmaAAFsNQjA4dM015.jpg

這算不大不小坑吧,望引以為戒!






審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • FlaSh
    +關(guān)注

    關(guān)注

    10

    文章

    1608

    瀏覽量

    147562
  • RAM
    RAM
    +關(guān)注

    關(guān)注

    8

    文章

    1350

    瀏覽量

    114370
  • CONST
    +關(guān)注

    關(guān)注

    0

    文章

    43

    瀏覽量

    8134

原文標(biāo)題:坑!const 聲明的變量一定只能讀嗎?

文章出處:【微信號:emOsprey,微信公眾號:魚鷹談單片機(jī)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    變量聲明和定義有什么區(qū)別和聯(lián)系

    變量聲明和定義是編程中的兩個重要概念,它們在語法和語義上有些區(qū)別和聯(lián)系。在本文中,我將詳細(xì)介紹變量聲明和定義之間的區(qū)別和聯(lián)系。 首先,
    的頭像 發(fā)表于 12-07 16:14 ?945次閱讀

    請問如何防止tasking將const變量合并?

    編譯中發(fā)現(xiàn)tasking將const變量值相同的變量合并了,先去掉些優(yōu)化選項還是不起作用,只能改變co
    發(fā)表于 02-02 08:07

    C語言之正確使用Const

    C語言之正確使用Const基本解釋  const個C語言的關(guān)鍵字,它限定變量不允許被改變。使用c
    發(fā)表于 10-07 11:20

    C和C++中const的用法比較

    地址,但是應(yīng)該清楚引用在底層實現(xiàn)上也是通過傳遞地址的方式來進(jìn)行的。當(dāng)不得不為const變量分配空間時,C++仍然能通過一定的手段來盡量進(jìn)行constant folding。如下代碼所示:con
    發(fā)表于 11-11 10:00

    C語言——正確使用const

    C語言——正確使用const基本解釋   const個C語言的關(guān)鍵字,它限定變量不允許被改變。使用
    發(fā)表于 04-23 11:58

    在while循環(huán)內(nèi)添加了個全局變量。然后在當(dāng)前vi的while循環(huán)外讀取全局變量。只能讀

    在while循環(huán)內(nèi)添加了個全局變量。然后在當(dāng)前vi的while循環(huán)外讀取全局變量。只能讀次,為什么啊。全局
    發(fā)表于 08-14 15:58

    labview 通過OPC modbus TCP 與施耐德258通訊 字能讀能寫 但是位只能讀不能寫

    沒問題,我都是確定能讀之后再轉(zhuǎn)入寫狀態(tài)。我是按照網(wǎng)上的教程去操作的。用400003.4對應(yīng)PLC當(dāng)中的%MX4.4中間變量。更換其他變量后,也是只能讀不能寫。不知道是怎么回事。有大神知
    發(fā)表于 10-20 11:00

    怎么更改const變量PIC18F47K40的值?

    嗨,我需要改變const數(shù)組變量的值。我必須聲明變量const,因為我需要使用的數(shù)組有47
    發(fā)表于 03-12 11:36

    Verilog 變量聲明與數(shù)據(jù)類型

    邏輯單元的輸出驅(qū)動。沒有連接驅(qū)動的wire型變量的值為高阻’z’。wire類型變量的使用:wire型變量聲明與賦值wire類型的變量
    發(fā)表于 08-10 14:01

    C語言中變量聲明和定義以及extern的用法介紹

    變量聲明不同于變量的定義,這點(diǎn)往往容易讓人混淆。 l變量聲明是告訴編譯器,該
    發(fā)表于 11-21 10:59 ?12次下載

    你會使用Linux編程const?

    另外const些強(qiáng)大的功能在于它在函數(shù)聲明中的應(yīng)用。在個函數(shù)聲明中,const 可以修飾
    發(fā)表于 05-06 16:34 ?540次閱讀
    你會使用Linux編程<b class='flag-5'>const</b>?

    從STM32到CONST的全局變量

    ? ?STM32的const全局變量地址 程序如下: const int globalConstDat = 12; int globalDat = 11; int main(void) { int
    的頭像 發(fā)表于 07-23 10:50 ?4744次閱讀

    怎樣去使用C語言中的const關(guān)鍵字呢

    我們會發(fā)現(xiàn)兩者的區(qū)別const個注釋的全局變量個注釋的局部變量,我們編譯都能通過,不過使用全部變量
    的頭像 發(fā)表于 08-12 09:13 ?1350次閱讀
    怎樣去使用C語言中的<b class='flag-5'>const</b>關(guān)鍵字呢

    const 和指針變量使用

    有時候我們希望定義這樣變量,它的值不能被改變,在整個作用域中都保持固定。例如,用變量來表示班級的最大人數(shù),或者表示緩沖區(qū)的大小。為了滿足這
    的頭像 發(fā)表于 06-22 10:43 ?435次閱讀

    const 聲明變量一定是只讀的?

    雖然使用 const 修飾變量為只讀,但是 MDK 編譯器仍將這兩個數(shù)組放在了 RAM 區(qū)(全局變量)。這意味著,這個變量仍可寫(通過指針方式修改),只是不能直接修改而已,還白白浪費(fèi)了
    發(fā)表于 10-19 10:05 ?306次閱讀
    <b class='flag-5'>const</b> <b class='flag-5'>聲明</b>的<b class='flag-5'>變量</b>不<b class='flag-5'>一定</b>是只讀的?