音影先锋亚洲天堂网|电影世界尽头的爱完整版播放|国产 熟女 91|高清无码免费观看欧美日韩|韩国一区二区三区黄色录像|美女亚洲加勒比在线|亚洲综合网 开心五月|7x成人在线入口|成人网站免费日韩毛片区|国产黄片?一级?二级?三级

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網(wǎng)
技術(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 欄目:單片機
問一個簡單的C51問題。
*** 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
TIME_SETTING未調(diào)用
可能被同時調(diào)用的函數(shù)未被聲明為可重入的。

3樓: >>參與討論
isoar
中斷里調(diào)用的函數(shù)太多了,后面幾個都是這問題
 
4樓: >>參與討論
leeding
哪如何才能把這些去掉呢
中斷里一定要調(diào)用這些函數(shù)的.

5樓: >>參與討論
linda_6000
最笨的方法是把函數(shù)打開直接放到中斷中就可以了
最笨的方法是把函數(shù)打開直接放到中斷中就可以了,C51不是VC別用那么多的函數(shù),能少用代碼就少用.

6樓: >>參與討論
computer00
在中斷處理函數(shù)申明后面加上reentrant關(guān)鍵詞
別調(diào)用那么多函數(shù),很浪費堆棧和運行時間的。

7樓: >>參與討論
leeding
多謝各位指點!
謝了。

8樓: >>參與討論
john_light
有關(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ù)的運行速度。


參與討論
昵稱:
討論內(nèi)容:
 
 
相關(guān)帖子
Keil 官方技術(shù)支持集<絕對經(jīng)典>
請教MSC1210單片機與計算機串口通信的問題
Keil C51程序的HEX文件超過了3K,我能優(yōu)化到2K以下嗎?
農(nóng)講所的"狀態(tài)機"和HOTPOWER的"前后臺".誰能簡單給概括一下思想
一條指令多少錢?
免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進(jìn)入


Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號