|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
如何正確地選取變量的作用域 |
| 作者:hotpower 欄目:單片機(jī) |
在MCU編程中不同于PC編程,可能需要大量的全局變量。因為在很多情況下,MCU需要在復(fù)位后還應(yīng)該保持 關(guān)機(jī)或看門狗復(fù)位前的運(yùn)行工作狀態(tài),這就是MCU編程不同于PC編程的最大區(qū)別所在。 在一般的編程中,最常用的是全局變量和局部變量及靜態(tài)變量幾種。他們的作用域和生存期也就決定了變量 的正確定義及應(yīng)用。其中局部變量伴隨函數(shù)的調(diào)用和返回而自生自滅,但全局變量和靜態(tài)變量卻是永存的, 若有電源掉電保持系統(tǒng)則全局變量是永垂不朽的。雖然全局變量和靜態(tài)變量都可永存,但是當(dāng)變量只在一個 函數(shù)內(nèi)永存而不再被其他函數(shù)及中斷服務(wù)程序訪問時,就應(yīng)該定義該變量為靜態(tài)變量而非全局變量。 在每種MCU的C/C++語言編譯器中,不初始化變量的方法幾乎全不相同,但目的都是一樣的。若要真正實現(xiàn)此 目的還是要花費(fèi)一番工夫的。雖然編譯器不初始化變量,但卻避免不了系統(tǒng)的初始化過程。雖然編譯器可以不初 始化變量,但冷啟動上電時該變量將是一個隨機(jī)的數(shù)值,必須具有初值。故帶來了判定冷熱啟動的問題。 雖然現(xiàn)代MCU可能帶有看門狗復(fù)位標(biāo)志及其他MCU能判定的復(fù)位標(biāo)志,但無法判定軟件迫使PC=0的軟復(fù)位。故 一般采用在RAM中設(shè)置一個不可初始化的全局變量(值一般取0x55aa等)來判定一切復(fù)位源。一般情況下沒必要來 關(guān)心復(fù)位的來源,我們只關(guān)心此變量不為初始值則為冷啟動,反之必為冷熱啟動。 在掉電期間,由于電壓下降是個“緩慢”的過程,雖然電源監(jiān)視器告警,但RAM中的數(shù)據(jù)(0x55aa)并未丟失。 這樣就可以間接地判定整個RAM數(shù)據(jù)的完好,雖很牽強(qiáng)但很實用。因為保持RAM數(shù)據(jù)的不消失的電壓往往很低。 在PC中有硬盤和內(nèi)存之分,而在MCU中有ROM和RAM之別。對于小容量的MCU中它們都是很珍貴的,特別是RAM 是很稀有的。所以用做表格或不變的數(shù)據(jù)時都應(yīng)該定義在ROM中,即加const修飾符。也有些編譯器是code, const static等修飾。這在MCU程序中很重要,因為存在ROM中的數(shù)據(jù)往往要比存在RAM中的數(shù)據(jù)要可靠和長久些。 更不易被反復(fù)上電所打擾。 由于各編譯器的優(yōu)化級別和方法不同,應(yīng)用臨時變量可以間接地幫助編譯器來搞清是非,這種臨時變量可能 在一個函數(shù)中只做讀操作,編譯器很可能自做主張將其優(yōu)化掉。再者就是全局變量(標(biāo)志)在主程序和中斷中都 訪問時,及可能出現(xiàn)一方只讀或只寫的情況,編譯器都可能將其優(yōu)化掉。 所以像這樣或其他搞不明白的時候,加volatile阻止編譯器優(yōu)化此變量是最要注意的。 總之,這些“小學(xué)問題”是“大人們”最常出現(xiàn)而往往容易忽略的一些“小問題”。 * - 本貼最后修改時間:2006-10-24 23:17:51 修改者:hotpower |
| 2樓: | >>參與討論 |
| 作者: computer00 于 2006/10/24 23:54:00 發(fā)布:
PC中的硬盤和MCU中的ROM地位并不等價的 嚴(yán)格來說,PC中的硬盤屬于一個外設(shè),而不能算做存儲器~~~~~~~~~~~~~~而BIOS則可以跟MCU中的ROM相似. 現(xiàn)在一些ARM系統(tǒng)使用NAND FLASH,這個作用倒跟硬盤有點(diǎn)類似了,不能直接在里面運(yùn)行,將數(shù)據(jù)拷貝到RAM中才可以運(yùn)行. |
|
| 3樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2006/10/25 7:58:00 發(fā)布:
靜態(tài)變量在MCU中的存在是有害的,建議不要使用。 一直以來,程序都是在RAM中跑的,C就是在這個背景下寫的。MCU的C是后來才出現(xiàn)的,所以才又有了FLASH變量定義。 不依賴編譯器的變量初始化,程序員顯式初始化變量的做法是非常重要的,可以避免產(chǎn)生BUG。 把模塊中所有變量用一個struct框起來是一個非常好的做法。 |
|
| 4樓: | >>參與討論 |
| 作者: hotpower 于 2006/10/25 8:31:00 發(fā)布:
倒塌了~~~我是打個比喻~~~ 不過只在一個函數(shù)中使用的我認(rèn)為還是靜態(tài)變量好~~~ 否則全局變量太多... 實際上,我使用的全局變量都在結(jié)構(gòu)或類中. |
|
| 5樓: | >>參與討論 |
| 作者: computer00 于 2006/10/25 8:51:00 發(fā)布:
沒啥關(guān)系,該怎樣用時就怎樣用吧 不想讓別人看見就藏起來~~~~~~~~~~~ |
|
| 6樓: | >>參與討論 |
| 作者: 農(nóng)民講習(xí)所 于 2006/10/25 9:53:00 發(fā)布:
別倒。俺只是補(bǔ)充而已。 |
|
| 7樓: | >>參與討論 |
| 作者: computer00 于 2006/10/25 10:00:00 發(fā)布:
哈哈……估計那個倒塌是對我的,不是你所長的…… |
|
| 8樓: | >>參與討論 |
| 作者: hotpower 于 2006/10/25 17:53:00 發(fā)布:
所長和00別介意~~~最近倒塌很上口~~~好壞都用它~~~ |
|
| 9樓: | >>參與討論 |
| 作者: lucidmask 于 2006/10/25 20:42:00 發(fā)布:
re 倒塌 |
|
| 10樓: | >>參與討論 |
| 作者: Z80 于 2006/10/27 19:51:00 發(fā)布:
這個方法很不錯... ---> 把模塊中所有變量用一個struct框起來是一個非常好的做法。 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |