基于μC/OS-II的Modbus協(xié)議測(cè)試系統(tǒng)
3 軟件設(shè)計(jì)
μC/OS-II下應(yīng)用程序設(shè)計(jì)主要是根據(jù)系統(tǒng)的功能需要?jiǎng)澐植煌娜蝿?wù)和中斷,并為每個(gè) 任務(wù)分配不同的優(yōu)先級(jí)。一個(gè)任務(wù)通常是一個(gè)無限的循環(huán),看起來像其它C的函數(shù)一樣,有 函數(shù)返回類型,有形式參數(shù)變量,但任務(wù)是決不會(huì)返回的,因此返回參數(shù)類型必須定義為 void。為了使μC/OS-II能管理用戶任務(wù),用戶必須在建立一個(gè)任務(wù)的時(shí)候,將任務(wù)的起始地 址與其它參數(shù)一起傳給OSTaskCreate()或OSTaskCreateExt()。
中斷和任務(wù)以及任務(wù)與任務(wù)之間的同步可通過信號(hào)量實(shí)現(xiàn)。下面以Modbus協(xié)議測(cè)試程 序中RTU模式下字符時(shí)間間隔的測(cè)量為例介紹μC/OS-II程序設(shè)計(jì)中任務(wù)和中斷的劃分。 Modbus的RTU模式中規(guī)定[3]:RTU模式下必須以連續(xù)的字符流發(fā)送整個(gè)報(bào)文幀,同一個(gè) 幀中兩個(gè)字符之間的空閑時(shí)間Δt不能大于1.5個(gè)字符時(shí)間(稱為t1.5),否則就認(rèn)為報(bào)文幀不完 整;不同報(bào)文幀之間需要時(shí)長至少為3.5個(gè)字符的空閑時(shí)間,這個(gè)時(shí)間區(qū)間被稱為t3.5。RTU 模式下的信息幀如圖2所示。
圖2 RTU模式的信息幀
為了記錄RTU 幀中一個(gè)字符結(jié)束時(shí)間和另一個(gè)字符的起始時(shí)間,系統(tǒng)分別使用串口中 斷Uart_ISR 和IO 中斷PE24_ISR 分別對(duì)這兩個(gè)時(shí)刻進(jìn)行捕捉。這需要將HMS30C7202 的串 口中斷時(shí)機(jī)設(shè)置為接收完一個(gè)字符后,將通用I/O 端口線PE24 設(shè)為允許中斷、下降沿觸發(fā)。
為了縮短關(guān)中斷時(shí)間和中斷處理時(shí)間,可將中斷的處理放在任務(wù)中進(jìn)行。在主任務(wù)中調(diào) 用OSTaskCreate函數(shù)分別建立串口接收處理任務(wù)Uart_Task和IO口處理任務(wù)PE24_Task。在 μC/OS-II中,有一個(gè)全局的系統(tǒng)時(shí)鐘,維護(hù)著一個(gè)全局時(shí)間變量。在Uart_Task和PE24_Task這兩個(gè)任務(wù)中分別通過讀取當(dāng)前全局時(shí)間變量來實(shí)現(xiàn)對(duì)字符起始時(shí)間和結(jié)束時(shí)間的連續(xù)測(cè) 量。系統(tǒng)利用μC/OS-II中信號(hào)量機(jī)制實(shí)現(xiàn)中斷與任務(wù)之間的同步[3][4],信號(hào)量必須在系統(tǒng)啟 動(dòng)的時(shí)候初始化,利用信號(hào)量實(shí)現(xiàn)任務(wù)與中斷同步的過程如圖3所示。
圖 3 利用信號(hào)量實(shí)現(xiàn)任務(wù)與中斷同步
評(píng)論