AT91RM9200平臺的輔助時鐘研究
在VxWorlks中,定時器機制的實現(xiàn)是建立在時鐘基礎(chǔ)之上的??筛鶕?jù)不同的要求選用不同的定時機制,如taskDelay()、WatchDog、輔助時鐘。前兩種定時都是基于系統(tǒng)時鐘的。
taskDelay()是最簡單的延時方法。它的單位是tick,所以其延時精度并不高,但對于延時10 ms以上的系統(tǒng)足夠了。利用taskDelay(),可以將調(diào)用的任務從就緒態(tài)轉(zhuǎn)到睡眠態(tài),但是不能用于中斷服務程序中。另外,可以通過調(diào)用taskDelay(0),將CPU交給系統(tǒng)中其他相同優(yōu)先級的任務。
看門狗定時器作為系統(tǒng)時鐘中斷服務程序的一部分來維護。因此,與看門狗定時器相聯(lián)系的函數(shù)運行在系統(tǒng)時鐘中斷級,延時單位為tick。如果應用程序需要多個看門狗函數(shù),則可使用wdCreate()為每個需求產(chǎn)生獨立的看門狗ID,因為對于給定的看門狗ID,只有最近的wdStart()有效。利用看門狗定時器,調(diào)用的任務不會被阻塞,因為wdStart()調(diào)用是立即返回的。但它也一般只適用于延時10ms以上的系統(tǒng)。
如果在實際時需要更高精度的定時(如1 ms),那么采用輔助時鐘就是非??扇〉囊环N方法。一般在VxWorks系統(tǒng)的BSP中,都沒有配置輔助時鐘,本文詳細介紹輔助時鐘的配置及使用方法,以便在實際中靈活運用。
1 AT91RM9200工業(yè)平臺的時鐘和定時器
本文的研究是基于AT91RM9200工業(yè)平臺的,因此首先需要對此平臺下的時鐘及定時器進行介紹。
AT91RM9200提供了2個3通道16位定時器/計數(shù)器(TC)。3個通道雖然獨立,但操作相同,每個通道均為用戶可配置,包括3個外部時鐘輸入(XC0、XCl或XC2),5個內(nèi)部時鐘輸入(TIMER_CLOCKl、TIMER_CLOCK2、TIMER CLOCK3、TIMER_CL0CK4、TIMER_CLOCK5),以及2個可由用戶配置的多功能輸入/輸出信號。另外,每個通道可工作在兩種不同模式下,即捕獲模式和波形模式。其中,捕獲模式提供信號測量,波形模式用來產(chǎn)生波形,可由TC通道模式寄存器的WAVE位編程設(shè)定。定時器/計數(shù)器框圖如圖1所示。
其中,如果選擇通道信號時,XCO、XCl、XC2表示3個外部時鐘輸入;TIOA、TIOB表示作用于每個通道的2個多功能輸入/輸出信號;INT表示中斷信號輸出;SYNC表示同步輸入信號。如果選擇塊信號時,TCLKO、TCLKl、TCLK2表示3個外部時鐘輸入;TIOAO~TIOA2,表示通道0~2的TIOA信號,TIOB0~TIOB2表示通道0~2的TI0B信號。
其中,5個內(nèi)部時鐘輸入與主時鐘(MCK)、慢速時鐘(SLCK)及主時鐘分頻后時鐘相關(guān),如表1所列。
2 在VxWorks中輔助時鐘的配置
在VxWorks操作系統(tǒng)中如果要使用輔助時鐘,必須經(jīng)過一定的配置才能使用。首先,需要在Vxworks組件或config.h中進行定義:
#define INCLUDE_AUX_CLK
如果不定義,那么輔助時鐘是無法使用的。另外,在sysLib.C的sysHwlnit2函數(shù)中需要進行輔助時鐘的初始化,即中斷連接配置:
(void)intConnect(AUX_TIMER_INT_VEC,sysAuxClkInt,O)
輔助時鐘和系統(tǒng)時鐘的區(qū)別是:輔助時鐘必須由用戶提供ISR,但不允許在ISR中調(diào)用tickAnnounce(),否則會擾亂系統(tǒng)時鐘的機制。
輔助時鐘的配置可以按照installDir/target/drv/tim—er/templateTimer.C中的函數(shù)模板來進行修改,在本文中使用的驅(qū)動程序是At91Rm9200timer.c,頭文件為At91Rm9200timer.h。在此文件中進行的修改需要根據(jù)所依賴的具體芯片來進行,即需要參考AT91RM9200芯片數(shù)據(jù)手冊。
與輔助時鐘相關(guān)的函數(shù)有:sysAuxClkInt()、sysAux—ClkConnect()、sysAuxClkDisable()、sysAuxClkEnable()、sysAuxClkRateGet()和sysAuxClkRateSet()。其中,sysAuxClkRateGet()可以和sysAuxClkRateSet()視為一組。sysAuxClkRateGet()是通過sysAuxClkRateSet()函數(shù)設(shè)定的時鐘頻率進行讀取的,而sysAuxClkRateSet()函數(shù)中時鐘頻率的設(shè)定則受AUX_CLK_RATE_MIN和AUX_CLK_RATE_MAX的限制。這個最大值和最小值需要進行定義,定義的位置可能不同,有的放在eonfig.h中,有的放在bsp.h中,本文的最大值和最小值放在Inte—grator.h中定義。接下來需要重點討論的是sysAux-ClkInt()和sysAuxClkEnabel()這兩個函數(shù)。
sysAuxClkInt()函數(shù)調(diào)用用戶定義的中斷處理函數(shù),而用戶調(diào)用的中斷處理函數(shù)是由sysAuxClkConnect()函數(shù)來連接的。在調(diào)用中斷處理函數(shù)之前,一定要先進行清除中斷操作,如:
AMBA_TIMER_READ(AMBA_TIMER_T2SR(AMBA_TIMER_BASE),temp);
不然,CPU將一直陷入中斷,不能做別的事情了。
其他大量的工作都是放在sysAuxClkEnble()函數(shù)中進行的。根據(jù)AT91RM9200的具體情況,選擇5個內(nèi)部時鐘的其中之一,在此選擇TIMER_CLOCK2;根據(jù)前面所提到的通道概念,選取第2個通道。必須和系統(tǒng)時鐘區(qū)分開,不能同時選擇一個內(nèi)部時鐘和同一個通道。
首先,需要判斷電源管理對輔助時鐘是否進行了配置,可以查看相關(guān)文件。如果沒有進行配置,則需要如進行如下配置:
AT9l_SYS→PMC_PCER=l<<AT9lC_ID_TCl;
其次,必須先對AIC編程,再配置TC。
然后,需要對具體的寄存器進行控制操作,首先需要選擇內(nèi)部時鐘,如圖2所示。
對通道模式寄存器進行控制:
AMBA_TIMER_WRITE(AMBA_TIMER_T2MR(AMBA_TIMER_BASE),TIMER_CLOCK2| TC_CPCTRG);
通過TCCLKS位選擇第2個內(nèi)部時鐘,并根據(jù)寫入RC寄存器的定時器值進行RC比較觸發(fā)使能。同時,需要對TC通道控制寄存器進行控制,寫入計數(shù)器時鐘使能命令和軟件觸發(fā)命令,如:
AMBA_TIMER_WRITE(AMBA_TIMER_T2CR(AMBA_TIMER_BASE),TC_CLKEN);
AMBA_TIMER_WRITE(AMBA_TIMER_T2CR(AMBA_TIMER_BASE),TC_SWTRG);
另外,由于采用RC寄存器觸發(fā)使能,因此還需要對TC中斷使能寄存器進行控制,寫入RC比較中斷使能信號,如:
AMBA_TIMER_WRITE(AMBA_TIMER_T2IER(AMBA_TIMER_BASE),TC_CPCS);
最后,需要執(zhí)行中斷使能操作,如:
AMBA_TIMER_INT_ENABLE(AUX_TIMER_INT_LVL);
一切配置好后,重新編譯bootroFll和VxWorks鏡像,啟動VxWorks鏡像;然后編寫測試程序進行測試,驗證輔助時鐘是否配置成功。另外,可以通過邏輯分析儀查看輔助時鐘的中斷情況。輔助時鐘驅(qū)動后,在應用程序中可以用sysAuxClkRateSet()函數(shù)動態(tài)設(shè)置系統(tǒng)輔助時鐘每秒的中斷數(shù);sysAuxClkConnect()函數(shù)為系統(tǒng)輔助時鐘中斷指定ISR,并且由sysAuxClkEnable()函數(shù)使能時鐘中斷,去調(diào)用指定的ISR。
結(jié) 語
VxWorks提供系統(tǒng)輔助時鐘機制的主要目的,是使用戶在系統(tǒng)時鐘之外多一種定時資源選擇,并提供了管理手段。另外,VxWorks的某些輔助調(diào)試工具也可能要求使用系統(tǒng)輔助時鐘。
輔助時鐘的使用是通過提高節(jié)拍率來實現(xiàn)的,而提高節(jié)拍率意味著時鐘中斷產(chǎn)生得更加頻繁,所以中斷處理程序也會更頻繁地執(zhí)行。如此一來會給整個系統(tǒng)帶來如下好處:
①更高的時鐘中斷解析度(resolution)可提高時間驅(qū)動事件的解析度;
②提高了時間驅(qū)動事件的準確度(accuracy)。