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)。這樣當主迴圈執行到該函式中 是,一旦產生中斷,則在中斷裡又再次呼叫該函式!這時,很可能出錯! 避免這種情況的方法很多:如,在進中斷的時候置需呼叫該函式的標誌,而在主迴圈中呼叫該函式