在线看毛片网站电影-亚洲国产欧美日韩精品一区二区三区,国产欧美乱夫不卡无乱码,国产精品欧美久久久天天影视,精品一区二区三区视频在线观看,亚洲国产精品人成乱码天天看,日韩久久久一区,91精品国产91免费

<menu id="6qfwx"><li id="6qfwx"></li></menu>
    1. <menu id="6qfwx"><dl id="6qfwx"></dl></menu>

      <label id="6qfwx"><ol id="6qfwx"></ol></label><menu id="6qfwx"></menu><object id="6qfwx"><strike id="6qfwx"><noscript id="6qfwx"></noscript></strike></object>
        1. <center id="6qfwx"><dl id="6qfwx"></dl></center>

            新聞中心

            EEPW首頁 > 嵌入式系統(tǒng) > 設計應用 > PIC C延時函數(shù)和循環(huán)體優(yōu)化

            PIC C延時函數(shù)和循環(huán)體優(yōu)化

            作者: 時間:2016-11-13 來源:網(wǎng)絡 收藏
            PIC C延時函數(shù)循環(huán)體優(yōu)化

            很多朋友說C中不能精確控制延時時間,不能象匯編那樣直觀。

            本文引用地址:http://www.biyoush.com/article/201611/316230.htm

            其實不然,對延時函數(shù)深入了解一下就能設計出一個理想的框價出來。

            一般的我們都用

            for(x=100;--x;){;}此句等同與x=100;while(--x){;};

            或for(x=0;x<100;x++){;}

            來寫一個延時函數(shù)。

            在這里要特別注意:X=100,并不表示只運行100個指令時間就跳出循環(huán)。

            可以看看編譯后的匯編:

            x=100;while(--x){;}

            匯編后:

            movlw 100

            bcf 3,5

            bcf 3,6

            movwf_delay

            l2 decfsz _delay

            goto l2

            return

            從代碼可以看出總的指令是是303個,其公式是8+3*(X-1)。注意其中循環(huán)周期是X-1是99個。

            這里總結(jié)的是x為char類型的循環(huán)體,當x為int時候,其中受X值的影響較大。

            建議設計一個char類型的循環(huán)體,然后再用一個循環(huán)體來調(diào)用它,可以實現(xiàn)精確的長時間的延時。

            下面給出一個能精確控制延時的函數(shù),此函數(shù)的匯編代碼是最簡潔、最能精確控制指令時間的:

            void delay(char x,char y){

            char z;

            do{

            z=y;

            do{;}while(--z);

            }while(--x);

            }

            其指令時間為:7+(3*(Y-1)+7)*(X-1)

            如果再加上函數(shù)調(diào)用的call指令、頁面設定、傳遞參數(shù)花掉的7個指令。

            則是:14+(3*(Y-1)+7)*(X-1)。

            如果要求不是特別嚴格的延時,可以用這個函數(shù):

            void delay(){

            unsigned int d=1000;

            while(--d){;}

            }

            此函數(shù)在4M晶體下產(chǎn)生10003us的延時,也就是10MS。

            如果把D改成2000,則是20003us,以此類推。

            有朋友不明白,為什么不用while(x--)后減量,來控制設定X值是多少就循環(huán)多少周期呢?

            現(xiàn)在看看編譯它的匯編代碼:

            bcf 3,5

            bcf 3,6

            movlw 10

            movwf _delay

            l2

            decf _delay

            incfsz _delay,w

            goto l2

            return

            可以看出循環(huán)體中多了一條指令,不簡潔。所以在PICC中最好用前減量來控制循環(huán)體。

            再談談這樣的語句:

            for(x=100;--x;){;}和for(x=0;x<100;x++){;}

            從字面上看2者意思一樣,但可以通過匯編查看代碼。后者代碼雍長,而前者就很好的匯編出了簡潔的代碼。

            所以在PICC中最好用前者的形式來寫循環(huán)體,好的C編譯器會自動把增量循環(huán)化為減量循環(huán)。因為這是由處理器硬件特性決定的。

            PIC并不是一個很智能的C編譯器,所以還是人腦才是第一的,掌握一些經(jīng)驗對寫出高效,簡潔的代碼是有好處的。



            評論


            技術專區(qū)

            關閉