回覆列表
  • 1 # 使用者4779816573800

    假設Exam是int型全域性變數,函式Square_Exam返回Exam平方值。那麼如下函式不具有可重入性。

    unsigned int example( int para )

    {

    unsigned int temp;

    Exam = para; // (**)

    temp = Square_Exam( );

    return temp;

    }

    此函式若被多個程序呼叫的話,其結果可能是未知的,因為當(**)語句剛執行完後,另外一個使用本函式的程序可能正好被啟用,那麼當新啟用的程序執行到此函式時,將使Exam賦與另一個不同的para值,所以當控制重新回到“temp = Square_Exam( )”後,計算出的temp很可能不是預想中的結果。此函式應如下改進。

    unsigned int example( int para )

    {

    unsigned int temp;

    [申請訊號量操作] //(1)

    Exam = para;

    temp = Square_Exam( );

    [釋放訊號量操作]

    return temp;

    }

    (1)若申請不到“訊號量”,說明另外的程序正處於給Exam賦值並計算其平方過程中(即正在使用此訊號),本程序必須等待其釋放訊號後,才可繼續執行。若申請到訊號,則可繼續執行,但其它程序必須等待本程序釋放訊號量後,才能再使用本訊號。

    保證函式的可重入性的方法:在寫函式時候儘量使用區域性變數(例如暫存器、堆疊中的變數),對於要使用的全域性變數要加以保護(如採取關中斷、訊號量等方法),這樣構成的函式就一定是一個可重入的函式。

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

    * 動態堆疊變數(各子函式有自己獨立的堆疊空間)

    * 受保護的全域性變數和靜態變數

    * 任務變數

  • 中秋節和大豐收的關聯?
  • 汗蒸後多長時間才能洗澡?