1. 程式人生 > >可重入函數與不可重入函數

可重入函數與不可重入函數

如果 interrupt 信號量 發生 標準io 一個 i/o 可重入 規則

參考:http://blog.csdn.net/wenhui_/article/details/6889013

重入:重新進入

區別:多個任務能否同時調用一個函數,例如操作系統在進程調度過程中,或者單片機、處理器等的中斷的時候會發生重入的現象

滿足下面條件之一的多數是不可重入函數:
(1)使用了靜態數據結構;
(2)調用了malloc或free;
(3)調用了標準I/O函數,比如printf; 標準io庫很多實現都以不可重入的方式使用全局數據結構;
(4)進行了浮點運算.許多的處理器/編譯器中,浮點一般都是不可重入的 (浮點運算大多使用協處理器或者軟件模擬來實現,存放在硬件寄存器float中);

寫可沖入函數的時候要註意的地方:

1.不要使用全局變量,因為別的進程很可能覆蓋這些變量值,如果必須訪問全局變量,利用互斥信號量來保護全局變量

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

3.不能調用任何不可重入的函數,比如printf、malloc、free

4.謹慎使用堆棧,最好先在使用前先OS_ENTER_KERNAL

5.不使用靜態局部變量

還有一些規則,都是很好理解的,總之,時刻記住一句話:保證中斷是安全的!

可重入函數與不可重入函數