天天看點

2、再論與Static相關的問題

一、相關文章

1、C++中static的含義及名字控制

<a href="http://blog.163.com/zhoumhan_0351/blog/static/39954227201031775648201/">http://blog.163.com/zhoumhan_0351/blog/static/39954227201031775648201/</a>

C/C++中,static有兩層含義:在固定的位址上進行存儲配置設定,也就是說對象是在一個特殊的靜态資料區上建立的,而不是每次函數調用時在堆棧上産生的。第二層含義是:對一個特定的編譯機關來說是局部的。

2、static變量是在連結階段完成指派的。

<a href="http://blog.163.com/zhoumhan_0351/blog/static/39954227201041610403747/">http://blog.163.com/zhoumhan_0351/blog/static/39954227201041610403747/</a>

3、靜态初始化的相依性問題

<a href="http://blog.163.com/zhoumhan_0351/blog/static/3995422720103179552945/">http://blog.163.com/zhoumhan_0351/blog/static/3995422720103179552945/</a>

4、變量的生存期和作用域

<a href="http://blog.163.com/zhoumhan_0351/blog/static/39954227200982104921868/">http://blog.163.com/zhoumhan_0351/blog/static/39954227200982104921868/</a>

二、可重入函數與不可重入函數

1、概念:主要用于多任務環境中,一個可重入的函數簡單來說就是可以被中斷的函數,也就是說,可以在這個函數執行的任何時刻中斷它,轉入OS排程下去執行另外一段代碼,而傳回控制時不會出現什麼錯誤;而不可重入的函數由于使用了一些系統資源,比如全局變量區,中斷向量表等,是以它如果被中斷的話,可能會出現問題,這類函數是不能運作在多任務環境下的。

也可以這樣了解,重入即表示重複進入,首先它意味着這個函數可以被中斷,其次意味着它除了使用自己棧上的變量以外不依賴于任何環境(包括static),這樣的函數就是 purecode(純代碼)可重入,可以允許有該函數的多個副本在運作,由于它們使用的是分離的棧,是以不會互相幹擾。如果确實需要通路全局變量(包括 static),一定要注意實施互斥手段。可重入函數在并行運作環境中非常重要,但是一般要為通路全局變量付出一些性能代價。

編寫可重入函數時,若使用全局變量,則應通過關中斷、信号量(即P、V操作)等手段對其加以保護。

 說明:若對所使用的全局變量不加以保護,則此函數就不具有可重入性,即當多個程序調用此函數時,很有可能使有關全局變量變為不可知狀态。

2、保證函數的可重入性的方法:

在寫函數時候盡量使用局部變量(例如寄存器、堆棧中的變量),對于要使用的全局變量要加以保護(如采取關中斷、信号量等方法),這樣構成的函數就一定是一個可重入的函數。

VxWorks中采取的可重入的技術有:

* 動态堆棧變量(各子函數有自己獨立的堆棧空間)

* 受保護的全局變量和靜态變量

* 任務變量

3、不可重入函數在實時系統設計中被視為不安全函數。滿足下列條件的函數多數是不可重入的:

1) 函數體内使用了靜态的資料結構;

2) 函數體内調用了malloc()或者free()函數;

3) 函數體内調用了标準I/O函數。

4、如何将一個不可重入的函數改寫成可重入的函數?

把一個不可重入函數變成可重入的唯一方法是用可重入規則來重寫它。其實很簡單,隻要遵守了幾條很容易了解的規則,那麼寫出來的函數就是可重入的。

    1) 不要使用全局變量。因為别的代碼很可能覆寫這些變量值。

    2) 在和硬體發生互動的時候,切記執行類似disinterrupt()之類的操作,就是關閉硬體中斷。完成互動記得打開中斷,在有些系列上,這叫做“進入/ 退出核心”。

    3) 不能調用其它任何不可重入的函數。

    4) 謹慎使用堆棧。最好先在使用前先OS_ENTER_KERNAL。

    把全局變量加上static改變的是其作用域。

    把局部變量加上static改變的是其生存期。

參考

[1] http://blog.csdn.net/tony821224/archive/2007/09/04/1771899.aspx

繼續閱讀