最新免费av在线观看,亚洲综合一区成人在线,中文字幕精品无码一区二区三区,中文人妻av高清一区二区,中文字幕乱偷无码av先锋

登錄 免費注冊 首頁 | 行業(yè)黑名單 | 幫助
維庫電子市場網
技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng)
驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產業(yè) | CAN-bus/DeviceNe

舉例說明PICC是如何保護現(xiàn)場的

作者:cf100 欄目:單片機
舉例說明PICC是如何保護現(xiàn)場的

大家來看一下具體的例子,用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
看來CF100花了不少工夫,加褲!
 
3樓: >>參與討論
手扶拖拉機
頂!
    這個論壇要是每個人都能如cf100一樣總結一些東西,就不怕大家的水平上不去!

4樓: >>參與討論
eyuge2
謝謝
感謝cf100的幫助。
你精英聯(lián)盟中給我回復時引用的一段摘自PICC說明書的話,這個PICC說明書好像版本比較特別哦,不是張明峰的,也不是偉福的,能不能拿出來共享一下?

5樓: >>參與討論
mikezhong
CF100大俠也!
CF100大俠也!

摘自的就是張明峰的斷落。

6樓: >>參與討論
笨蛋不笨
敬業(yè)!!
 
7樓: >>參與討論
eyuge2
cf100老師,繼續(xù)哦!
cf100老師可否再將下面的話考證一下,好人做到底嘛!

避免在中斷內進行數(shù)學運算。數(shù)學運算將很有可能用到庫函數(shù)和許多中間變量,就
算不出現(xiàn)遞歸調用的問題,光在中斷入口和出口處為了保護和恢復這些中間臨時變
量就需要大量的開銷,嚴重影響中斷服務的效率。

8樓: >>參與討論
cf100
繼續(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
非常感謝cf100老師
謝謝。
picc中自動變量可以相互重疊,但是必須保證定義這些自動變量的函數(shù)不能同時調用。中斷函數(shù)可以被看作是用比較特殊的函數(shù),它可能在任何時候被調用,從而可能發(fā)生“嵌套”,形成同時調用。故中斷函數(shù)中的自動變量和其他函數(shù)中的自動變量是不能重疊的。中斷中使用的函數(shù)不可在中斷外被調用,同樣也是這個道理,因為會產生“遞歸”。不知理解的是否正確?
cf100老師關于你闡述的東東是否有參考書目之類的東西推薦?

10樓: >>參與討論
cf100
eyuge2 兄說的就是這個道理
因為PIC的特殊性,不許重入,所以和別的C編譯器就有很大的區(qū)別。
也沒什么參考書目可看的,不過PICC的自動保護功能還是夠全的,足以保證程序不發(fā)生重入。

11樓: >>參與討論
jiangl

支持

12樓: >>參與討論
fleas
以前還真不知道不能重入這個概念
看來比較不方便啊

參與討論
昵稱:
討論內容:
 
 
相關帖子
如何預留ROM空間?
請問lin總線上從機怎么捕捉同步信號
沒用過PIC的片子,  直接用PIC18F..可以嗎?(設計汽車倒車雷達)
12F675芯片的IO要作普通口如何設置?
關于滾動碼
免費注冊為維庫電子開發(fā)網會員,參與電子工程師社區(qū)討論,點此進入


Copyright © 1998-2006 www.udpf.com.cn 浙ICP證030469號