久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 5853|回復: 2
收起左側

MCU定時器實現多任務

[復制鏈接]
ID:77367 發表于 2015-4-19 02:20 | 顯示全部樓層 |閱讀模式
在單片機系統中,有許多情況下需要等待某個事件的發生,來繼續下一步操作,如果有一個任務還好說,單片機可以無限等待事件的發生,但是如果單片機要處理多個事件時,這種系統一般不能實現,除非用中斷,對!用中斷,但是中斷源的數量是有限的,并且有很多中斷源是針對特殊用處,這樣能給我自由分配的中斷源就只有定時器中斷和外部中斷,如果僅使用這幾個中斷源來實現異步,這樣可實現的異步事件時非常有限的,每個中斷源完成一個異步事件,效率是相當低,大大降低了系統的性能,降低了定時器的利用率.
因此在這里我考慮使用定時器中斷來實現多個事件的異步,一個定時器如何實現多個任務的并發?
在這里使用一個任務一個計數器,根據任務實時性的強弱,來設計任務計數器的計數溢出值,每個任務的變量通過一個全局結構體來定義,當然這個結構體必須包括這個計數溢出值。每到一個定時器中斷,各個任務計數器都加一,然后檢查計數器是否溢出,如果計數溢出就執行相應的任務,同時將此任務的計數器值清零,,如果溢出執行相應的任務,如果沒有,則此任務就不執行!但一定要注意在中斷程序,千萬不能有死循環,如果有等待一定要進行超時檢測,來避免死機!
這里舉個例子,剛剛成思路,因此寫的不是很好!這個程序使用一個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 ;
    }
}





回復

使用道具 舉報

ID:76944 發表于 2015-5-2 17:16 | 顯示全部樓層
沒有太明白
回復

使用道具 舉報

ID:109246 發表于 2016-6-23 10:42 | 顯示全部樓層
不是很懂哎,希望樓主描述詳細一點
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 在线看亚洲 | 久久国产日本 | 国产日韩欧美在线观看 | 精品在线一区 | 一区在线观看视频 | 91在线观看视频 | 中文字幕国产精品视频 | 日韩欧美在线不卡 | 免费视频一区 | 国产精品欧美一区二区三区不卡 | 久久婷婷色 | 日韩欧美精品 | 在线免费中文字幕 | 91免费看片 | 亚洲风情在线观看 | 日韩欧美天堂 | 欧美日韩黄色一级片 | 狠狠的操| 午夜精品久久久久久久久久久久久 | 91精品国产91久久久久久吃药 | 国产精品久久久久婷婷二区次 | 久久久人成影片免费观看 | 久久草在线视频 | 亚洲丝袜天堂 | 久久99精品久久久久久国产越南 | 一区二区三区亚洲 | 欧美8一10sex性hd | 精品欧美乱码久久久久久1区2区 | 久久久www成人免费无遮挡大片 | 成人精品一区二区 | 日韩精品一区二区三区免费视频 | 视频一区在线 | 国产成人在线播放 | 日日操日日舔 | 91久久久久 | 九色av | 日本一区二区不卡 | 精品美女视频在免费观看 | 黄色片网此 | 国产精品中文字幕在线 | 精品国产乱码久久久久久丨区2区 |