音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費(fèi)注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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

尿童學(xué)堂

2樓: >>參與討論
computer00
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í)所
靜態(tài)變量在MCU中的存在是有害的,建議不要使用。
一直以來,程序都是在RAM中跑的,C就是在這個背景下寫的。MCU的C是后來才出現(xiàn)的,所以才又有了FLASH變量定義。

不依賴編譯器的變量初始化,程序員顯式初始化變量的做法是非常重要的,可以避免產(chǎn)生BUG。

把模塊中所有變量用一個struct框起來是一個非常好的做法。

4樓: >>參與討論
hotpower
倒塌了~~~我是打個比喻~~~
不過只在一個函數(shù)中使用的我認(rèn)為還是靜態(tài)變量好~~~

否則全局變量太多...

實際上,我使用的全局變量都在結(jié)構(gòu)或類中.

5樓: >>參與討論
computer00
沒啥關(guān)系,該怎樣用時就怎樣用吧
不想讓別人看見就藏起來~~~~~~~~~~~

6樓: >>參與討論
農(nóng)民講習(xí)所
別倒。俺只是補(bǔ)充而已。
 
7樓: >>參與討論
computer00
哈哈……估計那個倒塌是對我的,不是你所長的……
 
8樓: >>參與討論
hotpower
所長和00別介意~~~最近倒塌很上口~~~好壞都用它~~~
 
9樓: >>參與討論
lucidmask
re
倒塌

10樓: >>參與討論
Z80
這個方法很不錯...
---> 把模塊中所有變量用一個struct框起來是一個非常好的做法。



參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
protel的自動布局有這么慢嗎?
ds1302讀數(shù)遇到的問題
請教怎樣判斷C8051F的好壞?
請教有誰用過數(shù)字信號隔離芯片ADuM1300
用UV3的問題~~~
免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號