當前位置:首頁 » 編程語言 » c語言重入
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言重入

發布時間: 2022-08-29 21:35:16

① 單片機C語言設計里說的可重入函數是什麼和不可重入函數的區別是什麼

一、可重入函數
1)什麼是可重入性?
可重入(reentrant)函數可以由多於一個任務並發使用,而不必擔心數據錯誤。相反, 不可重入(non-reentrant)函數不能由超過一個任務所共享,除非能確保函數的互斥(或者使用信號量,或者在代碼的關鍵部分禁用中斷)。可重入 函數可以在任意時刻被中斷,稍後再繼續運行,不會丟失數據。可重入函數要麼使用本地變數,要麼在使用全局變數時保護自己的數據。

2)可重入函數:
不為連續的調用持有靜態數據。
不返回指向靜態數據的指針;所有數據都由函數的調用者提供。
使用本地數據,或者通過製作全局數據的本地拷貝來保護全局數據。
如果必須訪問全局變數,記住利用互斥信號量來保護全局變數。
絕不調用任何不可重入函數。

3)不可重入函數:
函數中使用了靜態變數,無論是全局靜態變數還是局部靜態變數。
函數返回靜態變數。
函數中調用了不可重入函數。
函數體內使用了靜態的數據結構;
函數體內調用了malloc()或者free()函數;
函數體內調用了其他標准I/O函數。
函數是singleton中的成員函數而且使用了不使用線程獨立存儲的成員變數 。
總的來說,如果一個函數在重入條件下使用了未受保護的共享的資源,那麼它是不可重入的。

② 單片機C語言 函數的聲明

重入函數,又叫再入函數,是一種可以在函數體內不直接或間接調用其自身的一種函數。
再入函數可被遞歸調用,無論何時,包括中斷函數在內的任何函數都可以調入。再入函數在
C51編譯時使用的是模擬棧。
函數說明: 函數名(形式參數表) reentrant
注意事項:
1、再入函數不能傳遞bit類型參數。
2、與PL/M51兼容的函數不能具有reentrant,這樣也不能調用再入函數。
3、在編譯時:再入函數建立的是模擬堆棧區,small模式下模擬堆棧區位於idata
區,compact模式下模擬堆棧區位於pdata區,large模式下模擬堆棧區位於xdata區.
4、在同一程序中可以定義和使用不同存儲器模式的再入函數,任意模式的再入函數不能調
用不同存儲器模式的再入函數,但可以調用普通函數。
5、實際參數可以傳遞給間接調用的再入函數。無再入屬性的間接調用函數不能包含調用參

③ 51的C語言中允許子函數調用其本身嗎

1、C語言可以嵌套調用或遞歸調用子函數。
在C語言中,函數嵌套允許在一個函數中調用另外一個函數。例如
funca()
{
funcb();
}
這個就叫做嵌套調用,它是一個語言提供的程序設計的方法,也就是語言的特性。

2、遞歸,是一種解決方案,一種思想,將一個大工作分為逐漸減小的小工作,比如說一個人要搬50塊石頭,他想,只要先搬走49塊,那剩下的一塊就能搬完了,然後考慮那49塊,只要先搬走48塊,那剩下的一塊就能搬完了……以此類推的思考,遞歸是一種思想,只不過在程序中,就是依靠函數嵌套這個特性來實現了。例如
funca()
{
if(statement1)
funca();
else
exit(0);
}遞歸最明顯的特點就是,自己調用自己(就是函數嵌套調用)

④ 我要用C語言寫一個可重入函數,請問要避開哪些東西

可以使用全局變數、靜態變數。關鍵是不是「只讀」。如果只讀,那怎麼用都行。如果有寫的操作,最好避開,實在避不開就要用信號量等機制防止多線程沖突。
另外就是調用的函數要線程安全, thread-safe.具體那些函數線程安全,需要查閱手冊。

⑤ printf()經常有重入和性能上的問題

做嵌入式,系統,只用C語言就夠了,如果是開發嵌入式軟體,特別是用戶應用軟體才需要用到C++。並且需要掌握到 精通 的程度。
下一步,看書。全世界都在說實踐的重要性,但是我告訴你,科學實踐是建立在雄厚的理論基礎之上的。學習嵌入式只要大量閱讀嵌入式的書就可以了,書中自有關於C/C++的知識和要點。並且,你也是只需要掌握這一部分。

⑥ C語言可重入函數應該注意哪些事項

如果只讀,那怎麼用都行。如果有寫的操作,最好避開,實在避不開就要用信號量等機制防止多線程沖突。
另外就是調用的函數要線程安全, thread-safe.具體那些函數線程安全,需要查閱手冊。

⑦ C語言,我步子道為什麼這個程序運行出來誰這個樣

voidfunction(intx,int&y,int*z)//int&y這是C++的用法,不適用於C

C/C++ 的函數是以值傳遞的,用 int &y, int *z 這類方法才能改變傳遞進來的參數值。

變數 x 在必須賦初值,否則其值未定義,是垃圾,而函數 function 並不能改變傳遞進來的 x 值,

所以你每次運行該程序時,第一個值都是未定的,可能是隨機的一個數;

第 2、3 個值則由 function 改為 4 和 6 了。