<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 單片機程序設計中運用事件驅動(dòng)機制

單片機程序設計中運用事件驅動(dòng)機制

作者: 時(shí)間:2012-03-08 來(lái)源:網(wǎng)絡(luò ) 收藏

1 傳統程序開(kāi)發(fā)的不足

在傳統的程序中,通常是以“過(guò)程”和“操作”為中心的結構,程序按規定的過(guò)程順序地執行,與外設的連接一般采用中斷方式,在中斷服務(wù)程序中完成外設的全部處理工作,主程序一般是初始化系統并等待中斷的發(fā)生。這種結構成熟、易于理解,但有如下不足:

(1)受性能的限制,容易造成系統對其它中斷的響應變得遲緩,特別是對于中斷源較多、中斷處理耗時(shí)較多的系統(如:LED顯示、鍵盤(pán)掃描等);

(2)中斷服務(wù)程序過(guò)長(cháng),在中斷服務(wù)期間系統無(wú)法響應同級的中斷;

(3)可能導致代碼重入,增大堆棧開(kāi)銷(xiāo),造成難以預料的結果;

(4)程序調試時(shí),花在各模塊定時(shí)協(xié)調方面的時(shí)間、精力隨系統的復雜程序大幅增加。

如果在編寫(xiě)單片機程序時(shí),引入Windows程序中的機制,把中斷響應與事件處理程序分離,中斷服務(wù)程序的任務(wù)只是產(chǎn)生一個(gè)中斷發(fā)生的標志,而事件處理則由處理程序來(lái)完成,主程序則負責判斷標志和調度處理程序。這樣,可大幅縮短中斷服務(wù)程序的長(cháng)度,減少斷服務(wù)程序的耗時(shí),提高系統對多中斷的響應能力,從而較好地解決上述矛盾。

2 Windows的機制

在Windosw 系統中,程序的設計圍繞來(lái)進(jìn)行。當對象有相關(guān)的事件發(fā)生時(shí)(如按下鼠標鍵),對象產(chǎn)生一條特定的標識事件發(fā)生的消息,消息被送入消息隊列,或不進(jìn)入隊列而直接發(fā)送給處理對象,主程序負責組織消息隊列,將消息發(fā)送給相應的處理程序,使相應的處理程序執行相應的動(dòng)作,做完相應的處理后將控制權交還給主程序。

在這種機制中,對象的請求僅僅是向隊列中添加相應的消息,耗時(shí)的處理則被分離給處理函數。這種結構的程序中各功能模塊界限分明,便于擴充,能充分利用CPU的處理能力,使系統對外界響應準確而及時(shí)。

3 事件驅動(dòng)的單片機

與Windows 系統相比,單片機的資源非常有限,因此,單片機程序中的事件驅動(dòng)機制只能采取一種簡(jiǎn)化的方式。當某個(gè)中斷發(fā)生時(shí),中斷服務(wù)程序設置相應的標志,不同的標導代表不同的中斷發(fā)生的消息,而主程序不斷地判別這些標志,以決定啟動(dòng)哪一個(gè)處理函數。相應的處理函數被啟動(dòng)處理完相關(guān)的任務(wù)后,清除此標志,然后把控制權交還給主程序。采用這種機制,可合理地利用有限資源,使程序調試的工作量大幅下降。對于延時(shí)、定時(shí)處理(如LED顯示、鍵盤(pán)掃描等),更可方便地使用一定時(shí)器來(lái)完成延時(shí)、定時(shí)的任務(wù),從而把CPU從這種耗時(shí)的任務(wù)中解放出來(lái),確保系統對多中斷有足夠的響應能力。

本文以一IC卡讀寫(xiě)機為例,說(shuō)明事件驅動(dòng)機制在單片機中的具體應用。

3.1 硬件結構

本系統以ATMEL公司的89C51為核心(如圖1)。89C51價(jià)格低廉,性能較好,片內有4KB 的可擦寫(xiě)程序存儲器,可滿(mǎn)足本系統的要求。為簡(jiǎn)化硬件結構及系統能耗,鍵盤(pán)采用軟件掃描的矩陣鍵盤(pán)。LED顯示采用段位動(dòng)態(tài)掃描,在任一時(shí)刻LED中最多只有一段被點(diǎn)亮。具體是在位選信號送某位LED的公共極時(shí),每隔一個(gè)時(shí)間片依次輸出該位LED的段碼(含小數點(diǎn)),輸出完成一位后,再逐閃輸出下一位。從第一位至第N位LED依次分成8×N個(gè)時(shí)間片循環(huán)掃描顯示。串口UART作為系統與外部數據通信的通道,IC卡的讀寫(xiě)由MCU模擬I2C協(xié)議來(lái)實(shí)現。

3.2 事件驅動(dòng)機制的單片機

中斷申請標志

在系統中定義一個(gè)可位尋址的單元,在此把它命名為Message_Flag,用來(lái)記錄描述中斷事件發(fā)生的情況。各位的定義如下:

*Message_Flag中某位為1表示當前有相應的事件發(fā)生,為0則當有沒(méi)有相應的事件發(fā)生。


上一頁(yè) 1 2 3 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>