1. 程式人生 > >Keil51 WARNING L15: MULTIPLE CALL TO SEGMENT

Keil51 WARNING L15: MULTIPLE CALL TO SEGMENT

今天除錯時遇到了這個問題,以前都不注意這些警告錯誤,現在看來爭取要做到:0錯誤,0警告。

中斷中和中斷外都呼叫了同一個串列埠列印函式,一直有上述的報警,沒在意,今天除錯時發現串列埠打印出了一些亂七八糟的東東,且程式也不知道跑哪裡去了,很鬱悶。最後查到是上述這個問題導致的,現在解決辦法為採用第二種辦法,第一種辦法據說要耗很多儲存空間,以後慢慢體會。
說說幾個小問題吧,一般我們在用KEIL的時候,只要編譯器報

- 0 Error(s) 一般我們都不去管多少個 Warning(s).了,一般這樣程式基本都能執行,但是其實仔細想想,這裡還是有問題的,否則編譯器沒事吃飽了撐得,報什麼警告啊~~~

今天來說說*** WARNING L15: MULTIPLE CALL TO SEGMENT這個問題!

其實這個問題應該是引起注意的,有可能引起程式衝突,但是一般時候程式執行不會有問題,但是如果出來問題,那將會是很討厭的問題.

分析一下 產生這一警告的一個根源是:例如在主迴圈裡呼叫了一個函式,而在中斷服務中,你又一次呼叫了同樣的函式。這樣當主迴圈執行到該函式中時, 一旦產生中斷,則在中斷裡又再次呼叫該函式!而使得該子函式發生了重入,這時,經管概率很低,但是很可能出錯!這樣,編譯器就給出了警告!告訴你*** WARNING L15: MULTIPLE CALL TO SEGMENT ,表達的意思是發生了重入!字面意思自己理解去吧~~~

想要避免這種情況的方法

一.用reentrant使函式重入



關於reentrant的說明:

1,重入函式不能傳遞bit型別的引數和變數;

2,重入函式建立的是模擬堆疊區,所以不使用一般函式位於儲存模式預設空間的可覆蓋式堆疊,而是在同一空間從頂端另行分配一個非覆蓋式的重入堆疊。

     small 預設空間是 data;

     compact 預設空間是 pdata;

     large 預設空間是 xdata;

3,由於要儲存引數和區域性變數,所以會消耗很大的棧空間;儘量少用這種模式;

4、    在同一程式中可以定義和使用不同儲存器模式的重入函式,任意模式的重入函式不能呼叫不同儲存器模式的重入函式,但可以呼叫普通函式。
5、    實際引數可以傳遞給間接呼叫的重入函式。無重入屬性的間接呼叫函式不能包含呼叫引數。

二.如果空間多的話,可以定義兩個同功能的函式,分別在中斷和中斷外呼叫


別的方法沒研究出來,嘿嘿~~~對了 我建議用第二種方法好點,第一種有些限制,不爽~~

WARNING L15: MULTIPLE CALL TO SEGMENT


這個問題必須注意,可能引起程式衝突,假設你用於自動化領域,則可能導致訊號產生尖峰。 產生這一警告的一個根源是:你在主迴圈裡呼叫了一個函式(如aaa),而在中斷服務函式裡,你用呼叫了這個函式(如aaa)。這樣當主迴圈執行到該函式中 是,一旦產生中斷,則在中斷裡又再次呼叫該函式!這時,很可能出錯! 避免這種情況的方法很多:如,在進中斷的時候置需呼叫該函式的標誌,而在主迴圈中呼叫該函式