新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > PIC C延時函數和循環體優化

        PIC C延時函數和循環體優化

        作者: 時間:2016-11-13 來源:網絡 收藏
        PIC C延時函數循環體優化

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

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

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

        一般的我們都用

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

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

        來寫一個延時函數。

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

        可以看看編譯后的匯編:

        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)。注意其中循環周期是X-1是99個。

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

        建議設計一個char類型的循環體,然后再用一個循環體來調用它,可以實現精確的長時間的延時。

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

        void delay(char x,char y){

        char z;

        do{

        z=y;

        do{;}while(--z);

        }while(--x);

        }

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

        如果再加上函數調用的call指令、頁面設定、傳遞參數花掉的7個指令。

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

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

        void delay(){

        unsigned int d=1000;

        while(--d){;}

        }

        此函數在4M晶體下產生10003us的延時,也就是10MS。

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

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

        現在看看編譯它的匯編代碼:

        bcf 3,5

        bcf 3,6

        movlw 10

        movwf _delay

        l2

        decf _delay

        incfsz _delay,w

        goto l2

        return

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

        再談談這樣的語句:

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

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

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

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



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 江阴市| 关岭| 股票| 察哈| 庆云县| 安泽县| 镇安县| 宾川县| 友谊县| 普兰县| 丹凤县| 莎车县| 若羌县| 五常市| 山西省| 保定市| 肃宁县| 达日县| 新营市| 晋中市| 桑日县| 新津县| 阿坝县| 兖州市| 邵东县| 清新县| 安乡县| 额济纳旗| 柯坪县| 安多县| 合阳县| 吴堡县| 铁力市| 察哈| 四平市| 岚皋县| 博野县| 固安县| 遂平县| 凌云县| 和田县|