|
技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe |
舉例說明PICC是如何保護現(xiàn)場的 |
作者:cf100 欄目:單片機 |
大家來看一下具體的例子,用PIC16F887A編譯下列程序。 第一次,中斷處理函數(shù)什么也不做。 #include "pic.h" unsigned int m,n; unsigned CHAR i,j,k,l; void interrupt SAMPLE (void) { } void main(void) { } 因為不進行操作,中斷函數(shù)不需要進行現(xiàn)場保護,編譯后結果是直接返回。 0004 0009 retfie 第二次, 中斷處理函數(shù)增加一條對全局變量的操作。 void interrupt SAMPLE (void) { i++; } 編譯結果是: 0004 00F0 movwf saved_w 0005 0803 movf 3,w 0006 0183 clrf 3 0007 00A8 movwf saved_status 0008 0183 clrf 3 0009 0AA0 incf _i 000A 0828 movf saved_status,w 000B 0083 movwf 3 000C 0EF0 swapf saved_w 000D 0E70 swapf saved_w,w 000E 0009 retfie 從結果看,只保護W和STATUS,不對全局變量進行現(xiàn)場保護。 最后來看一個中斷處理函數(shù)中調用一個函數(shù)fn()的例子。 在fn()函數(shù)中涉及全局變量和局部變量。 void fn(void) { CHAR TEMP; TEMP=i+j; i=TEMP++; } void interrupt SAMPLE (void) { fn(); } 0004 int_entry 0004 00F0 movwf saved_w 0005 0803 movf 3,w 0006 0183 clrf 3 0007 00A9 movwf saved_status 0008 080A movf 10,w 0009 00AA movwf saved_pclath 000A 018A clrf 10 000B 120A ISR BCF PCLATH,0X4 000C 118A BCF PCLATH,0X3 000D 27F9 CALL fn 000E 120A BCF PCLATH,0X4 000F 118A BCF PCLATH,0X3 0010 082A movf saved_pclath,w 0011 008A movwf 10 0012 int_restore 0012 0829 movf saved_status,w 0013 0083 movwf 3 0014 0EF0 swapf saved_w 0015 0E70 swapf saved_w,w 0016 0009 retfie 在第三個例子中,由于涉及到跨頁的問題,中斷函數(shù)為了能正確返回中斷發(fā)生處地址,對PCLATH進行保護。 從以上我們可以看出,無論是在中斷處理中使用的變量,還是在中斷處理中調用其它函數(shù)而使用的變量,中斷函數(shù)都不會對其實行自動保護。 當然中斷前的地址入棧是屬于硬件功能,不需要軟件中作出相應操作。 |
2樓: | >>參與討論 |
作者: xieyuanbin 于 2005/1/25 18:19:00 發(fā)布:
看來CF100花了不少工夫,加褲! |
3樓: | >>參與討論 |
作者: 手扶拖拉機 于 2005/1/25 22:30:00 發(fā)布:
頂! 這個論壇要是每個人都能如cf100一樣總結一些東西,就不怕大家的水平上不去! |
4樓: | >>參與討論 |
作者: eyuge2 于 2005/1/26 10:55:00 發(fā)布:
謝謝 感謝cf100的幫助。 你精英聯(lián)盟中給我回復時引用的一段摘自PICC說明書的話,這個PICC說明書好像版本比較特別哦,不是張明峰的,也不是偉福的,能不能拿出來共享一下? |
5樓: | >>參與討論 |
作者: mikezhong 于 2005/1/26 12:35:00 發(fā)布:
CF100大俠也! CF100大俠也! 摘自的就是張明峰的斷落。 |
6樓: | >>參與討論 |
作者: 笨蛋不笨 于 2005/1/26 17:03:00 發(fā)布:
敬業(yè)!! |
7樓: | >>參與討論 |
作者: eyuge2 于 2005/1/27 8:30:00 發(fā)布:
cf100老師,繼續(xù)哦! cf100老師可否再將下面的話考證一下,好人做到底嘛! 避免在中斷內進行數(shù)學運算。數(shù)學運算將很有可能用到庫函數(shù)和許多中間變量,就 算不出現(xiàn)遞歸調用的問題,光在中斷入口和出口處為了保護和恢復這些中間臨時變 量就需要大量的開銷,嚴重影響中斷服務的效率。 |
8樓: | >>參與討論 |
作者: cf100 于 2005/1/27 17:21:00 發(fā)布:
繼續(xù)討論PICC保護現(xiàn)場的問題 以下這段話表達的意思也不很貼切: 光在中斷入口和出口處為了保護和恢復這些中間臨時變 量就需要大量的開銷,嚴重影響中斷服務的效率。 其實,在PICC中,對中斷中使用的臨時變量,為了防止重入或覆蓋,干脆就是中斷專用。 在我們的PICC編程中,臨時變量(或者說局部變量),都有其生存期,在生存期結束后,可被覆蓋。 但中斷函數(shù)中使用到的臨時變量卻與一般概念上的臨時變量有很大的區(qū)別。中斷函數(shù)中使用到的臨時變量和中斷函數(shù)中不使用到的臨時變量不能占用同一地址。換言之,中斷和非中斷的臨時變量地址不得重疊。 看一下下面的例程:(16F877A) #include "pic.h" unsigned CHAR i,j,k; void fn1(void) { unsigned CHAR s1[40]; s1[0]=1; } void interrupt SAMPLE (void) { unsigned CHAR s2[50]; s2[0]=1; fn1(); } void main(void) { } 說明:i,j,k-----三個全局變量 s1[40]----40個中斷調用使用的臨時變量 s2[50]----50個中斷中使用的臨時變量 保護W、STATUS和PCLATH用去三個內存變量 從上面程序中可以看出,BANK0資源已經耗盡。50+40+3+3=96。 由于中斷使用了93個RAM,這樣中斷以外就沒有可以使用的臨時變量了。也就是說中斷使用的臨時變量將不會被重入。 再看一下下面的例子: #include "pic.h" unsigned CHAR i,j,k; void fn1(void) { unsigned CHAR s1[20]; s1[0]=1; } void fn2(void) { unsigned CHAR s3[20]; s3[0]=1; } void interrupt SAMPLE (void) { unsigned CHAR s2[50]; s2[0]=1; fn1(); } void main(void) { fn2(); } 說明:i,j,k-----三個全局變量 s1[20]----20個中斷調用使用的臨時變量 s2[50]----50個中斷中使用的臨時變量 s3[20]----20個非中斷使用的臨時變量 保護W、STATUS和PCLATH用去三個內存變量 從上面的例子中也可以看出,中斷使用的臨時變量和中斷外使用的臨時變量不可重疊。 eyuge2兄所說的PICC自動保護現(xiàn)場,其實就是PICC對中斷中使用的臨時變量實施“禁入”。也就是,中斷內可實施中斷內臨時變量覆蓋;中斷外的臨時變量也可進行覆蓋;但中斷內外之間的臨時變量不可相互覆蓋。 當然為了防止重入,中斷中使用的函數(shù)不可在中斷外被調用。(PICC可自動實施重入檢查。) |
9樓: | >>參與討論 |
作者: eyuge2 于 2005/1/28 17:43:00 發(fā)布:
非常感謝cf100老師 謝謝。 picc中自動變量可以相互重疊,但是必須保證定義這些自動變量的函數(shù)不能同時調用。中斷函數(shù)可以被看作是用比較特殊的函數(shù),它可能在任何時候被調用,從而可能發(fā)生“嵌套”,形成同時調用。故中斷函數(shù)中的自動變量和其他函數(shù)中的自動變量是不能重疊的。中斷中使用的函數(shù)不可在中斷外被調用,同樣也是這個道理,因為會產生“遞歸”。不知理解的是否正確? cf100老師關于你闡述的東東是否有參考書目之類的東西推薦? |
10樓: | >>參與討論 |
作者: cf100 于 2005/1/28 18:11:00 發(fā)布:
eyuge2 兄說的就是這個道理 因為PIC的特殊性,不許重入,所以和別的C編譯器就有很大的區(qū)別。 也沒什么參考書目可看的,不過PICC的自動保護功能還是夠全的,足以保證程序不發(fā)生重入。 |
11樓: | >>參與討論 |
作者: jiangl 于 2005/2/19 9:03:00 發(fā)布:
頂 支持 |
12樓: | >>參與討論 |
作者: fleas 于 2005/2/21 11:58:00 發(fā)布:
以前還真不知道不能重入這個概念 看來比較不方便啊 |
|
|
免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號 |