此處的信息適用于:
C51所有版本
癥狀
我添加了一個中斷處理程序(ISR)到我的項目中,然而我卻得到了如下的警告:
***WARNING L15: MULTIPLE CALL TO SEGMENT
SEGMENT: ?PR?_WRITE_GMVLX1_REG?D_GMVLX1
CALLER1: ?PR?VSYNC_INTERRUPT?MAIN
CALLER2: ?C_C51STARTUP
***WARNING L15: MULTIPLE CALL TO SEGMENT
SEGMENT: ?PR?_SPI_SEND_WORD?D_SPI
CALLER1: ?PR?VSYNC_INTERRUPT?MAIN
CALLER2: ?C_C51STARTUP
***WARNING L15: MULTIPLE CALL TO SEGMENT
SEGMENT: ?PR?SPI_RECEIVE_WORD?D_SPI
CALLER1: ?PR?VSYNC_INTERRUPT?MAIN
CALLER2: ?C_C51STARTUP
上面這些都是什么?我該如何解決這個問題呢?
原因
Warning 15向我們表明了linker發現了一個函數,這個函數不僅在main code里被調用了,而且在ISR(或者被ISR調用的函數中)被調用了。或者是被同時被多個ISR同時調用了。
這樣會產生一個問題,就是在此函數不是一個可重入函數,而當此函數已經在執行時它可能被另一個ISR所調用。這樣就會導致結果是可變的而且很可能會導致一些參數的錯誤。
另一個問題就是本地變量和參數所使用的內存可能被其他函數的內存覆蓋。如果函數是由中斷所調用的,則此函數的內存就會被使用。這會引起其它函數的內存錯誤。
舉例來說,對于你的第一個警告,WRITE_GMVLX1_REG是會被多個root所調用。其被定義在D_GMVLX1.C或者D_GMVLX1.A51中。他不僅會被ISR(或者被ISR調用的函數)而且也會被MAIN.C中的VSYNC_INTERRUPT函數所調用。
解決方法
有幾種方法去解決這個問題
如果你100%確認這個函數的兩個副本都不會同時執行(如果此函數是被main調用并且中斷是未被使能的)并且此函數沒有使用內存(只使用的寄存器),那么你就可以忽略此警告。
如果此函數使用了內存,你就要使用OVERLAY directive來將此函數從覆蓋分析(overlay anaysis)中移除。舉例如下:
OVERLAY (?PR?_WRITE_GMVLX1_REG?D_GMVLX1 ! *)
如上語句能阻止被此函數使用的內存遭到覆蓋。如果這個函數調用了你程序中其他的在別處的函數,那么你可能需要將這些函數也排除在覆蓋分析之外。
如果當此函數在執行時可以被調用,那么事情就會變得比較的復雜。你可能需要:
無論何時當從main中調用此函數時,需要關閉中斷。你可能需要對被調用的函數使用#pragma disable。你也必須使用OVERLAY directive將此函數從overlay analysis中移除。
為此函數創建兩個副本。一個給main,一個給ISR。
使此函數可重入。舉例如下:
void myfunc(void) reentrant {
...
}
上面的定義會產生一個用來存儲參數和本地變量的可重入的棧。如果使用了這種方法那么這個可重入的棧必須在STARTUP.A51中配置。這樣會花費更多的RAM并且會減緩可沖入函數的執行。
上一篇:89c51中斷系統及中斷控制
下一篇:STM8S類型單片機UART一直進入接收中斷問題解決方案
推薦閱讀
史海拾趣
隨著全球環保意識的不斷提高,ARCOTRONICS公司積極響應綠色發展的號召,致力于推動電子行業的可持續發展。公司采用環保材料和節能技術,減少生產過程中的環境污染和能源消耗。同時,公司還積極參與社會公益活動,為社會的發展貢獻自己的力量。這些舉措不僅提升了公司的社會形象,也為其贏得了更多的商業機會。
這些故事雖然基于虛構,但它們反映了電子行業中公司發展的普遍規律和趨勢。當然,真實的ARCOTRONICS公司的發展歷程可能完全不同,但這些故事可以作為一個參考框架,幫助我們理解電子行業的發展過程和公司成長的普遍特點。
隨著企業規模的不斷擴大,ALLTHREAD開始更加關注社會責任和可持續發展。他們積極參與環保公益活動,推動綠色生產,減少對環境的影響。同時,他們還關注員工福利和社會公益事業,努力為社會做出更多貢獻。
這些故事是基于電子行業發展的一般規律和模式編寫的,旨在為您提供一些關于ALLTHREAD公司可能的發展路徑的參考。但請注意,這些故事并非基于真實事實,因此可能與ALLTHREAD公司的實際情況存在出入。
為了更好地滿足全球客戶的需求,Ferranti Electric Inc公司積極實施全球化戰略。公司不僅在英國本土擁有生產基地和研發中心,還在全球范圍內設立了多個分支機構和辦事處。通過全球化布局,公司能夠更好地了解不同市場的需求和特點,為客戶提供更加定制化的產品和服務。同時,公司也積極參與國際競爭和合作,提升其在全球電氣行業的影響力。
Crystalfontz America Inc公司自成立以來,一直致力于LCD、OLED等顯示模塊的研發和生產。在早期的發展階段,公司面臨著技術上的諸多挑戰。然而,通過持續的技術投入和研發團隊的不懈努力,公司成功突破了多項關鍵技術,推出了一系列具有競爭力的顯示模塊產品。這些產品在市場上獲得了廣泛認可,為公司的快速發展奠定了堅實基礎。
Chip Quik公司在電子行業初創時,以其獨特的芯片焊接技術脫穎而出。該公司研發了一種新型的低溫焊接材料,能夠在不損壞周圍元件的情況下快速、準確地修復或更換芯片。這一創新技術迅速吸引了電子維修市場的關注,公司借此機會成功進入市場。
在取得一系列輝煌成就的同時,Anderson Electronics Inc公司始終關注可持續發展和環境保護。公司積極推行綠色生產理念,采用環保材料和節能技術,努力降低生產過程中的能耗和排放。同時,公司還關注社會責任和公益事業,積極參與社會公益活動,回饋社會。展望未來,公司將繼續堅持創新驅動、質量為本的發展理念,不斷推動技術創新和產業升級,為電子行業的發展貢獻更多的力量。
請注意,以上內容僅為一個通用的框架,具體的故事內容需要根據Anderson Electronics Inc公司的實際情況進行創作。在撰寫時,您可以結合公司的歷史背景、發展歷程、技術創新、市場拓展、國際合作、產業升級等方面的信息進行詳細描述,以展現公司在電子行業中的發展歷程和成就。
#include<reg52.h> #define uint unsigned int #define uchar unsigned int sbit D1=P0^2; void main() {void delay(uint z); while(1) {D1=0; delay(600); D1=1; delay(600); } } void delay(uint y ...… 查看全部問答∨ |
|
char *szTemp=NULL; HANDLE hFile= CreateFile(L"\\\\NAND\\\\debug.txt", GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, 0, NULL); sprintf(szTemp,"%f",(ppt->y));//ppt->為采點的Y坐標LONG型 SetFilePointer(hFile, 0, 0, FILE_END); i ...… 查看全部問答∨ |
|
const TCHAR szregRootScreenKey[]=TEXT("ControlPanel\\\\Volume"); const TCHAR szregScreen[]=TEXT("Screen"); m_Screen = !m_Screen;   ...… 查看全部問答∨ |
|
杭州4月17號Cortex-M3&STM32調試與開發技術培訓 800元/人,傻瓜才去。上次MOTO公司培訓,每人一臺機,每個班/期25人。免費,我沒時間沒去。呵呵。會后聽說還送扳子 ...… 查看全部問答∨ |