Newlib特點
時間:2022-02-07 16:00:01 | 來源:信息時代
時間:2022-02-07 16:00:01 來源:信息時代
C運行庫的可重入性問題主要是庫中的全局變量在多任務(wù)環(huán)境下的可重入性問題,Newlib解決這個問題的方法是,定義一個struct_reent類型的結(jié)構(gòu),將運行庫所有會引起可重入性問題的全局變量都放到該結(jié)構(gòu)中。而這些全局變量則被重新定義為若干個宏,以errno為例,名為'errno'的宏引用指向struct_reent結(jié)構(gòu)類型的一個全局指針,這個指針叫做_impure_ptr。
對于用戶,這一切都被errno宏隱藏了,需要檢查錯誤時,用戶只需要像其他ANSIC環(huán)境下所做的一樣,檢查errno'變量'就可以了。實際上,用戶對errno宏的訪問是返回_impure_ptr->errno的值,而不是一個全局變量的值。
Newlib定義了_reent結(jié)構(gòu)類型的一個靜態(tài)實例,并在系統(tǒng)初始化時用全局指針_impure_ptr指向它。如果系統(tǒng)中只有一個任務(wù),那么系統(tǒng)將正常運行,不需要做額外的工作;如果希望newlib運行在多任務(wù)環(huán)境下,必須完成下面的兩個步驟:
1)每個任務(wù)提供一個_reent結(jié)構(gòu)的實例并初始化;
2)任務(wù)上下文切換的時刻重新設(shè)置_impure_ptr指針,使它指向即將投入運行任務(wù)的_reent結(jié)構(gòu)實例。
這樣就可以保障大多數(shù)庫函數(shù)(尤其是stdio庫函數(shù))的可重入性。如果需要可重入的malloc,還必須設(shè)法實現(xiàn)__malloc_lock()和__malloc_unlock()函數(shù),它們在內(nèi)存分配過程中保障堆(heap)在多任務(wù)環(huán)境下的安全。