新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機通過定時器來實現多任務

        單片機通過定時器來實現多任務

        作者: 時間:2016-11-09 來源:網絡 收藏
        單片機系統中,有許多情況下需要等待某個事件的發生,來繼續下一步操作,如果有一個任務還好說,單片機可以無限等待事件的發生,但是如果單片機要處理多個事件時,這種系統一般不能實現,除非用中斷,對!用中斷,但是中斷源的數量是有限的,并且有很多中斷源是針對特殊用處,這樣能給我自由分配的中斷源就只有定時器中斷和外部中斷,如果僅使用這幾個中斷源來實現異步,這樣可實現的異步事件時非常有限的,每個中斷源完成一個異步事件,效率是相當低,大大降低了系統的性能,降低了定時器的利用率.

        因此在這里我考慮使用定時器中斷來實現多個事件的異步,一個定時器如何實現多個任務的并發?

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

        在這里使用一個任務一個計數器,根據任務實時性的強弱,來設計任務計數器的計數溢出值,每個任務的變量通過一個全局結構體來定義,當然這個結構體必須包括這個計數溢出值。每到一個定時器中斷,各個任務計數器都加一,然后檢查計數器是否溢出,如果計數溢出就執行相應的任務,同時將此任務的計數器值清零,,如果溢出執行相應的任務,如果沒有,則此任務就不執行!但一定要注意在中斷程序,千萬不能有死循環,如果有等待一定要進行超時檢測,來避免死機!

        這里舉個例子,剛剛成思路,因此寫的不是很好!這個程序使用一個4連體數碼管顯示從DS18B20中采集的溫度值,4位連體數碼管當然只能使用動態掃描方法來顯示數據,并且這個動態掃描不能在主程序中執行,因為在主程序動態掃描效果很容易收到中斷程序的影響,而使顯示效果下降,因此必須使用定時器來控制延時實現動態掃描,但是ds18b20的讀寫時序對延時的精度要求也是相當高的,如果在主程序中,中斷程序造成的延時必然會對ds18b20采集數據的延時精確度造成干擾,而不能采集正確的數據!因此DS18b20采集數據的程序也不能夠放在主程序中,當然我們可以使用兩個定時器來實現!這里我們使用一個定時器來實現,由于DS18B20溫度轉換時間比較長12位精度的溫度轉換需要接近1秒的時間,這對動態掃描是無法容忍的,可行的辦法是將啟動轉換,讀取溫度值放在同一個中斷的不同狀態,也就是在任務中實現狀態機,從而避免了在中斷中出現長時間的等待,而影響系統的性能!以下中斷函數的具體實現:

        void interrupt main_int()
        {
        //t0_int(&data) ;
        uchar tl ,th ;
        uint temp ;
        if(T0IF)
        {
        T0IF=0 ;
        (ds.count)++ ;
        if(ds.count==80)
        {
        ds.count=0 ;
        switch(ds.state)
        {
        case 0 :
        ds.state=1 ;
        init_ds18b20() ;
        write_ds18b20(ROM_SKIP) ;
        write_ds18b20(MEM_CONVERT) ;
        break ;
        case 1 :
        init_ds18b20() ;
        write_ds18b20(ROM_SKIP) ;
        write_ds18b20(MEM_READ) ;
        tl=read_ds18b20() ;
        th=read_ds18b20() ;
        if(!(th&0xf0))
        {
        th=th&0x07 ;
        temp=th*256+tl ;
        ds.data=temp/16 ;
        }
        else
        {th=th&0x07 ;
        temp=th*256+tl ;
        ds.data=temp/16 ;
        }
        ds.state=0 ;
        break ;
        default :
        ds.state=0 ;
        break ;
        }
        }
        int_display1(ds.data) ;
        TMR0=210 ;
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 孟津县| 安吉县| 普格县| 卢龙县| 秀山| 中卫市| 新龙县| 南宫市| 沂南县| 苗栗县| 岫岩| 牡丹江市| 隆安县| 宜宾市| 黄龙县| 隆林| 洛隆县| 称多县| 镇康县| 耒阳市| 彭泽县| 固阳县| 正安县| 兴宁市| 渝北区| 宁乡县| 林口县| 临夏县| 十堰市| 湟中县| 上栗县| 定日县| 军事| 永嘉县| 梁山县| 河池市| 邳州市| 蓝山县| 陆川县| 阿拉尔市| 育儿|