|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機 | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
問一個簡單的C51問題!! |
| 作者:leeding 欄目:單片機 |
*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR?TIME_SETTING?MAIN *** WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?CLEAR_SCREEN?MAIN CALLER1: ?C_C51STARTUP CALLER2: ?PR?TIMER0_ISR?MAIN *** WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?_WR8583?MAIN CALLER1: ?C_C51STARTUP CALLER2: ?PR?EX_INT1?MAIN *** WARNING L15: MULTIPLE CALL TO SEGMENT SEGMENT: ?PR?I2C_CLOCK?MAIN CALLER1: ?C_C51STARTUP CALLER2: ?PR?EX_INT1?MAIN 請問如上這些警告如何才能消除!? |
| 2樓: | >>參與討論 |
| 作者: computer00 于 2005/12/12 16:00:00 發(fā)布:
TIME_SETTING未調(diào)用 可能被同時調(diào)用的函數(shù)未被聲明為可重入的。 |
|
| 3樓: | >>參與討論 |
| 作者: isoar 于 2005/12/12 18:36:00 發(fā)布:
中斷里調(diào)用的函數(shù)太多了,后面幾個都是這問題 |
|
| 4樓: | >>參與討論 |
| 作者: leeding 于 2005/12/13 8:09:00 發(fā)布:
哪如何才能把這些去掉呢 中斷里一定要調(diào)用這些函數(shù)的. |
|
| 5樓: | >>參與討論 |
| 作者: linda_6000 于 2005/12/13 8:43:00 發(fā)布:
最笨的方法是把函數(shù)打開直接放到中斷中就可以了 最笨的方法是把函數(shù)打開直接放到中斷中就可以了,C51不是VC別用那么多的函數(shù),能少用代碼就少用. |
|
| 6樓: | >>參與討論 |
| 作者: computer00 于 2005/12/13 9:29:00 發(fā)布:
在中斷處理函數(shù)申明后面加上reentrant關(guān)鍵詞 別調(diào)用那么多函數(shù),很浪費堆棧和運行時間的。 |
|
| 7樓: | >>參與討論 |
| 作者: leeding 于 2005/12/13 10:41:00 發(fā)布:
多謝各位指點! 謝了。 |
|
| 8樓: | >>參與討論 |
| 作者: john_light 于 2005/12/13 10:49:00 發(fā)布:
有關(guān)“MULTIPLE CALL TO SEGMENT” 我們嘗試著在主程序和中斷服務(wù)程序(ISR)中調(diào)用同一個函數(shù)時,鏈接器會給出警告: BL51: WARNING 15 (MULTIPLE CALL TO SEGMENT) 這個警告表示鏈接器(linker)分析到主程序和ISR程序(或者ISR調(diào)用的函數(shù))有可能同時調(diào)用同一個函數(shù)。這樣做存在潛在的問題: 一、這個函數(shù)不是可重入的,它有可能在已經(jīng)運行的情況下被某個ISR中斷并調(diào)用,會導(dǎo)致中間變量被破壞,其結(jié)果是不可預(yù)料的; 二、這個函數(shù)的局部變量所使用的存儲器空間可能和其它函數(shù)所要使用的存儲器空間是覆蓋利用的。若該函數(shù)被一個中斷服務(wù)程序調(diào)用,被中斷的其它函數(shù)正在使用的存儲空間將被這個函數(shù)使用,可能導(dǎo)致其它函數(shù)的存儲空間被破壞,結(jié)果同樣不可預(yù)料。 解決方法: 解決這個問題有幾種方法。 一、如果我們能夠百分之百肯定主程序和ISR對該函數(shù)的調(diào)用不會同時發(fā)生(例如無論主程序在什么時候調(diào)用該函數(shù),同樣調(diào)用它的中斷總是處于禁止?fàn)顟B(tài)),另外該函數(shù)沒有使用存儲器空間(僅使用了寄存器),那么我們可以完全忽略這個警告。 若該函數(shù)使用了存儲器空間,我們應(yīng)該用OVERLAY指示鏈接器將該函數(shù)排除出覆蓋分析之外。比如: OVERLAY (?PR?_WRITEPAGE?AT29C040 ! *) 這樣防止了這個函數(shù)所使用的存儲器空間被覆蓋。假如這個函數(shù)調(diào)用了其它函數(shù),我們最好把這些函數(shù)都排除在覆蓋分析之外。這樣的OVERLAY指示使得鏈接器去除對于該函數(shù)的Warning 15。 二、若函數(shù)正在運行過程中有可能被中斷并調(diào)用,則情況變得稍微復(fù)雜一些。我們可以: 1、只要主程序要調(diào)用該函數(shù),就禁止可能同時調(diào)用它的中斷。我們可以使用#pragma disable令主程序調(diào)用該函數(shù)時禁止中斷。我們還必須用OVERLAY指示接器排除對該函數(shù)的覆蓋分析。 2、寫兩份這樣的函數(shù),給它們起不同的名字,一個供主程序調(diào)用另一個供ISR調(diào)用。 3、令函數(shù)可重入。如: void myfunc(void) reentrant { ... } 這樣一來,函數(shù)是利用重入堆棧來保存局部變量的。使用這種方法時,必須在STARTUP.A51文件中配置重入堆棧。當(dāng)然這種方法會消耗更多的RAM還降低了重入函數(shù)的運行速度。 |
|
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |